115

VR-Online (June 2010)

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: VR-Online (June 2010)
Page 2: VR-Online (June 2010)

Интро2

IntroПриветствую Вас, дорогие друзья!

Как же нам все­таки повезло, что многие мы родились именно в середине 80­х(90­х). А как же повезет, тем, кто родиться еще позже! Мы живем в векофигительных технологий и с если не каждый день, то каждый месяцпроисходят какие­то новые открытия, появляются умопомрачительныесервисы и просто куча всего интересного. Если вчера это было за граньюфантастики, то сегодня более, чем реально.

Те, кто начинал заниматься IT в конце девяностых, начала двухтысячных,должны меня понять. Как же приятно наблюдать глобальные изменения всвоем любимом деле. Вспоминаю, как еще лет пять назад я плевался отубогости почтовых web­интерфейсов и юзал TheBat. А сегодня я уже не могупредставить свою жизнь без продвинутого интерфейса Gmail ифункциональных гугл­доков. Многое изменилось... И изменилось в лучшуюсторону.

Технологии становятся дружелюбней по отношению к пользователю и вносят вжизнь приятные впечатления. Пользователи рады, а мы, ИТ­Специалисты ипрограммисты, получаем новую порцию наркотика под названием"Информация". Да, приходится употреблять его больше, но ведь в этом и кайф!Мозг постоянно прокачивает свой скил, доставляя моральное удовольствие иосознание того факта, что мы отличаемся от других.

Мы способны творить умопомрачительные вещи в виртуале! Красивый ифункциональный гаджет мы в первую очередь видим как крутость инженерноймысли; от ошибок в софте мы не паникуем, а ищем решение, заставляя«тупую» программу подчиниться и т.д. Цифровая жизнь и постоянный статус «вOnline» ­ это наш life style. Мы не такие как все, мы дети цифровой эры!Приятного чтения, мой друг!

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

Page 3: VR-Online (June 2010)

Содержание

СодержаниеИюнь 2010 (24)

IT-News

Hard-News

VrIP персона

1 0. Gagadget.com. Интервью с Павлом_ УрусовымКодинг

1 3. Delphi. Работа с указателями27. JavaScript. Сжатие данных30. Delphi. Подружим Си и Delphi36. Python. Auto forwarder for Joomla38. Python. Image grabbing40. Python. AutoUp v0.1b для форума­ "Амит"42. Ajax + PHP. Повышаем­ интерактивность45. С#. Самопальный диспетчер задач для_ Windows Mobile48. Delphi. Google API в Delphi51 . Delphi. Математические процедуры и­ функции56. Cracking. Реверсинг ASM KEYGENME #160. PHP. Библиотека мануалов

Я прусь

Обзоры от VR

65. Обзор Samsung i900

68. "Джоэл о программировании"69. Ubuntu и Debian Linux для_ продвинутых

Без рамки

70. TeX & LaTeX. Язык разметки74. Scribus. Записки начинающего_ верстальщика

Меня тошнит

Креатиff

79. "Я так люблю свою страну"93. "Песнь легиона". Часть 3

Безопасность

1 01 . I2P. Анонимная сетьПсихо

1 04. МанипуляцииШкола

1 06. Скачиваем файл из Интернета_ средствами С#Админинг

1 07. Unix. Именованые каналы и сокеты1 09. Поднимаем VPS. автоматизация_ обслуживания

Мнение VR

FAQ по FreeBSD

Идея проекта

Михаил Фленов akaHorrific

(http://flenov.info)

Верстка и оформление

Антон Козлов akaJimmy Jonezz

Дмитрий Редькин akazahod5277

Редакторы номера

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

Роман Костенко akaLord_of_Fear

Вопросы и предложения

mail@vr­[email protected]

Page 4: VR-Online (June 2010)

Бета версия SP1 для Windows 7 и Windows Server 2008 R2 ужедоступна

В начале июля софтверный гигант выплюнул тестовую версиюпервого большего обновления для Windows 7 (а также Win Server2008 R2) – Service Pack. Все желающие могут скачать апдейт софициального сайта компании. Прямой линк:http://technet.microsoft.com/ru­ru/evalcenter/ff183870.aspx.

IT­NewsНовости IT­индустрииВсе то, что нас удивляло и приводило в восторг в этом месяце

4

vr­online | июнь 2010

IT-News

Больше поддерживать не будем!

13 июля роковой день для старушки Windows XP SP2. С этого дня,компания MS прекращает ее поддержку. Больше никаких securityапдейтов для этой версии ОС не будет. Если ты все еще юзаешь SP2,то самое время обновиться до SP3, а еще лучше установить себе ОСсовременней. Поддержка Windows XP SP3 будет осуществляться до 8апреля 2014 года.Вот так надо устраивать масс-фоловинг

Bobbi Eden – порнозвезда и любительницафутбола. Во время разгара чемпионата мира онаопубликовала в своем микроблоге(http://twitter.com/BobbiEden/) интригующий твит –«Всем мужчинам, которые меня зафолофят, ясделаю минет». Звезда уточнила, что ей будутпомогать подруги по «работе» ­ vickyvette(http://twitter.com/vickyvette), misshybrid(http://twitter.com/misshybrid), gabbyquinteros(http://twitter.com/gabbyquinteros). Предложениене осталось незамеченным. Девушка за короткийвременной промежуток собрала более 75 тысячфоловеров.Разрешите представиться, Farman

8 – июля произошел долгожданный релиз популярного Linux­дистрибутива – Mandriva 2010 Spring. Кодовое название ОСFarman. Это поистине долгожданный релиз, т.к. последнеевремя над мандривой летали черные тучи – ухудшениефинансового положения, слухи о продаже, таинственноеспасение спонсорами и т.д. Сейчас у компании вроде всехорошо и выход очередной версии ОС лучшее томуподтверждение.Сколько стоит национальный поиск?

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

Подб

оркан

овосте

й:Игор

ьАнто

новaka

Spide

r_NET

Email:

antono

v.igor@

gmail.

com

Page 5: VR-Online (June 2010)

IT-News5

vr­online | июнь 2010

OpenSUSE 11 .3 готов к труду и обороне

Июль просто богат на релизы операционных linux­like систем.Сначала Mandriva, теперь вот и Novell порадовала своихпоклонников. 16 июля состоялся релиз OpenSUSE 11.3. Всежелающие могут загрузить новую версию ОС с официальногосайта opensuse.org и многочисленных трекеров. Обновленныйдистрибутив построен на базе ядра Linux 2.6.34. Изграфических оболочек присутствуют: Gnome 2.30.1, KDE 4.4.4 иXfct. Любители экстрима и всего нестабильного могут заюзатьтретью тестовую версию Gnome.Зона .РФ продолжает расти

Reg.RU сообщает, что к середине июля в национальной зоне .РФколичество зарегистрированных имен перевалило за 14 тысяч.Скоро количество доменов еще увеличится, т.к. начиная, с 15 июлястартует третий этап приоритетной регистрации.

И остались они у разбитого корыта

Все наслышаны созданием китайского интернет­фильтра –Green Dam. Теперь этот «полезный» проект остался безфинансирования. Компания Dazheng Language TechnologyAcademy (именно она занималась поддержкой GD) уже началасокращать штат сотрудников, работающих над разработкойфильтра. Будущее проекта пока неизвестно.Интернет кодекс

Ильзе Айгнер – немецкий министр по защите правпотребителей и просто находчивая женщина.Относительно недавно предложила создать такназываемый кодекс чести в интернете. По ее задумкекодекс должен включать 10 «золотых правил», созданные,самим интернет сообществом. От себя добавлю, что свиду это все жутко напоминает хакерский манифестМентора, написанный в 1986 году. Только будут ли еготакже уважать? Сомневаюсь. В инете сегодня тусуютсявсе: начиная от президента и заканчивая «васькой­гопником» из третьего подъезда. Глубоко сомневаюсь, чтопоследний будет тратить время на чтение каких­то«правил».FireFox – корпоративный стандарт для IBM

Компания IBM заявила, что FireFox стал официальным браузеромкомпании. Причиной перехода на FireFox стало соответствиебраузера отраслевым стандартам, а также безопасность иоткрытость.Игры от Google: Быть или не быть?

Журналисты издания TechCrunch сообщили, чтопоисковый гигант вложил крупненькую сумму денег(около $100­$200 млн) в компанию Zynga. Даннаякомпания занимается разработкой браузерных игр.Если это действительно так, то можно с уверенностьюсказать, что в скором времени мы будем играть вигрушки от корпорации зла.

(по сообщению «Газеты.ру»). Предполагается, что разработка поисковика завершится в2012 году.

Page 6: VR-Online (June 2010)

IT-News6

vr­online | июнь 2010

YouTube опять проапгрейдили

Представители портала YouTube объявили о поддержкевидеоразрешения 4K (4096). Для воспроизведения видео с такимразрешением требуется экран с диагональю в 7,62 дюйма. Толькопредставь, что видео в формате 1080p уместится на такомразмере больше 4­х раз! Эх, вот такой бы экран, да видео с такимразрешением у себя дома! Стоп. И еще бы дом соответствующихразмеров.Четвертый FireFox не за горами

В самом начале июля разработчики представили первуюбету четвертой версии FireFox. Среди значимых измененийнаиболее выделяются:­ в версии для Windows вкладки теперь размещаются всамой верхней части окна браузера;­ на Windows Vista и Windows 7 верхнее меню замененокнопкой «Firefox»;­ новый менеджер расширений;­ кнопка остановки загрузки страницы и кнопка обновлениястраницы были объединены в одну в версиях для Windows,Mac и Linux;

Office 201 0 шагает по стране

В нашей стране начались продажи новейшей версии пакета программMS Office. В зависимости от редакции, цена будет колебаться от 3050до 22070 рублей.

Сети от самоубийц

Тайваньский OEM­производитель электроники Foxconn натягиваетвозле общежитий рабочих – сети. Речь идет не о ЛВС, а самыхобычных сетях. За текущий год среди работников компании былозафиксировано двенадцать случаев попыток самоубийства, десятьиз которых закончились смертью. Причиной навязчивого желаниясвести счеты с жизнью стала – низкая заработная плата и тяжелыеусловия труда. Когда я впервые увидел новость, то сразу вспомнилфильмы о средневековье, где народ умирал от адской работы.Оказывается, такие времена прошли не до конца.

Page 7: VR-Online (June 2010)

Hard­NewsЖелезные новости

7

vr­online | июнь 2010

Hard-News

Новенький iPhone 4 от Apple

Этим летом в июне на WWDC 2010 в Сан­Франциско СтивДжобс (Steve Jobs) официально анонсировал выпусксмартфона Apple следующего поколения iPhone 4.Смартфон Apple iPhone 4 оснащается процессором A4 SoC(System­on­a­chip), содержит 3,5­дюймовый сенсорный IPSэкран с разрешением 960х640 точек (контрастность 800:1, 326точек на дюйм) и 16 или 32 ГБ флэш­памяти. Передняя изадняя панели устройства выполнены из алюминосиликатногостекла, которое также используется в вертолетах ивысокоскоростных поездах. По заверениям производителя,оно в 20 раз жестче и в 30 раз тверже, чем пластик. Шассикорпуса, выполняющее также функцию антенны, выполнено изспециальной нержавеющей стали, которая в пять раз прочнееобычной.

Первый процессор APU Fusion от AMD

Компания AMD провела на выставке Computex 2010 первуюпубличную демонстрацию процессора Fusion. Семейство устройствускоренной обработки (Accelerated Processing Units – APU) AMDFusion объединяет на одном кристалле вычислительные ядравысокопроизводительных последовательных вычислений, а такжеграфическое ядро параллельной обработки графики. В рамкахплатформы AMD Fusion первоначально запланирован выпуск двухсерий процессоров: Llano и Ontario. Такие чипы уже доступны в видеотдельных образцов, а их официальный релиз намечен на первыйквартал 2011 года. При этом отмечается, что процессоры Llanoизготавливаются по нормам 32­нанометрового технологическогопроцесса, содержат четыре вычислительных ядра и однографическое ядро, обладающее поддержкой DirectX 11. Такиемодели предназначены для применения в составе настольныхкомпьютеров.Утверждены спецификации Bluetooth 4.0

С ростом популярности различныхмобильных устройств потребность вскоростных и энергетически эффективныхбеспроводных интерфейсах не снижается.Лидером сегмента в этом смысле можнопризнать Bluetooth, поскольку он давноприжился в мобильных телефонах ипортативных компьютерах. В этом месяцеорганизация Bluetooth SIG объявила одоступности спецификаций Bluetooth 4.0разработчикам аппаратного обеспечения.Новая версия интерфейса сохраняетмаксимальную скорость передачиинформации на уровне 24 Мбит/с, но

снижает уровень энергопотребления иувеличивает максимальную дальностьпередачи информации до 100 метров.Разработчики утверждают, что отнынестанет возможным создание устройств,способных передавать информацию соскоростью 1 Мбит/с и питаться от плоскойбатареи размером с монету на протяженииодного года. Поддерживается шифрованиеданных по 128­разрядному алгоритму AES,задержки при передаче информации тожеснизились. По прогнозам аналитиков, к2015 году версия Bluetooth с пониженнымэнергопотреблением займёт до половинырынка беспроводных датчиков.

Подб

оркан

овосте

й:Ром

анКос

тенко

akaLor

d_of_fe

ar.e­m

ail:kos

tenko.

r.khv@

gmail.

com

Page 8: VR-Online (June 2010)

Hard-News8

vr­online | июнь 2010

Универсальные блоки питания для ноутбуков

Попытки унифицировать зарядные устройства для мобильныхтелефонов уже предпринимались, но пока об успехе этойинициативы говорить рано. Тайваньские производителимобильных компьютеров одобрительно высказались об идееунификации блоков питания для ноутбуков. Разрабатывающаястандарты в этой сфере организация IEEE недавносформировала рабочую группу, которая будет курировать этотвопрос.В поддержку идеи создания универсальных блоковпитания для ноутбуков выступили Acer, Asus, Quanta, Compal,Wistron, Pegatron и Inventec ­ последние пять компанийконтролируют львиную долю рынка контрактного производствамобильных компьютеров. Производители блоков питанияподобную инициативу воспринимают без энтузиазма, посколькуунификация блоков питания приведёт к падению объёмовпродаж их продукции. Один блок питания сможет пережитьнесколько ноутбуков, и пользователям не потребуется покупатьс каждым новым мобильным компьютером новый блок питания.Seagate предлагает внешний жёсткий диск объёмом 3 Тб

Пообещав представить до конца года винчестер объёмом три терабайта,компания Seagate сразу обозначила проблемы, которые предстоит решитьдо выхода подобных накопителей. Прежде всего, это неспособностьматеринских плат с классическим BIOS работать с винчестерами такогообъёма ­ необходим переход на EFI. Во­вторых, увидеть полный объёмтакого винчестера могут только 64­разрядные версии Windows Vista,Windows 7 и специальные версии Linux. Драйверы контроллеров RAIDтоже потребуют адаптации к накопителям такого объёма. Тем не менее,компания Seagate объявила о начале приёма заказов на внешнийвинчестер FreeAgent GoFlex объёмом 3 Тб. Сам накопитель стоит $249 иоснащается интерфейсом USB 2.0. Дополнительно винчестер может бытьоборудован док­станцией со следующим сочетанием интерфейсов: "USB2.0 + FireWire 800" ($49), "USB 3.0" ($39) или "USB 3.0 + интерфейснаякарта PCI Express x1" ($79). На док­станции предусмотрен светодиодныйиндикатор заполнения диска, устанавливать диск можно как вертикально,так и горизонтально.

Портативный накопитель Aegis Bio со сканером отпечатковпальцев

Калифорнийская компания Apricorn анонсировала выпуск новой моделипортативного накопителя Aegis Bio, который оснащается сканеромотпечатков пальцев для ограничения несанкционированного доступа кданным. Портативный накопитель Apricorn Aegis Bio содержит 2,5­дюймовый жесткий диск емкостью 6400 ГБ, который вращается соскоростью 5400 об/мин и оснащается кэш­буфером объемом 8 МБ.Новинка также содержит 16­точечный всенаправленный сенсор ударов.Портативный накопитель Apricorn Aegis Bio обеспечивает 128­битноеAES шифрование информации при помощи чипа Oxford Semiconductor.

Page 9: VR-Online (June 2010)

С чего начиналась история gagadget.com?Почему Вы решили создать проект,посвященный именно технике?Мы решили создать сайт о технике, потомучто это именно то, о чём мы умеем хорошописать. Я писал в техническую прессу с 2000года, а Сергей Митяев (читателям нашегосайта он известен под псевдонимомТехнослав Бергамот) — основатель и первыйглавный редактор журнала «СОТА». Мысли осоздании своего интернет­проекта меняначали посещать примерно в середине 2007года, поскольку мне надоела характернаядля большинства журналов ситуация, когдаредакционной политикой фактическиуправляет рекламный отдел. Мне хотелосьсоздать по­настоящему независимый ресурс.Примерное такие же мысли были и у Сергея.Когда он в декабре 2007 года пришёл ко мнес идеей совместно сделать сайт, у меня ужебыл готов прототип будущего gagadget'а.Ваш сайт постоянно обновляется.Наверное, над проектом трудится целаякоманда журналистов?

Вовсе нет. Непосредственно материаламизанимаются два человека — Сергей и я.Раньше мы делили все обязанности поровну,но затем решили, что я буду большезаниматься обзорами, а Сергей —новостями. Техническое сопровождение ипродажа рекламы лежат на плечах нашихпартнёров из компании «Магнет».Сайтов с обзорами гаджетов не мало.Чем gagadget выгодно отличается от других?

Мы с самого начала понимали, чтоограниченные ресурсы не дают намвозможности на равных тягаться с большимисайтами вроде ITC.ua или IXBT.com поколичеству материалов. Поэтому мы решилиработать в несколько другом жанре, которыйописывается нашим слоганом —«Нескучный сайт о технике». Мы стараемсяписать живо, с юмором и понятно, безлишней зауми, доступной толькопосвящённым.Ваш сайт построен в стиле "блог". С чемсвязан выбор именно такого формата? По­моему "портальный" стиль более отражаетнаправление вашего проекта.

На самом деле для сайтов о технике такойформат не уникален. Достаточно вспомнить,что два самых популярных в мире сайта огаджетах — Engadget и Gizmodo — работаютименно в формате блога. Кроме того, блогподразумевает личный, авторский стильподачи материалов, а это именно то, к чемумы стремились изначально.Как Вы успеваете столько делать?Ведение новостной ленты, тесты гаджетов,тусовка на форуме и т.д. Ощущение, что увас в сутках минимум 48 часов.

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

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

Gagadget.com:"У нас не скучный сайт о технике!"Интервью с Павлом Урусовым

9

vr­online | июнь 2010

Игорь

Антон

овaka

Spide

r_NET

Email:

antono

v.igor@

gmail.

comVrIP персона

Page 10: VR-Online (June 2010)

VrIP персона10

vr­online | июнь 2010

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

Как ни странно, у нас всегда были оченьконструктивные отношения с большинствомкомпаний, с которыми мы работаем. Онизаинтересованы в честной обратной связи срынком, им надо знать сильные и слабыестороны текущих устройств, чтобы грамотнопланировать обновление продуктовыхлинеек. Такие обзоры — один из каналовполучения обратной связи, наряду сотзывами пользователей на форумах и т.п.Конфликтная ситуация возникла только одинраз, когда нам по ошибке выдалиинженерный прототип устройства, врезультате чего в обзоре были описанынедостатки, отсутствующие в коммерческихэкземплярах.Gagadget ­ это основное место работы иливсе же вам приходится трудиться где­тоеще?

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

Есть такая старая пословица — «терпение итруд всё перетрут». Каких­то особых усилийпо продвижению сайта мы никогда неприлагали, поскольку придерживаемся точкизрения, что хороший контент сам себяраскручивает. Наша аудитория — это люди,которым интересно читать наши тексты икоторые собрались вокруг сайта за два споловиной года его существования.У Вас на сайте частенько проводятсяконкурсы. Какой эффект конкурсы приносятпроекту? Многие посетители решаются научастие?

Эффектов на самом деле много. Во­первых,имиджевый — у нас постепенноскладывается репутация ресурса, которыйрегулярно разыгрывает дорогие подарки. Во­вторых, это укрепляет лояльностьпосетителей. В­третьих, конкурсы приводятновых посетителей, некоторые из которых

потом становятся постоянными читателямипроекта. Сейчас в каждом нашем конкурсепринимают участие несколько сотенчеловек.Вы посещаете зарубежные блоги/порталыо технике? Какие на ваш взгляд наиболееуспешные из них?

Разумеется, посещаем. Engadget, Gizmodo,Electronista, Akihabara News, DigitalPhotography Review, Laptop Magazine — вотлишь некоторые из сайтов о технике,которые читаю лично я. Это очень успешныепроекты, которые ежемесячно посещаютмиллионы человек.Как Вы относитесь к "бумажным"компьютерным изданиям? Читаете ли выкакие­нибудь журналы постоянно(бумажные)?

Лично я к ним отношусь хорошо, можно дажесказать — с теплом и ностальгией,поскольку отдал бумажной IT­журналистике8 лет жизни. Но не могу сказать, чтобы мнебыло интересно читать какой­то бумажныйжурнал, поскольку сам формат заведомонакладывает множество ограничений,отсутствующих в интернете. Например,хороший обзор на сайте всегда будетподробнее хорошего обзора в журнале,поскольку на сайте просто нет ограниченийпо количеству знаков. То же самое сфотографиями: на сайте их будет столько,сколько необходимо, а не сколькопомещается на полосу. На сайт можнопоставить видео... Бумажные журналылишены всех этих прелестей. Единственноеих преимущество заключается в том, чтожурнал удобно читать в туалете.Единственным исключением был журнал«Компьютерра», который я читал регулярновплоть до самой его смерти.Как на Ваш взгляд изменитсяжурналистика (в области it) в ближайшиепять лет? Смогут ли глянцевые журналымигрировать в формат "online"?

Я думаю, журналистика вообще и IT­журналистика в частности будут двигатьсяпо пути повышения информативности иинтерактивности. Видеоролики, трёхмерныемодели устройств, которые можно крутить ирассматривать со всех сторон — всё этобудет внедряться ускоренными темпами.Или, скажем, сайт DPReview недавно сделалв своих обзорах фотоаппаратов новую«фишку» — теперь вы можете напрямуюсравнить качество снимков того аппарата, окотором читаете, с любой моделью из ихбазы данных. Это не журналистика в чистомвиде, но это путь в будущее.

Page 11: VR-Online (June 2010)

VrIP персона11

vr­online | июнь 2010

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

Безусловно, затронул. В какой­то степени ондаже ускорил развитие gagadget'а, посколькуIT­журналы в Украине стали закрыватьсяодин за другим и компании началирассматривать нас как полноценное СМИ.Опять же, рекламодатели начали считатьденьги, после чего выяснилось, что рекламав специализированной прессе стоитдостаточно дорого, а измерить полученныйот неё эффект очень сложно. Интернет­реклама в этом смысле надёжнее, посколькуона дешевле и в ней всё подлежит учёту(количество показов, количество переходов,CTR и так далее).Сегодня очень "модным" стал подкастинг.Планируете ли Вы запуск своей подкастленты? Ваше отношение к подкастам?

У нас был подкаст, который мы закрылипосле нескольких «пилотных» выпусков.Причина проста: у нас нет ресурсов на то,чтобы делать его хорошо, а делать плохо мыне хотим.К тому же, на мой взгляд, подкасты — этотупиковый путь, в отличие от того же видео.В наших странах отсутствует модельпотребления аудиоконтента. В метро,например, подкаст не послушаешь,поскольку мешает грохот поезда. Во времяработы тоже не послушаешь, потому чточужая болтовня отвлекает от работы.Остаётся слушать подкастыцеленаправленно, но это занимает многовремени: например, подкаст Mobile­Reviewобычно длится около полутора часов.Получается, что единственная целеваяаудитория подкастов — это люди, которыеездят на машине и по два часа в день стоятв пробках. А в США подкасты прижились,потому что там 80% населения с 18 лет зарулём.

Какие Ваши планы на будущее? Чтопланируете усовершенствовать/внедрить наgagadget?

Сейчас мы работаем над каталогомустройств / сервисом сравнения цен —http://bb.gagadget.com/. В будущемпланируем более активно развиватьвидеонаправление, работать надповышением интерактивности нашихобзоров.Чтобы Вы хотели пожелать тем, кторешится на создание интернет­проекта? Чтостоит/чего не стоит делать?

В первую очередь, не стоит рассчитывать нато, что сайт сразу же превратится в курицу,несущую золотые яйца. Поддержание наплаву интернет­проекта — это постоянныйтяжёлый труд. Сейчас я работаю больше,чем когда­либо в жизни. И это справедливодля любого бизнеса, который надоподнимать с нуля. И, конечно же, стоит сразуже реалистично оценить, сколько временивы сможете уделять проекту. Если этоговремени окажется немного — не стоит дажепробовать.Многих наших читателей интересуеттема заработка на сайте. А на чемзарабатывает gagadget? Лишь на продажерекламы?

Мы сразу же отказались от такогосомнительного способа заработка, какпродажа ссылок (напрямую или черезбиржи). Сейчас мы зарабатываем в первуюочередь на продаже рекламы, во вторую —на предоставлении различного родаинформационных услуг производителям.Например, сейчас у нас идёт проект,посвящённый Nokia N900 и мобильнойоперационной системе Maemo, и под этотпроект нам удалось получить небольшойбюджет."Хорошая статья" для Вас это ­ ...

Это текст, который ставит вопросы иотвечает на них.Как Вы относитесь к "копипастерам"?Боретесь?

Английский писатель Чарлз Колтон,известный своими афоризмами, однаждысказал: «Копирование — самая искренняяформа лести». Если нас копируют, значит,мы всё делаем правильно. В какой­тостепени копипастеры даже оказывают намуслугу, поскольку люди видят наши водяныезнаки на фотографиях и идут на сайтнапрямую.Вы читаете какие­нибудь ресурсы дляжурналистов? Если да, то, какие?

На регулярной основе читаю толькоукраинский сайт «Телекритика».

Page 12: VR-Online (June 2010)

VrIP персона12

vr­online | июнь 2010

Если не ошибаюсь, то Ваш сайт работает наDrupal. Почему выбрали именно эту CMS?Изначально я думал использовать оченьудобный движок блога e2, тем более что уменя хорошие отношения с его создателемИльёй Бирманом. Потом стало понятно, чтомы делаем не просто блог, и возможностейe2 стало не хватать. Выбор пал на Drupal,поскольку эта CMS хорошо себязарекомендовала, для неё написаномножество модулей на все случаи жизни,вокруг неё существует активное идоброжелательное сообщество. Ну и самоеглавное — у меня был знакомый, хорошоразбирающийся в Drupal, которому в случаечего можно было задавать вопросы. В целоммы довольны выбором. На начальном этапеу нас было несколько проблем, но все онибыли вызваны моими кривыми руками, а ненедостатками CMS.Ну и напоследок, чтобы Вы хотелипожелать нашим читателям?

В первую очередь — профессиональныхуспехов.

Page 13: VR-Online (June 2010)

DelphiРабота с указателямиНаходим правильный подход к указателям

13

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

Но указатели очень важны. Даже в языках, кото­рые явно не поддерживают указатели, или в кото­рых использование указателей затруднено,указатели являются важными факторами "под ка­потом" языка. Я считаю, что для программистапонимание указателей является весьма важнойвещью. Существует несколько подходов к пони­манию указателей.Эта статья была написана для тех, у кого естьпроблемы с пониманием или использованиемуказателей. Она демонстрирует мою точку зре­ния на указатели в Delphi для Win32. Можетбыть, это не будет абсолютно точно во всех ас­пектах (например, память программы не являет­ся одним большим монолитным блоком), ноэтого более чем достаточно для практических це­лей. По­моему, таким образом указатели будетпроще понять.Содержание:

­ Память (Memory)­ Переменные (Variables)­ Указатели (Pointers)­ Плохие указатели­ Арифметика указателей и массивы­ Ссылки (References)­ Структуры данных­ Заключение

Память (Memory)

Скорей всего, вы и так уже знаете, что я собира­юсь написать в этом параграфе, но, наверное,прочитать его будет не лишним, т.к. он демонстри­рует моё видение вещей, которое может отли­чаться от вашего.Указатели ­ это переменные, которые указываютна другие переменные. Чтобы объяснить это,необходимо понять концепцию адреса памяти иконцепцию переменной. Для этого я сначала гру­

бо опишу компьютерную память (Подробноеописание компьютерной памяти вы можете про­читать в цикле статей Марка Руссиновича"Pushing the Limits of Windows" ­ прим. перевод­чика).Кратко говоря, компьютерная память можетрассматриваться как один очень­очень длинныйряд байтов. Байт ­ это единица измерения коли­чества информации, в стандартном виде байтсчитается равным восьми битам и может хра­нить одно из 256 различных значений (от 0 до255). В текущей 32­х битной версии Delphi на па­мять можно смотреть (за редкими исключения­ми) как на массив байт максимальным размеромв 2 Гб (2^31 байт). Что именно содержат этибайты ­ зависит от того, как интерпретировать ихсодержимое, т.е. от того, как их используют. Зна­чение 97 может означать число 97, или же букву'a'. Если вы рассматриваете вместе несколькобайт, то вы можете хранить и большие значения.Например, в 2­х байтах вы можете хранить одноиз 256*256 = 65536 различных значений и т.д.Чтобы обратиться к конкретному байту в памяти(адресовать его), можно присвоить каждомубайту номер, пронумеровав их числами от 0 и до2147483647 (в предположении, что у вас есть 2Гб — а даже если у вас их нет, то Windows попы­тается сделать так, чтобы вам казалось, что ониу вас есть). Индекс байта в этом огромном мас­сиве и называется его адресом.Кто­то может сказать: байт ­ это наименьший ку­сок памяти, который можно адресовать.В действительности, память устроена сложнее.Например, существуют компьютеры, байт в кото­рых не равен 8­ми битам, что означает, что онимогут содержать больше или меньше 256 значе­ний. Впрочем, для тех машин, на которых рабо­тает Delphi для Win32, байт всегда равен 8­мибитам. Память управляется и железом и про­граммами, так что не вся видимая вам памятьможет существовать (менеджеры памяти скры­вают это от вас, выгружая память частями нажёсткий диск), но для целей этой статьи мы мо­жем смотреть на память как на один большой

vr­online | июнь 2010

Перев

од:Ал

ександ

рАлек

сеевa

kaGu

nsmoke

rww

w.tran

sl­guns

moker

.ru

Pointers are like jumps, leading wildly from one part of the data structure to another.Their introduction into high­level languages has been a step backwardsfrom which we may never recover. — Charles Hoare

Кодинг

Page 14: VR-Online (June 2010)

блок памяти, разделённый для использованиянесколькими программами.Переменные (Variables)

Переменная ­ это место из одного или несколь­ких байт в этом гигантском "массиве", из которого(места) вы можете читать или писать. Это местоидентифицируется по имени, но также характери­зуется своим типом, значением и адресом.Когда вы объявляете переменную, компилятор резервирует кусо­чек памяти подходящего размера. Где именно будет лежать этапеременная ­ определяется компилятором и средой времени вы­полнения. Вы никогда не должны делать предположения о возмож­ном точном месте переменной в запущенной программе.Тип переменной определяет, как будет использо­ваться место в памяти. Тип определяет размер,т.е. сколько байт занимает место в памяти, а так­же структуру памяти. Например, на следующейдиаграмме показан кусок памяти в 4 байта, начи­нающихся по адресу $00012344. Байты содержатзначения $4D, $65, $6D и $00, соответственно.

Заметьте, что хотя я использовал адрес типа$00012344, в большинстве диаграмм это просточисла, взятые "от балды", которые просто помога­ют отличить одно место в памяти от другого. Онине отражают настоящие адреса памяти, т.к. этиадреса зависят от множества факторов и их не­льзя предсказать заранее.Тип определяет, как используются эти байты.Например, это может быть число типа Integer созначением 7169357 (что есть $006D654D), илиже массив символов array[0..3] of AnsiChar, фор­мирующий C­строку (т.е. PChar) 'Mem', или что­тосовершенно иное, как множество, массив изотдельных байт, небольшая запись, Single, частьDouble и т.д... Другими словами, смысл куска па­мяти переменной не известен, если только вы незнаете, какого типа (или типов) эта переменная(или переменные).Адрес переменной ­ это адрес первого байта ме­ста хранения. Например, в диаграмме выше, впредположении, что у нас переменная типаInteger, её адрес будет $00012344.Неинициализированные переменные

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

подпрограммы. Поля объекта (которые тожепеременные) также доступны только пока объект"существует".Если вы объявляете переменную, компиляторрезервирует требуемое количество байт дляэтой переменной. Но содержание памяти дляэтих переменных может быть байтами, которыележали там при вызове другой функции или про­цедуры. Другими словами, значение неинициа­лизированной переменной (т.е. переменной,которой вы ещё не присвоили значения) неопре­делено (но не обязательно неопределяемо впринципе). Простой пример в виде консольнойпрограммы демонстрирует это:

Первое отображаемое значение (значениенеинициализированной переменной A) зависитот уже существующего содержания памяти, за­резервированной под A. В моём случае каждыйраз значение было 2147319808 ($7FFD8000), ноэто число может быть совершенно другим на ва­шей машине. Значение не определено, потомучто переменная не была инициализирована. Вболее сложных программах, особенно (но нетолько) с участием указателей, это частая причи­на для вылета программы или вывода неверныхрезультатов. Присваивание инициализируетпеременную A значением 12345 ($00003039), чтои будет вторым выведенным значением.Указатели (Pointers)

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

program uninitializedVar;$APPTYPE CONSOLEprocedure Test;varA: Integer;

beginWriteln(A); // ещё не инициализированаA := 12345;Writeln(A); // инициализирована: 12345

end;beginTest;Readln;

end.

varI: Integer;J: Integer;C: Char;

beginI := 4222;J := 1357;C := 'A';

Кодинг14

vr­online | июнь 2010

Page 15: VR-Online (June 2010)

Предположим, что это дало нам такую компонов­ку памяти:

Теперь, после выполнения этого кода (предпола­гая что P ­ это указатель):

Мы получаем:

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

Эта диаграмма более не показывает настоящихразмеров (C выглядит так же, как и I или J), ноэтого достаточно, чтобы продемонстрировать,что происходит с указателями.Nil Thou shalt not follow the NULL pointer,

for chaos and madness await thee at its end. — Henry SpencerNil ­ это специальное значение указателя. Ономожет быть присвоено любому указателю. nil

означает пустой указатель (nil ­ это сокращениеот Лат. nihil, что означает ничего или ноль; кое­кто расшифровывает NIL как аббревиатуру отNot In List ­ не в списке). Это означает, что указа­тель был определён (инициализирован, присво­ен), но вы не должны пытаться получитьзначение, на которое он указывает (в языке C, nilназывается NULL — см. цитату в начале секции).Nil никогда не указывает на допустимую память,но т.к. это вполне конкретное значение, то под­программы могут сравнивать указатели с этимзначением (например, используя функциюAssigned()). Нельзя проверить, является ли лю­бое другое (не­nil) значение указателя допусти­мым. Мусорный или неинициализированныйуказатель ничем не отличается от допустимогоуказателя (см. ниже). Не существует способа ихотличать друг от друга. Программная логика все­гда должна гарантировать, что указатель либодопустим, либо равен nil (фича "Pushing theLimits of Windows") (Ещё одна причина для по­всеместного использования FreeAndNil(http://gunsmoker.blogspot.com/2009/04/freeandnil­free.html ) ­ прим. переводчика).В Delphi, nil имеет значение 0 (прим. пер.: т.е. nil= Pointer(0) или 0 = Integer(nil)) ­ т.е. он указываетна самый первый байт в памяти. Очевидно, чтоэтот байт никогда не будет доступен для Delphiкода. Но обычно вы не должны рассчитывать нато, что указатель nil будет равен 0, если тольковы точно не знаете, что вы делаете. Числовоезначение nil может быть изменено в следующихверсиях Delphi по какой­то причине (Хотя это ичертовски маловероятно. Писать код без такогопредположения довольно тяжело, т.к. получает­ся, что (к примеру) после ZeroMemory мы не по­лучаем nil ­ прим. переводчика).Типизированные указатели

В простом примере выше P имеет тип Pointer.Это означает, что P содержит адрес, но вы незнаете, переменная какого типа лежит по этомуадреса. Вот почему обычно используются типи­зированные указатели, т.е. указатель интерпре­тируется как указывающий на переменную(область памяти) определённого типа.Предположим, что у нас есть ещё один указа­тель, Q:

Q типа ^Integer, что читается как "указатель наInteger" (мне сказали, что ^Integer расшифровы­вается как ^Integer). Это означает, что Q ­ это неInteger, но вместо этого указывает на память, ко­торая может быть использована как Integer. Есливы присвоите адрес J в Q, используя операторвзятия адреса @ или эквивалентную функцио­нальность псевдо­функции Addr, то тогда Q бу­дет указывать на место по адресу $00012348 (Q

varQ: ^Integer;

Кодинг15

vr­online | июнь 2010

P := @I;

Page 16: VR-Online (June 2010)

ссылается (references) на место памяти, занимае­мое J). Но поскольку Q является типизирован­ным указателем, то компилятор будет трактоватьпамять, на которую указывает Q, как число типаInteger. Integer является базовым типом Q.

Хотя вы навряд­ли увидите псевдо­функцию Addrв реальном коде, она полностью эквивалентна@. Однако у @ есть недостаток: если его приме­нять к сложному выражению, то не всегда ясно,указатель чего берётся. Addr же, используя син­таксис функции, получается намного более чита­бельным, поскольку целевое выражениезаключается в скобки:

Прим. пер.: поэтому неплохо использовать скоб­ки вместе с @, хотя это и не обязательно:

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

Это записывает число 98765 ($000181CD) в ме­сто памяти, занимаемое переменной J. Но чтобыполучить доступ к этой памяти через указательQ, вы должны работать косвенно, используя опе­ратор ^:

Это называется разыменованием указателя. Выдолжны следовать по воображаемой "стрелочке"до места, на которое указывает Q (другими сло­вами, до Integer по адресу $00012348) и сохра­нить там значение.Для записей, синтаксис языка позволяет вамопускать оператор ^, если код не теряет при этомсвоего смысла. Но лично я всегда явно указываюоператор для улучшения читабельности.Обычно полезно определять типы для используе­мых в программе указателей. Например, вы неможете использовать ^Integer при указании типапараметра подпрограммы, так что вам придётся

объявить новый тип:

Фактически, тип PInteger и некоторые другие ча­сто используемые типы уже определены в биб­лиотеке Delphi (модули System, SysUtils и Types).Начинать имя типов указателей с заглавной бук­вы P и следующим за ней именем типа, на пере­менную которого указывает указатель, являетсятрадицией, рекомендованной к выполнению.Если базовый тип указателя начинается с за­главной T, то T обычно опускается. Например:

Анонимные переменные

(прим. пер.: не путать с захваченными перемен­ными в анонимных методах)В предыдущих примерах переменные объявля­лись только там, где они были необходимы. Ино­гда вы не знаете, понадобиться ли вампеременная или как много переменных. Исполь­зуя указатели, вы можете создавать так называе­мые анонимные переменные. Вы можетепопросить библиотеку языка выделить вам кусокпамяти и вернуть указатель на него, используяпсевдо­функцию New():

New() ­ это псевдо­функция компилятора. Онарезервирует память для базового типа PI и запи­сывает адрес на эту память в указатель PI. Усамой переменной здесь нет имени (т.е. она ано­нимная) ­ имя есть только у указателя на пере­менную. Получить доступ к такой переменнойможно только используя указатель. Теперь выможете присваивать ей значения, передавать еёв подпрограммы, избавиться от неё, когда онастанет вам не нужна, используя вызовDispose(PI):

Вместо использования New и Dispose, вы може­те спуститься на уровень пониже и использоватьGetMem и FreeMem. Но подпрограммы New иDispose имеют несколько преимуществ: ониосведомлены о типе указателя (прим. пер.:поэтому автоматически определяют размер па­

P := @PMyRec^.Integers^[6];Q := Addr(PMyRec^.Integers^[6]);

Q := @J; // Q := Addr(J);

Кодинг16

vr­online | июнь 2010

P := @(PMyRec^.Integers^[6]);

J := 98765;

Q^ := 98765;

typePInteger = ^Integer;

procedure Abracadabra(I: PInteger);

typePByte = ^Byte;PDouble = ^Double;PRect = ^TRect;PPoint = ^TPoint;

varPI: PInteger;

beginNew(PI);

PI^ := 12345;ListBox1.Add(IntToStr(PI^));// куча кодаDispose(PI);

end;end;

Page 17: VR-Online (June 2010)

Кодинг17

vr­online | июнь 2010

мяти), а также инициализируют и освобождаютсодержимое участка памяти, если это необходи­мо. Так что рекомендуется всегда использоватьNew и Dispose, вместо GetMem и FreeMem, там,где это возможно.Всегда гарантируйте, что каждый вызов New() бу­дет иметь пару в виде вызова Dispose() с тем жесамым значением и типом указателя, в против­ном случае память может быть освобождена не­верно или не до конца.Сейчас может быть не очевидно, чем же это луч­ше, чем объявлять переменную явно, но бываютситуации, когда это полезно, обычно, если вы незнаете, как много переменных вам понадобиться.Подумайте об узлах в связанном списке (см. ни­же) или о TList­е. TList хранит указатели, и есливы хотите иметь список значений Double, то выпросто вызываете New() для каждого значения ихраните его в TList:

Конечно же, вам нужно будет потом вызыватьDispose() для каждого значения, когда список небудет больше нужен.Используя анонимные переменные, легко пока­зать, что типизированные указатели могут опре­делять, как используется память. Два указателяразных типов, указывающие на одно и то же ме­сто в памяти, будут показывать разные значения:

PI заполняет память значением $006D654D(7169357). На диаграмме (напомню, что все адре­

са были придуманы мной):

PC указывает на ту же самую память (посколькубазовые типы указателей несовместимы, вы неможете просто так присвоить один указательдругому — вам нужно использовать преобразо­вание типов). Но PC является указателем наAnsiChar, так что если вы берёте PC^, то вы по­лучаете AnsiChar ­ один символ с ASCII значени­ем $4D или 'M'.Вообще­то, PC ­ это особый случай, посколькутип PAnsiChar, хотя он формально указывает насимвол AnsiChar, трактуется специальным об­разом, немного иначе, чем остальные типы ука­зателей. PC, если он не разыменовывается,обычно трактуется как указатель на текст, закан­чивающийся нулевым символом #0, поэтомуWriteln(PC) покажет текст, сформированныйбайтами $4D $65 $6D $00, т.е. 'Mem'.Когда мне нужно подумать об указателях, и осо­бенно о сложных ситуациях с ними, я обычно бе­ру бумажку и ручку и рисую диаграммки типа тех,что вы видели выше. Я также даю переменнымвыдуманные адреса, если это нужно (не обяза­тельно использовать все 32 бита, адреса типа30000, 40000, 40004, 40008 и 50000 тоже вполнеподойдут).Плохие указатели

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

Указатели являются переменными, и как любыедругие переменные они должны быть инициали­зированы перед использованием, либо присваи­ванием им другого указателя, либо используяподпрограммы типа New или GetMem, например:

varP: PDouble;

beginwhile HasValues(SomeThing) dobeginNew(P);P^ := ReadValue(SomeThing);MyList.Add(P);// и т.д...

program InterpretMem;$APPTYPE CONSOLEvarPI: PInteger;PC: PAnsiChar;

beginNew(PI);PI^ := $006D654D; // Байты $4D $65 $6D $00PC := PAnsiChar(PI);// Теперь оба указателя указывают//на одно место в памятиWriteln(PI^);// Печатаем число.Writeln(PC^);// Печатаем один символ ($4D).Writeln(PC);// Печатаем строку в//стиле C (байты $4D $65 $6D $00//интерпретируются как PChar)Dispose(PI);Readln;

end.

varP1: PInteger;P2: PInteger;P3: PInteger;I: Integer;

beginI := 0;P1 := @I; // OK: используя оператор @P2 := P1; // OK: присвоением другого указателяNew(P3); // OK: New

Page 18: VR-Online (June 2010)

Кодинг18

vr­online | июнь 2010

Если вы просто объявите, скажем, указатель ти­па PInteger, но не проинициализируете его, то ука­затель, вероятно, будет содержать какие­тослучайные байты, т.е. он фактически будет указы­вать на случайное место в памяти.Если вы попробуете получить доступ к памяти потакому указателю, будут происходить плохие ве­щи. Если эта память не будет зарезервированавашим приложением, то вы получите исключениеAccess Violation ­ вылет программы (programcrash). Но если эта память будет частью вашейпрограммы, то вы можете переписать данные, ко­торые не должны меняться. Если эти данные ис­пользуются в другой части вашей программы, точуть позже, получаемые результаты выполнениявашей программы будут ошибочны. Такие ошиб­ки чрезвычайно тяжело искать.Поэтому, если вы вдруг увидели сообщение обошибке типа Access Violation или другое сообще­ние об очевидном вылете (типа Invalid Pointer),вы, на самом деле, должны быть благодарны (нуесли только эта ошибка не испортила вашжёсткий диск ;) . Ваша программа вылетела, да,это плохо, но такие ошибки хотя бы легко отлажи­вать и исправлять. Но если ваша программа про­сто втихую выводит неправильные данные,проблема может быть намного хуже, и вы дажеможете не заметить её, пока не станет слишкомпоздно. Вот почему вы должны использовать ука­затели с особым вниманием. Всегда дотошнопроверяйте код на неинициализированные указа­тели.Мусорные указатели

Мусорные указатели (stale pointers) ­ это указате­ли, которые когда­то были допустимыми, но те­перь уже нет. Это может произойти, если память,на которую указывает указатель, была освобо­ждена и/или повторно использована.Один из частых случаев мусорного указателя ­это когда память освобождается, но сам указа­тель ещё используется после этого. Для предот­вращения этого некоторые программисты всегдаустанавливают указатели в nil, после освобожде­ния памяти. Они также проверяют на nil, преждечем пытаться получить доступ к памяти. Другимисловами, nil используется как своего рода флаг,отметка о недопустимости указателя. Это одиниз подходов, но не всегда самый лучший.Другая частая ошибка: иметь более чем один ука­затель на один и тот же кусок памяти. Вы можетеосвободить память по одному указателю и дажеоб­nil­ить его, но другой указатель всё также бу­дет содержать старое значение, указывающее науже освобождённую память. Если вам повезёт,вы получите ошибку типа "Access Violation" или"Invalid pointer", но реальное поведение частонеопределено.

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

V будет помещена в процессорном стеке. Этоспециальная часть памяти, которая использует­ся для хранения локальных переменных и пара­метров вызываемых процедур, а также содержитважные данные типа адресов возврата для каж­дой вызванной подпрограммы. Результат функ­ции указывает на V (PChar может указыватьпрямо на массив ­ см. статью, что я упоминал).Как только VersionData завершает выполнение,стек изменяется следующей вызванной подпро­граммой, так что данные, вычисленные вCalculateVersion оказываются перезаписанными,а указатель указывает на это новое содержимоепо всё тому же старому адресу.Похожая проблема: указывание PChar на строкуString, но это также обсуждалось в статье проPChar. Или использование указателя на элементдинамического массива (динамические массивымогут перемещаться по памяти, если их размерменяется вызовами SetLength) ­ вместо этого на­до использовать просто индекс.Использование неверного базового типа

Тот факт, что указатели могут указывать на лю­бое место в памяти и что два указателя разныхтипов могут указывать на одно и то же место,фактически означает, что вы можете обращатьсяк одной памяти разными способами. Используяуказатель на Byte (^Byte), вы можете изменятьиндивидуальные байты Integer­а или любогодругого типа.Но вы также можете что­то ошибочно записатьили прочитать. Например, если вы получаете до­ступ к месту, которое хранит только Byte, с помо­щью указателя на Integer, вы можете записать 4байта, среди которых только 1 байт является до­пустимым, а остальные три ­ просто смежные сним, поскольку компилятор будет трактовать эти4 байта подряд, как одно число типа Integer. Так­же, если вы читаете что­то с места расположе­ния байта, вы можете прочитать слишком много:

function VersionData: PChar;varV: array[0..11] of Char;

beginCalculateVersion(V);Result := V;

end;

varPI: PInteger;

Dispose(P3);end;

Page 19: VR-Online (June 2010)

Кодинг19

vr­online | июнь 2010

J будет иметь правильное значение, потому чтокомпилятор добавит код расширения одногобайта до (4­х байтового) Integer с помощью обну­ления старшей части Integer­а. Но I не будетиметь верного значения. Она будет содержатьнаш байт и ещё 3 каких­то байта, которые следу­ют за B, формируя этим некоторое неопределён­ное (мусорное) значение.Указатели также позволяют вам установить значе­ние переменной без присваивания его самойпеременной. Это может сильно огорчать вас вовремя отладки. Вы знаете, что переменная содер­жит неверное значение, но не можете увидеть вкоде, где же это значение было присвоено, пото­му что значение было установлено через указа­тель (прим. пер.: для этого могут использоватьсяточки останова на память).Владельцы и забытая память (Owners andorphans)

Указатели не только могут иметь различные базо­вые типы, но и различную семантику владения.Если вы выделяете память, используя New илиGetMem или любую другую более специализиро­ванную подпрограмму, вы являетесь владельцемэтой памяти. Лучше всего, если вы будете дер­жаться за эту память, заныкав указатель на неё внадёжное место. Указатель ­ это ваш единствен­ный способ получить доступ к этой памяти, иесли он будет утерян ­ вы не сможете ни прочи­тать данные, ни освободить их. Одно из общихправил: тот, кто выделяет память, обязан её иосвободить, так что это ваша обязанность. Хоро­шо спроектированные программы всегда следу­ют этому правилу.Понять правила владения очень важно. Кто вла­деет памятью ­ тот её и освобождает. Вы можетеделегировать (передать) эту задачу кому­то ещё,но вы должны убедиться, что задача будет выпол­нена верно.Частая ошибка: использовать указатель для вы­деления памяти, а затем снова использоватьэтот же указатель для выделения другой памятиили присвоить ему другой указатель. Указатель,который содержал адрес старого выделенногоблока памяти, начинает указывать на новый блокпамяти, а старый адрес оказывается потерян на­всегда. Не существует никакого разумного спосо­ба получить местоположение первоговыделенного блока памяти. Память оказываетсязабыта. Никто не может получить к ней доступ иникто не может её очистить. Это приводит к об­разованию так называемых утечек памяти.Вот простой пример, взятый (с разрешения авто­ра) из групп обсуждений Borland:

Ну, вообще­то этот код делает несколько стран­ных вещей. SetLength выделяет байты дляbitdata. По какой­то причине программист потомиспользует GetMem для выделения такого же ко­личества байт для pbBitmap. Но затем он не­медленно присваивает pbBitmap другой адрес,что приводит к тому, что только что выделеннаяGetMem­ом память становится недоступной лю­бому коду (единственным способом добратьсядо неё была pbBitmap, но он больше на неё неуказывает). Другими словами, у нас есть утечкапамяти.Фактически тут есть и другие ошибки. bitdata ­это динамический массив, и взятие адресаbitdata берёт адрес указателя на данные масси­ва, вместо адреса самих данных (см. ниже, ди­намические массивы). Также, посколькуpbBitmap уже является указателем, неправильноиспользовать на него оператор @.Более правильный код выглядел бы так:

Или даже так:

Это может показаться тривиальной проблемой,но в более сложном коде легко допустить подоб­ную ошибку.Заметим, что указатель не обязан владеть памя­тью. Указатели часто используются для движе­ния по массиву (см. ниже) или для получениядоступа к части структуры. Если вы не выделяе­те для указателя память, то нет никакой причиныне изменять его. При этом указатель использует­ся как временная переменная, которую можно влюбой момент выбросить, не заботясь об осво­

I, J: Integer; B: Byte;beginPI := PInteger(@B);I := PI^;J := B;

varbitdata: array of Byte;pbBitmap: Pointer;

beginSetLength(bitdata, nBufSize);GetMem(pbBitmap, nBufSize);pbBitmap := Addr(bitdata);VbMediaGetCurrentFrame(VBDev, @bmpinfo.bmiHeader,@pbBitmap, nBufSize);

varbitdata: array of Byte;pbBitmap: Pointer;

beginif nBufSize > 0 thenbeginSetLength(bitdata, nBufSize);pbBitmap := Addr(bitdata[0]);VbMediaGetCurrentFrame(VBDev, @bmpinfo.bmiHeader,pbBitmap, nBufSize);

end;

varbitdata: array of Byte;

beginif nBufSize > 0 thenbeginSetLength(bitdata, nBufSize);VbMediaGetCurrentFrame(VBDev, @bmpinfo.bmiHeader,@bitdata[0], nBufSize);

end;

Page 20: VR-Online (June 2010)

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

You can either have software quality or you can have pointerarithmetic, but you cannot have both at the same time. — BertrandMeyer

Delphi позволяет производить над указателяминесколько простых действий. Во­первых, конечноже, вы можете присваивать им значения и срав­нивать их на равенство (if P1 = P2 then) или нера­венство. Но вы также можете увеличивать илиуменьшать их, используя псевдо­функции Inc иDec. Приятным моментом при этом является то,что эти функции учитывают размер базового ти­па указателя. Пример (заметьте, что я рукамиприсвоил указателю фальшивый адрес. Пока яне попытаюсь получить по нему доступ, всё бу­дет в порядке):

Вывод программы:

Применение этого: это способ предоставить по­следовательный доступ к элементам массивов.Поскольку (одномерные) массивы содержат по­следовательные элементы одного типа (т.е. еслиэлемент расположен по адресу N, тогда следую­щий элемент расположен по адресу N +SizeOf(element)), то можно использовать этотсценарий для прохода по массиву в цикле (Насамом деле, формально такой массив долженбыть объявлен с ключевым словом "packed" ­прим. переводчика). Вы начинаете с адреса пер­вого элемента массива, что­то с ним делаете. Наследующей итерации цикла вы увеличиваете ука­затель, так что он начинает указывать на второй

элемент и т.д.:

Увеличение указателя немного быстрее, чемумножение индекса на размер элемента и сум­мирование с базовым адресом на каждой итера­ции.В реальности же, разница между обоими спосо­бами незначительна, если вообще заметна. Во­первых, у современных процессоров есть специ­альные способы для адресования при типичныхслучаях использования индекса. Во­вторых,компилятор всё равно обычно оптимизирует ис­пользование индекса в использование указате­ля, если это возможно. А в примере выше,незначительная разница и вовсе съедается вы­полнением такой сложной функции как Write().Как вы можете видеть в примере выше, вы може­те легко забыть увеличить указатель в цикле. Ивы всё равно должны использовать либо циклfor­to­do, либо какой­то другой способ для орга­низации цикла и условия выхода (с ручным сдви­гом и сравнением). Код с использованиемуказателей обычно труднее поддерживать. И по­скольку подход указателями ничуть не быстрее(ну за исключением очень маленьких циклов), ябы избегал подобного кода в Delphi. Делайте тактолько если вы прогнали программу под про­файлером и считаете, что доступ с указателемдействительно будет выигрышным.Указатели на массивы

Но иногда у вас нет массива, а есть только ука­затель для доступа к памяти. Функции WindowsAPI часто возвращают данные в буферах, кото­рые содержат массивы записей определённогоразмера. Но даже в этом случае, вероятно, бу­дет проще преобразованием типа сделать буферуказателем на массив, чем использовать Inc или

Кодинг20

vr­online | июнь 2010

program PointerArithmetic;$APPTYPE CONSOLEusesSysUtils;

procedure WritePointer(P: PDouble);beginWriteln(Format('%8p', [Integer(P)]));

end;varP: PDouble;

beginP := Pointer($50000);WritePointer(P);Inc(P);WritePointer(P);Inc(P, 6);WritePointer(P);Dec(P, 4);WritePointer(P);Readln;

end.

50000500085003850018

program IterateArray;$APPTYPE CONSOLEvarFractions: packed array[1..8] of Double;I: Integer;PD: ^Double;

begin// Заполняем массив случайными значениямиRandomize;for I := Low(Fractions) to High(Fractions) doFractions[I] := 100.0 * Random;

// Получаем доступ через указательPD := @Fractions[Low(Fractions)];for I := Low(Fractions) to High(Fractions) dobeginWrite(PD^:9:5);Inc(PD); // Указываем на следующий элемент

end;Writeln;// Обычный доступ по индексуfor I := Low(Fractions) to High(Fractions) doWrite(Fractions[I]:9:5);

Writeln;Readln;

end.

Page 21: VR-Online (June 2010)

Dec. Пример:

Delphi 2009

В Delphi 2009 и выше арифметика указателей, по­мимо типа PChar (и PAnsiChar и PWideChar), так­же применима и для других типов указателей.Где и когда это становится возможным ­ контроли­руется директивой компилятора$POINTERMATH.По­умолчанию, арифметика указателей выключе­на, но она может быть включена для участка ко­да, используя директиву $POINTERMATH ON, ивыключена после него с помощью$POINTERMATH OFF. Директива также можетприменяться при объявлении типа указателя.При этом арифметика с указателями будет до­ступна для этого типа в любом коде без предва­рительной обёртки в директивы $POINTERMATH.Помимо операций инкремента/декремента, но­вая арифметика указателей в Delphi 2009 такжедопускает индексацию.Сейчас, кроме типов PChar, PAnsiChar иPWideChar, единственным типом с поддержкойарифметики указателей по­умолчанию являетсяPByte. Но вы можете включить её для любого ти­па, как например, PInteger. Это значительно упро­стит код из примера выше:

Так что теперь у нас нет необходимости объяв­

лять специальный тип PIntegerArray. Также вме­сто PInt[I] можно использовать синтаксис (PInt +I)^, который приводит к тому же результату.Кажется, в Delphi 2009 новая арифметика указа­телей не работает, как ожидается, для указа­телей на обобщённые типы (generics). С какимбы параметрическим типом вы не инстанцииро­вали тип, индексы не масштабируются наSizeOf(T), как это ожидается.Ссылки (References)

Многие типы в Delphi фактически являются ука­зателями, но притворяются простыми типами. Яназываю такие типы ссылочными. Примерамитаких типов являются динамические массивы,строки, объекты и интерфейсы. Все они являют­ся указателями "под капотом" языка, но с некото­рой дополнительной семантикой и часто соскрытым содержанием.* Динамические массивы (dynamic arrays)* Многомерные динамические массивы* Строки (Strings)* Объекты (Objects)* Интерфейсы (Interfaces)* Ссылочные параметры* Нетипизированные параметры

Что отличает ссылки (references) от указателей(pointers):* Ссылки неизменяемы. Вы не можете уве­личить или уменьшить ссылку. Ссылки указыва­ют на определённые структуры, но никогда неуказывают в середину них, как, например, указа­тели на данные массива в примерах выше.

* Ссылки не используют синтаксис указателей.Это скрывает тот факт, что они являются указа­телями, и делает их сложнее для понимания длятех, кто не знаком с этой темой (и поэтому людиделают с ними вещи, которых делать нельзя).Не путайте такие ссылки со ссылочными типами(reference types) в C++. Они во многом отличают­ся.Динамические массивы (dynamic arrays)

До Delphi 4 в языке не было динамических мас­сивов, но они существовали как концепция. Ди­намический массив ­ это блок выделеннойпамяти, которая управляется через указатель.Динамические массивы могут расти или умень­шаться. Фактически это означает, что выделяет­ся новый блок памяти для массива новой длины,в то время как старая память ещё не отпускает­ся. После чего содержимое старой памяти копи­руется в новую, и старый блок памяти в концеудаляется, а указатель (ссылка) массива начина­ет указывать на новый блок памяти.Динамические массивы (например, array ofInteger) в Delphi работают точно так же. Но биб­лиотека runtime добавляет специальный код, ко­торый управляет доступом и присваиваниями. В

Кодинг21

vr­online | июнь 2010

typePIntegerArray = ^TIntegerArray;TIntegerArray = array[0..65535] of Integer;

varBuffer: Pointer; // трактуется как packed array of Integer;PInt: PInteger;PArr: PIntegerArray;...// С использованием арифметики указателей:PInt := Buffer;for I := 0 to Count ­ 1 dobeginWriteln(PInt^);Inc(PInt);

end;// Используя преобразование типа, указатель на массив ииндексирование:PArr := PIntegerArray(Buffer);for I := 0 to Count ­ 1 doWriteln(PArr^[I]);

...end;

$POINTERMATH ONvarBuffer: Pointer; // трактуется как packed array of Integer;PInt: PInteger;...// С использованием новой арифметики указателей:PInt := Buffer;for I := 0 to Count ­ 1 do Writeln(PInt[I]);...

end;$POINTERMATH OFF

Page 22: VR-Online (June 2010)

участке памяти ниже адреса, на который указыва­ет ссылка массива, располагаются служебныеданные массива: два поля ­ число выделенныхэлементов и счётчик ссылок (reference count).

Если, как на диаграмме выше, N ­ это адрес впеременной динамического массива, то счётчикссылок массива лежит по адресу N ­ 8, а числовыделенных элементов (указатель длинны) ле­жит по адресу N ­ 4. Первый элемент массива (са­ми данные) лежит по адресу N.Для каждой добавляемой ссылки (т.е. при присва­ивании, передаче как параметр в подпрограммуи т.п.) увеличивается счётчик ссылок, а для каж­дой удаляемой ссылки (т.е. когда переменная вы­ходит из области видимости или припереприсваивании или присваивании nil) счётчикуменьшается.Доступ к данным динамических массивов с помо­щью низко­уровневых процедур типа Move илиFillChar, или любых других подпрограмм, получа­ющих доступ сразу ко всему массиву, наподобиеTStream.Write, часто выполняется неправильно.Для обычного массива (его часто называют так­же статическим массивом ­ в противоположностьдинамическому массиву) переменная массиватождественна его данным. Для динамическогомассива это не так (см. диагармму выше). Такчто если вы хотите получить доступ к данныммассива ­ вы не должны использовать саму пере­менную массива, а использовать вместо неё пер­вый элемент массива.

Заметьте, что в примере выше Stream.Write ис­пользует нетипизированный var параметр, кото­рый также является ссылочным типом. Мы ещёобсудим их ниже.Многомерные динамические массивы

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

Ну, это выглядит как многомерный динамическиймассив и, действительно, мы можем обращатьсяк нему как MyIntegers[0, 3]. Но на самом деле этообъявление следует скорее читать как (тут я поз­воляю себе некоторые вольности с синтакси­сом):

Или, чтобы сделать совсем явным, это фактиче­ски означает следующее:

Как вы можете видеть, TMultiIntegerArray факти­чески является одномерным массивом из указа­телей TSingleIntegerArray. Это означает, чтоданные TMultiIntegerArray не хранятся в одномбольшом непрерывном участке памяти по стро­кам и столбцам, но является, скорее, разорван­ным массивом, т.е. каждый элемент ­ простоуказатель на другой массив, и каждый из этихпод­массивов имеет свой размер. Так что вместо

(что создаст 10 TSingleIntegerArrays по 20 Integerв каждом ­ т.е. прямоугольный массив), вы може­те получить доступ к любому из под­массивов иустановить его длину индивидуально:

Строки (Strings)Should array indices start at 0 or 1? My compromise of 0.5was rejected without, I thought, proper consideration.— Stan Kelly­BootleСтроки во многом похожи на динамические мас­сивы. Они также имеют счётчик ссылок, у них по­хожая внутренняя структура (со счётчикомссылок и указателем длинны ниже самих дан­ных, по тем же смещениям).

Кодинг22

vr­online | июнь 2010

varItems: array of Integer;...// Неправильно: передаётся адрес переменной ItemsMyStream.Write(Items, Length(Items) * SizeOf(Integer));...// Правильно: передаётся адрес первого элементаMyStream.Write(Items[0], Length(Items) * SizeOf(Integer));

typeTMultiIntegerArray = array of array of Integer;

varMyIntegers: TMultiIntegerArray;

typeTMultiIntegerArray = array of (array of Integer);

typeTSingleIntegerArray = array of Integer;TMultiIntegerArray = array of TSingleIntegerArray;

SetLength(MyIntegers, 10, 20);

SetLength(MyIntegers, 10);SetLength(MyIntegers[0], 40);SetLength(MyIntegers[1], 31);// и т.д...

Page 23: VR-Online (June 2010)

Но есть и различия между ними в синтаксисе исемантике. Вы не можете присвоить строке nil ­вместо этого вы присваиваете ей '' (пустую стро­ку). Строки могут быть константами (со счётчи­ком ссылок равным ­1, что являетсяспециальным указанием для библиотеки runtime:она не будет пытаться увеличивать или умень­шать его или удалять строку). Первый элементстроки имеет индекс 1, в то время как в массивеэто 0.Объекты (Objects)

Объекты ­ или, более точно, экземпляры классов(class instances) — не имеют автоматическогоуправления временем жизни. Их внутренняяструктура проста. Каждый экземпляр класса со­держит по смещению 0 (т.е. ровно по адресу, накоторый указывает ссылка переменной объекта)указатель на так называемую таблицу VMT. Онапредставляет собой таблицу с указателями накаждый виртуальный метод класса. По отрица­тельным смещениям от начала таблицы лежитмного другой полезной информации о классе. Яне буду вдаваться в подробности в этой статье.Для каждого класса есть только одна VMT табли­ца (а не для каждого объекта!).Классы, которые реализуют интерфейсы (см. ни­же), также имеют похожие указатели на таблицы,которые содержат ссылки на методы, реализую­щие интерфейс, по одному на каждый реализуе­мый интерфейс. Эти таблицы также содержатнекоторую информацию по отрицательным сме­щениям. По каким смещениям в объекте распола­гаются эти указатели ­ определяется структурой(полями) родительского класса. За этим следиткомпилятор.После указателей на VMT и все таблицы интер­фейсов, идут обычные поля объекта, которыехранятся ровно как в записях (record).Данные RTTI и другая информация о классах по­лучаются следованием по ссылке переменной наданные объекта (которая также указывает на ука­затель на таблицу VMT), а затем следованием поссылке на VMT. Далее компилятор уже знает, гденайти интересующие его данные, обычно черезсложные структуры, содержащие указатели надругие структуры, иногда даже с рекурсивнымиссылками.Ниже следует пример. Предположим, что у насесть такое объявление:

Тогда раскладка объекта в памяти будет выгля­деть примерно вот так:

Интерфейсы (Interfaces)

Интерфейсы, фактически, представляют собойпросто коллекцию (набор) методов. Внутреннеони представленны указателями на указатели намассив указателей на код. Представим, что у насесть следующие объявления:

Тогда отношения между интерфейсов, реализую­щим его объектом и классом, а также методамибудет выглядеть вот так:

Кодинг23

vr­online | июнь 2010

typeTWhatsit = class(TAncestor, IPrintable, IEditable,IComparable)

// другие поля и объявления методовprocedure Notify(Aspect: TAspect); override;procedure Clear; override;procedure Edit;procedure ClearLine(Line: Integer);function Update(Region: Integer): Boolean; virtual;

// т.д. и т.п.end;

varWhatsit: TWhatsit;

beginWhatsit := TWhatsit.Create;

typeIEditable = interfaceprocedure Edit;procedure ClearLine(Line: Integer);function Update(Region: Integer): Boolean;

end;TWhatsit = class(TAncestor, IPrintable, IEditable,IComparable)publicprocedure Notify(Aspect: TAspect); override;procedure Clear; override;procedure Edit;procedure ClearLine(Line: Integer);function Update(Region: Integer): Boolean; virtual;// etc...

end;varMyEditable: IEditable;

beginMyEditable := TWhatsit.Create;

Page 24: VR-Online (June 2010)

Переменная MyEditable указывает на указательIEditable в объекте, созданном TMyClass.Create.Заметим, что MyEditable не указывает на началообъекта, а куда­то в его середину. Далее, указа­тель MyEditable в объекте указывает на таблицууказателей ­ по одному указателю на каждый ме­тод в интерфейсе. Каждая из таких записей ука­зывает на кусочек­кода: заглушку (stub). Этотслужебный код корректирует указатель Self (кото­рый к моменту вызова фактически равенMyEditable), чтобы он указывал на начало объек­та, с помощью отнимания смещения указателяIEditable в объекте от переданного в код указате­ля, а затем вызывает настоящий метод. Эта за­глушка вводится для каждой реализации методакаждого интерфейса, реализуемого классом.Пример: предположим у нас есть экземпляр поадресу 50000, а указатель на реализациюIEditable классом TWhatsit лежит по смещению16 в каждом экземпляре. Тогда переменнаяMyEditable будет содержать 50016. УказательIEditable по адресу 50016 будет указывать на та­блицу интерфейса для нашего класса (котораялежит, скажем, по адресу 30000), элементы кото­рой указывают на заглушку (скажем, по адресу60000). Заглушка увидит значение 50016 (кото­рое передаётся ей как параметр Self), вычтет изнего смещение 16 и получит 50000. Это и будетнастоящий адрес реализующего интерфейсобъекта. Затем заглушка вызывает настоящийметод, передавая ему 50000 в качестве парамет­ра Self.В диаграмме я, для ясности, опустил заглушкидля методов QueryInterface, _AddRef и _ReleaseНу, теперь вы видите, почему иногда я люблю ис­пользовать бумагу и ручку? ;­)Ссылочные параметры

Ссылочные параметры часто называются var­па­раметрами, а также out­параметрами или пара­метрами, передаваемыми по ссылке.Ссылочные параметры ­ это такие параметрыподпрограммы, для которых не само значение па­раметра передаётся и/или возвращается из под­программы, а только указатель на него. Пример:

Это более или менее эквивалентно следующему:

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

значением, а не с указателем.* Ссылочные параметры не могут быть изме­нены (имеется ввиду сам параметр, а не его зна­чение). Использование имени параметра даётвам значение параметра ­ вы не можете изме­нить указатель или инкрементировать/декремен­тировать его.

* Вы должны передать что­то, что имеет адрес­ т.е. реальную память, если только вы не ис­пользуете трюк с приведением типов. Так что,имея ссылочный параметр типа Integer, вы неможете передать, например, 17, 98765 илиAbs(MyInteger). Передаваемый параметр долженбыть переменной (это включает в себя такжеэлементы массива, поля записей и объектов ит.д.).* Фактические параметры обязаны быть тогоже типа, как и параметры в объявлении подпро­граммы, т.е. вы не можете передать TEdit, есливы объявили параметр как TObject. Чтобы избе­жать этого, вы можете использовать только нети­пизированные ссылочные параметры (см. ниже).Прим. пер.: как это сделано в, например,FreeAndNil.

Синтаксически, наверное, кажется, что прощеиспользовать ссылочные параметры, чем явныеуказатели. Но вы должны быть в курсе некото­рых особенностей. Чтобы передавать указатели,вы должны увеличить уровень косвенности наединичку. Другими словами, если у вас есть ука­затель P на Integer, то чтобы передать его, выдолжны синтаксически передавать P^ (хотя наделе будет передаваться сам P), например:

Прим. пер.: на самом деле по ссылке такжепередаются почти любые типы, размер которыхбольше SizeOf(Pointer), даже если вы не указалиvar или out. Например, запись из 8 байт будетпередаваться по ссылке. Хотя с точки зрениясинтаксиса никаких указателей вы опять не уви­дите (хотя без наличия модификатора const бу­дет сделана локальная копия). Аналогично: еслифункция возвращает тип, размер которогобольше SizeOf(Pointer), то на самом деле вфункцию будет передан указатель на память, ку­да надо записать результат. Т.е. функция

Кодинг24

vr­online | июнь 2010

procedure SetBit(var Int: Integer; Bit: Integer);beginInt := Int or (1 shl Bit);

end;

procedure SetBit(Int: PInteger; Bit: Integer);beginInt^ := Int^ or (1 shl Bit);

end;

procedure SetBit(var Int: Integer; Bit: Integer);begin...

end;...varInt: Integer;Ptr: PInteger;Arr: array of Integer;

begin// Инициализация Int, Ptr и Arr не показана...SetBit(Ptr^, 3); // Передаётся сам PtrSetBit(Arr[2], 11); // Передаётся @Arr[2]SetBit(Int, 7); // Передаётся @Int

typeTRec = recordA: Integer;

Page 25: VR-Online (June 2010)

На самом деле трактуется как:

Или:

Нетипизированные параметры

Нетипизированные параметры также являютсяссылочными параметрами, но они могут быть ли­бо var, либо const либо out. Вы можете переда­вать в этот параметр любой тип данных, чтоделает эти виды параметров пригодными для на­писания подпрограмм, которые принимают почтичто угодно, любого размера и типа, но это такжеозначает, что вы должны как­то указать подпро­грамме на тип передаваемого аргумента ­ либоотдельным параметром, либо просто по соглаше­нию, либо же тип параметра значения не имеет.Внутренне нетипизированные параметры тожепередаются как указатели на реальное значениепараметра. Ниже идёт два примера. Первый изних ­ это общая подпрограмма для заполненияпроизвольного буфера набором байт, т.е. типпередаваемой переменной не имеет значения:

Второй пример ­ это метод TIntegerList ­ дочер­него класса для TTypedList:

Как вы можете видеть, чтобы использовать ука­затель, вы должны явно взять адрес параметра,несмотря на тот факт, что фактически параметрвнутренне уже является указателем. И опять­та­ки: уровень косвенности сдвинут на единицу.Чтобы получить доступ к значению нетипизиро­ванного параметра, вы можете использовать егокак обычный ссылочный параметр, но только выдолжны сделать приведение к типу, чтобыкомпилятор знал, как обращаться с параметром.Я уже упоминал уровень косвенности (level ofindirection). Вы уже видели это в действии.Например, если вы хотите инициализировать ди­намический массив с помощью FillBytes, то вы непередаёте в FillBytes саму переменную массива,а только первый элемент массива. Фактически,вы также можете передать первый элемент ста­тического массива для достижения такого же эф­фекта. Таким образом, если вы передаётелюбой массив в подпрограмму с нетипизирован­ным ссылочным параметром, то, по моему мне­нию, ваш лучший выбор ­ всегда передаватьпервый элемент массива, чтобы не зависеть оттипа массива (динамический или статический)(тем более, что вы потом можете изменить объ­явление ­ и попробуйте тогда найти ошибку в ко­де).Структуры данных

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

Кодинг25

vr­online | июнь 2010

B: Integer;end;

function GetRec: TRec;beginResult.A := 1;Result.B := 2;

end;

procedure GetRec(out Result: TRec);beginResult.A := 1;Result.B := 2;

end;

typePRec = ^TRec;

procedure GetRec(Result: PRec);beginResult^.A := 1;Result^.B := 2;

end;

// Пример подпрограммы, для которой не важен тип пара­метраprocedure FillBytes(var Buffer; Count: Integer; Values: array ofByte);varP: PByte;I: Integer;LenValues: Integer;

beginLenValues := Length(Values);if LenValues > 0 thenbeginP := @Buffer; // Считаем буфер массивом байт.I := 0;while Count > 0 dobeginP^ := Values[I];I := (I + 1) mod LenValues;Inc(P);Dec(Count);

end; end; end;

function TIntegerList.Add(const Value): Integer;beginGrow(1);Result := Count ­ 1;// FInternalArray: array of Integer;FInternalArray[Result] := Integer(Value);

end;

Page 26: VR-Online (June 2010)

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

Я попытался дать вам своё видение указателей.Есть и другие подходы, но, по моему мнению, ис­пользование диаграмм (не важно, насколько при­митивных) со стрелочками ­ это неплохой способразобраться в сложных проблемах с указателя­ми, или для понимания как же связаны вместе ин­терфейсы, объекты, классы и код. Это неозначает, что я начинаю рисовать диаграммыдля каждой проблемы. Только для сложных.Эта статья пыталась показать, что указатели по­всюду, даже если вы их не видите. Это не причи­на для паранойи, но понимание указателей и ихмеханизмов, по моему мнению, необходимо дляизбегания многих ошибок.

Кодинг26

vr­online | июнь 2010

Page 27: VR-Online (June 2010)

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

К сожалению, с ещё большей скоростью растётколичество информации. Поэтому, проблеманехватки места на дисках будет существоватьвсегда.К счастью не все файлы имеютравновероятностное содержимое и не всефайлы не имеют повторяющихся предложений.Благодаря этому архиваторы могут сжиматьфайлы, и у нас ещё остается свободное место надиске для заветного фильма.Меня всегда интересовал вопрос, а каксобственно эти архиваторы работают? Недолгодумая, я познакомился с очень хорошималгоритмом ­ алгоритмом Хаффмана. Этоталгоритм благодаря универсальности иоптимальности, применяется со всемисуществующими алгоритмами сжатия. Дажепопулярный WinRar на последней стадии сжатияпользуется этим алгоритмом.Существует множество реализаций данногоалгоритма. К сожалению я не нашел такойреализации на языке Java Script. Следуетсказать, что толкнуло меня на написание такойреализации ­ сделать сжатие html страниц припомощи java script. Таким же образом можнобыло бы закодировать html странички. То естькаждый раз Java Script берёт из некого элементазакодированное и начинает при помощиdocument.write выводить все на экран. Зачем это

нужно, когда браузер и так все сжимает? Видимохотелось самому это все проделать. Так илииначе, но я добился совершенно другой цели ­демонстрация метода сжатия Online.Первая функция:function numberToCode(n)

var ret = '';for (i = 0; i < 8; i++)

ret = n % 2 + ret;n = Math.ceil((n ­ n % 2)/ 2);

return ret;

Кодирует любое число в двоичную системусчисления. Для этого число делится восемь разна 2. Остаток от деления прибавляется квозвращаемому результату.function codeToNumber(c)

var ret = 0;for (var i = 7; i >=0 ; i­­)

ret += Math.pow(2,i) * parseInt(c[7 ­ i]);return ret;

Обратная функция. Складываем различныестепени 2ки.А теперь функции кодирования строк.function stringToCode(s)

var ret = '';for (var i = 0; i < s.length; i++)ret += numberToCode(s.charCodeAt(i));return ret;

function codeToString(s)

var ret = '';for (var i = 0; i < s.length; i = i + 8)ret +=String.fromCharCode(codeToNumber(s.substring(i, i + 8)));return ret;

Первая получает строку в виде двоичной записи,

Java ScriptСжатие данныхАлгоритм Хаффмана

27

vr­online | июнь 2010

Автор

:Stag

nantIce

Кодинг

Page 28: VR-Online (June 2010)

для этого каждый символ преобразуется в число,затем это число преобразуется при помощи уженаписанных функций в двоичную системусчисления. Вторая функция делает тоже самое,но наоборот.Теперь настала пора сказать пару слов о самомметоде. Метод Хаффмана используетвероятность вхождения символов. Вероятностьсимвола можно посчитать как количествовхождений этого символа в файл деленное наразмер этого файла в байтах.Например, есть файл с содержимым:< html >< body >< /body >< /html >Вероятность вхождения символа 'h' ­ 1/14, '<' ­1/7Алгоритм

На начальном этапе у нас есть объекты –символы. У каждого объекта есть свойства: код(строка, пустая в начале), свойство вероятность(число) и свойство boolean (имеет родителя илинет). В алгоритме мы строим дерево. Концыдерева ­ все символы, которые входят в файлхотя бы один раз. Начало дерева ­ набор из этихвсех символов. Чем больше вероятностьвхождения символа ­ тем короче будет путь поэтому дереву к символу.1) Находим два элемента с самой низкойвероятностью вхождения. Если есть только один,то его вероятность равна 1. Дерево построено,выходим.2) Каждому простому потомку(концу дерева)этого элемента прибавляем код 1 для потомков1го элемента, 0 для потомков второго элемента.Если нет потомков, то прибавляем код к самомуэтому элементу. На первом этапе у нас обаэлемента ­ концы дерева. Первому мыприсваиваем 1, второму 0. Когда мы будемрассматривать их вершину с ещё однимэлементом, то мы к этим кодам прибавим сноваразные номера. Таким образом, каждый путь подереву к символу будет иметь уникальный код из1 и 0.3) Создаем новый элемент, состоящий из этихдвух с вероятностью равной сумме вероятностейи не имеющий родителей входящих элементов.Чтобы не рассматривать более потомков этогоэлемента, приравниваем нулю их вероятностьвхождения. Таким образом, один элементостается всегда ­ сумма ранее двухрассмотренных. Теперь эти элементы имеютродителем новый элемент. Не забудем указатьэто в свойствах.4) Перейдем к шагу 1.Функции:function getMax(obj) //Поиск символа сминимальной вероятностью.

var max = 0; var kk = '';for (var k in obj)if ((obj[k].count > max)&&(obj[k].use == true)) min =obj[k].count; kk = k;return kk;

function bool(b) //Преобразование boolean в строку

if (b) return '1'; else return '0';

function pack(s) //на входе то, что надо упаковать.

var ret = '';var obj = ; //наши символыfor (var i = 0; i < s.length; i++) //Считаемвероятности, указываем что нет родителей.

if (obj[s[i]] == null) obj[s[i]] = count:0, code:'',use:false;obj[s[i]].count += 1;

var c = true;for (var r in obj) // вершин не больше чем символов

var k1 = getMin(obj); //Ищем 1ый элементif (k1 == '') break;obj[k1].use = true;var k2 = getMin(obj); //Ищем 2ой элементif (k2 == '') break;obj[k2].use = true;for (var j = 0; j < k1.length; j++) //К потомкампервого прибавляем код.obj[k1[j]].code = bool(c) + obj[k1[j]].code;for (var j = 0; j < k2.length; j++)/ /К потомкамвторого прибавляем код.obj[k2[j]].code = bool(!c) + obj[k2[j]].code;//Добавляем новый элементobj[k1+k2] = count:obj[k1].count +obj[k2].count, code:'', use:false;

//Кодируем строкуfor (var i = 0; i < s.length; i++)

ret += obj[s[i]].code;

//Строим объект для раскодированияvar pp = ;for (var f in obj)if (f.length == 1) pp[f] = obj[f].code;//Добавляем нули и число добавленных нулей вобъект, если длина кода не делится на 8.pp['end'] = 0;var z = ret.length % 8;if ( z != 0)

for (var i = 0; i < 8 ­ z; i++)ret += '0';pp['end'] = 8 ­ z;

//Возвращаем объект для раскодирования изакодированный текст.return JSON.stringify(pp) + codeToString(ret);

Кодинг28

vr­online | июнь 2010

Page 29: VR-Online (June 2010)

Теперь функция распаковки.function unpack(s)

var i = s.indexOf('"end":') + 8; //Ищем объект дляраспаковки.//Получаем закодированную строчкуvar obj = JSON.parse(s.substring(0,i));var ss = stringToCode(s.substring(i, s.length));ss = ss.substring(0, ss.length ­ obj.end);var ret = '';var error; //Если не нашли код, то будем прерыватьцикл.while(ss.length > 0)

error = true;for (var g in obj) //Поиск символа по коду.

if (obj[g].length <= ss.length)

if (ss.substring(0,obj[g].length) == obj[g]) ret += g; ss =ss.substring(obj[g].length, ss.length); error = false; break;

if (error) alert('Error for parse: ' + ss); break;

return ret; //Возвращаем раскодированный текст.

Как это все работает, вы можете посмотретьonline по ссылкеhttp://nets.hop.ru/download/code.html Следуетсказать, что пример не работает в IE из­за того,что браузер не знает что такое объект JSON .Поэтому вывести так просто объект в видестроки в IE не получится. Но это уже другаязадача и решается просто перебором всехсвойств объекта. Сам алгоритм останетсяпрежним.

Кодинг29

vr­online | июнь 2010

Page 30: VR-Online (June 2010)

30

Си является очень популярным языкомпрограммирования, поэтому библиотек для негосоздано немереное количество библиотек. А вотбиблиотек для Delphi ­ не очень много, поэтомубыло бы хорошо использовать некоторую частьот огромного количества библиотек напрямую, непереводя код этих библиотек на Delphi. Ксчастью, Delphi позволяет ссылаться наскомпилированные объектные файлы Си. Ноесть проблема «unsatisfied externals» ­отсутствующие объявления.Си – простой, но одновременно – мощный язык,большая часть функциональности которогоскрыта в используемых библиотеках. Почти весьнеобычный и сложный код помещен в функцииэтих библиотек. Но в базовых библиотеках Delphiнет реализации таких функций. Если простосвязать объектный файл Си с необходимымпроектом – компоновщик выдаст ошибку«unsatisfied external declarations». К счастью, Сипонимает реализацию таких функций,независимо от того, в каком модуле ониопределены. Если компоновщик сумеет найтифункцию с необходимым именем – ее можнобудет использовать. Вы можете применять этивозможности для добавления недостающегофункционала в проекте на Delphi.В этой статье будет показано, как собрать исвязать объектный файл с модулем Delphi, атакже будут представлены все необходимыебиблиотеки на Си. Я воспользуюсь известнымрегулярным выражением для поиска кода,которое написал Генри Спенсер из УниверситетаТоронто. Я только немного изменил его, чтобыможно было использовать с компиляторомBorland C++. Регулярные выражения немногоописаны в справке Delphi, и это очень хорошийспособ определять модели поиска.Объектные файлы

Как правило, Си создает объектные файлы,которые должны быть связаны с исполняемымфайлом. В Win32 такие файлы, обычно, имеютрасширение .obj. Но они бывают разных,несовместимых форматов. Компилятор С++ отMicrosoft и некоторые другие, совместимые с нимкомпиляторы, создают объектные файлы вслегка модифицированном COFF­формате.Поэтому они не могут быть использованы в

Delphi. Для Delphi необходимы объектные фалыв формате OMF. Не существует нормальногопрактического способа преобразоватьобъектный файл из COFF­формата в OMF.Поэтому вам нужен исходный код и компилятор,который генерирует OMF­файлы.Обратите внимание, что утилита COFF2OMF,которая поставляется со многими версиями С++Builder не поможет справится с этой проблемой.Эта утилита предназначена только дляпреобразования библиотеки импорта из одногоформата в другой. Библиотеки импортасодержат информацию только о экспортируемыхфункциях DLL, и могут быть созданы напрямуюиз DLL, используя IMPLIB или подобныеутилиты. Они содержат ограниченноеколичество тех возможностей, которые есть вполноценных библиотеках на Си или С++.COFF2OMF не сконвертирует объектный файл(или библиотеку) языка Си или С++ в COFF­формат (причины озвучены ниже). Поэтому вамдействительно понадобится исходный код икомпилятор Borland для создания объектногоOMF­файла, для использования его в Delphi.Автор программ и разработчик Тедди де Конингутверждает, что COFF2OMF от фирмыDigitalMars может сделать полноепреобразование форматов. Но пока я этого непроверял, но говорят – что она стоит своихденег.Агнер Фог (также разработчик и известный гуруоптимизации) создал утилиту ObjConv, котораясможет преобразовать несколько объектныхфайлов в другие. Мы прилагаем усилия длясоздания генератора OMF и не OMF объектныхфайлов на С++, чтобы их можно былоиспользовать в Delphi.C++ Builder из состава Borland/CodeGearпозволяет создавать такие объектные OMF­файлы. Но не каждый пользователь Delphi имеети С++ Builder. К счастью, Borland создалакомпилятор файлы. Но не каждый пользовательDelphi имеет и С++ Builder. К счастью, Borlandсоздала компилятор командной строки, которыйпоставляется в свободном доступе вместе сBorland C++ Builder 5. Скачивайте его можноздесь:http://www.borland.com/products/downloads/downlo

vr­online | июнь 2010

Автор

перево

да:Тол

мачев

Павел

akaPa

velDe

vАв

тор:R

udyVe

lthuis

Кодинг

DelphiПодружим СИ и DelphiИспользование объектных файлов СИ в Дельфи

Page 31: VR-Online (June 2010)

ad_cbuilder.html. Borland уже выпустила шестуюверсию, так что не ясно, сколько еще бесплатнаяпятая версия компилятора будет доступна.Borland / CodeGear выпустила новый бесплатныйкомпилятор с IDE и Turbo C++ Explorer. Хотя он иимеет то же самое имя, но это уже не тот старыйпродукт Turbo C++, который был выпущен впрошлом веке, это, можно сказать, младшийбрат BDS 2006, но только для одного языка. Выможете скачать версию этого Explorer’a, которыйявляется полноценной IDE со всемнеобходимым, и даже лицензию, котораяпозволяет создавать коммерческие приложения,за исключением возможности устанавливатьновые компоненты в IDE (но вы можетеиспользовать эти компоненты в коде). Его можноскачать со страницы закачки Turbo Explorer’a поадресу: http://www.turboexplorer.com/downloads.Существует ограничение, которое оговаривает –какого рода файлы доступны для использования.Вы можете использовать только объектныефайлы, которые были скомпилированы лишь какСи­фалы (а не С++). По некоторым причинам, укомпоновщика Delphi существуют проблемы собъектными файлами, которые содержат в себеинструкции на С++. Поэтому, ваши исходныефайлы должны иметь расширение «.с», а не«.cpp». Но, поскольку, вы в любом случае неможете использовать напрямую С++ классы –это не является жестким ограничением.Одно замечание: Си часто используетбиблиотеку файлов с расширением «.lib». Онипросто содержат несколько объектных файлов.Некоторые компиляторы Си поставляютсявместе с библиотечными программами дляизвлечения, вставки, замены или просмотра этихобъектных файлов. В Delphi вы не сможетенапрямую указывать ссылки на эти .lib­файлы.Но вы можете использовать утилиту TDUMP,которая поставляется с Delphi и С++Builder,чтобы посмотреть – что хранится в этих файлах.Бесплатный С++ компилятор поставляется сбиблиотечной программой TLIB.Код

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

такое соответствие найдено).Сделать полное описание кода для поиска, спомощью регулярного выражения, довольносложно и объемно, поэтому я не буду приводитьего. Но заголовочный файл, конечно, важен прииспользовании объектного файла в Delphi.Скачать можно здесь:http://www.rvelthuis.de/zips/cobjs.zip.

/***************************************************************************//* *//* regexp.h *//* *//* Copyright (c) 1986 by Univerisity of Toronto*//* *//* This public domain file was originally written by HenrySpencer for the *//* University of Toronto and was modified and reformatted byRudy Velthuis *//* for use with Borland C++ Builder 5. *//* *//***************************************************************************/#ifndef REGEXP_H#define REGEXP_H#define RE_OK 0#define RE_NOTFOUND 1#define RE_INVALIDPARAMETER 2#define RE_EXPRESSIONTOOBIG 3#define RE_OUTOFMEMORY 4#define RE_TOOMANYSUBEXPS 5#define RE_UNMATCHEDPARENS 6#define RE_INVALIDREPEAT 7#define RE_NESTEDREPEAT 8#define RE_INVALIDRANGE 9#define RE_UNMATCHEDBRACKET 10#define RE_TRAILINGBACKSLASH 11#define RE_INTERNAL 20#define RE_NOPROG 30#define RE_NOSTRING 31#define RE_NOMAGIC 32#define RE_NOMATCH 33#define RE_NOEND 34#define RE_INVALIDHANDLE 99#define NSUBEXP 10/**Первый байт регулярного выражения внутри "program" насамом деле*«магическое» число; начало узла ­ со второго байта.*/#define MAGIC 0234#pragma pack(push, 1)typedef struct regexp

char *startp[NSUBEXP];char *endp[NSUBEXP];

char regstart; /* Только для внутреннегоиспользования. */char reganch; /* Только для внутреннегоиспользования. */char *regmust; /* Только для внутреннегоиспользования. */int regmlen; /* Только для внутреннегоиспользования. */

Кодинг31

vr­online | июнь 2010

Page 32: VR-Online (June 2010)

char program[1]; /* Только для внутреннегоиспользования. */ regexp;#ifdef __cplusplusextern "C" #endifextern int regerror;extern regexp *regcomp(char *exp);extern int regexec(register regexp* prog, register char*string);extern int reggeterror(void);extern void regseterror(int err);extern void regdump(regexp *exp);#ifdef __cplusplus#endif#pragma pack(pop)#endif // REGEXP_H

Заголовочный файл, описанный выше,определяет некоторые постоянные значения,структуры для передачи информации междукодом регулярного выражения и кодом, которыйего вызвал. А также – между различнымифункциями кода и функциями, которые можетвызвать пользователь.#define – это значения констант, начинающихся сприставки RE_, которые были возвращены из техфункций, которые оповещают об успехе илиошибке. NSUBEXP – это число подвыражений,которые можно создать в реализациирегулярного выражения. Число, называемоеMAGIC, это значение, которое должноприсутствовать в каждом скомпилированномрегулярном выражении. Если оно отсутствует,структура, очевидно, не содержитдействительного скомпилированного регулярноговыражения. Обратите внимание, что запись 0234­ не цифровое значение. Начальный нольговорит компилятору о том, что этовосьмеричное значение. Как шестнадцатеричноечисло использует 16 за основу системысчисления, так десятичное число использует 10,а восьмеричное – 8. Десятичное значениерассчитывается следующим образом:0234(oct) = 2 * 82 + 3 * 81 + 4 * 80 = 128 + 24 + 4 =156(dec).#pragma pack(push, 1) увеличивает текущеесостояние выравнивания, устанавливая егона побайтовое выравнивание. Это важно, таккак это делает структуры совместимыми супакованными записями (packed record)Delphi.Компиляция кода

Если у вас есть С++ Builder или BDS2006 –будет легче скомпилировать код. Высоздаете новый проект и добавляете к немуфайл «regexp.c» с использованием пунктовменю «Project», «Add to project» – икомпилируете проект. В результате этого,каталог будет содержать файл «regexp.obj».

Если у вас есть компилятор командной строки ион настроен правильно, то откройте команднуюстроку, перейдите в директорию, содержащуюфайл «regexp.c» и введите:bcc32 ­c regexp.cВозможно, вы получите предупреждение онеиспользуемых переменных или потерезначащих цифр при преобразованиях(«unsatisfied externals»), но вы можете сейчас ихпроигнорировать, поскольку вы код не писали. Яиспользую этот код уже много лет – и проблемпока не было. После компиляции, вы сможетенайти объектный файл «regexp.obj» в том жекаталоге, что и исходный файл.Чтобы сейчас импортировать объектный файл вDelphi, вы должны скопировать его в директории,где находятся исходники на Delphi.Импорт объектных файлов.

Чтобы использовать этот код в объектномфайле, вы должны написать несколькообъявлений. Компоновщик Delphi ничего незнает о параметрах функций, о типахрегулярных выражений в заголовках, и означениях, который были определены вфайле «regexp.h». Это также не означает,что соглашения о вызовах былииспользованы. Для этого вы можетенаписать модули импорта.Вот интерфейсная часть модуля Delphi,который используется для импорта функцийи значений из объектного файла Си в Delphi:unit RegExpObj;interfaceconstNSUBEXP = 10;

*Первый байт регулярного выражения внутри "program" насамом деле*«магическое» число; начало узла ­ со второго байта.MAGIC = 156;typePRegExp = ^_RegExp;_RegExp = packed recordStartP: array[0..NSUBEXP ­ 1] of PChar;EndP: array[0..NSUBEXP ­ 1] of PChar;RegStart: Char; // Internal use only.RegAnch: Char; // Internal use only.RegMust: PChar; // Internal use only.RegMLen: Integer; // Internal use only.Prog: array[0..0] of Char; // Internal use only.

end;function _regcomp(exp: PChar): PRegExp;cdecl;function _regexec(prog: PRegExp; str: PChar):LongBool; cdecl;function _reggeterror: Integer; cdecl;procedure _regseterror(Err: Integer); cdecl;end;

function _regcomp(exp: PChar): PRegExp; cdecl;function _regexec(prog: PRegExp; str: PChar): LongBool;cdecl;function _reggeterror: Integer; cdecl;procedure _regseterror(Err: Integer); cdecl;

Кодинг32

vr­online | июнь 2010

Page 33: VR-Online (June 2010)

Вы заметите, что все функции начинаются сознака подчеркивания. Это все потому, что, поисторическим причинам, большинство Си­компиляторов генерируют код, в которомфункции начинаются со знакаподчеркивания. Чтобы импортировать их, выдолжны использовать названия, со знаком«_» вначале. Вы могли бы сказать, что спомощью компилятора С++ Builder можнопропустить подчеркивания, но я, обычно,этого не делаю. Подчеркивания яснопоказывают, что мы используем Си­фукции.Они должны быть объявлены сиспользованием соглашения о вызове вязыке Си, который называется cdecl на языкеDelphi. Забыв про это ­ можно получитьмного ошибок, которые очень трудноотследить.Оригинальный код Генри Спенсера не имелфункций reggeterror() и regseterror(). Ядолжен был описать их, так как вы не можетеиспользовать переменные в объектныхфайлах со стороны Delphi напрямую, а кодтребует возможности сбрасывать сообщенияоб ошибках в ноль, и получать сообщения обошибках. Но вы можете использоватьпеременные Delphi из объектных файлов Си.Иногда объектные файлы требуют, чтобыприсутствовали внешние переменные. Еслиони не существуют, вы можете объявить ихгде­нибудь в вашем коде на Delphi.В идеале, часть раздела реализации будетвыглядеть следующим образом:implementationusesSysUtils;

$LINK 'regexp.obj'function _regcomp(exp: PChar): PRegExp; cdecl; external;function _regexec(prog: PRegExp; str: PChar): LongBool; cdecl;external;

function _reggeterror: Integer; cdecl; external;procedure _regseterror(Err: Integer); cdecl; external;end.Но если вы скомпилируете этот код,компоновщик Delphi будет жаловаться наотсутствующие объявления («unsatisfiedexternals»). Модули Delphi должны будутописать их. Большинство функций довольнопросты и легко могут быть написаны наDelphi. Только функции, которые принимаютпеременное число аргументов, такие какprintf() или scanf(), нельзя закодировать безиспользования сборщика. Возможно, еслибы вы нашли код printf() или scanf() вбибилиотеках С++, вы могли бы извлечьобъектный файл, а также связать его. Яникогда не пробовал делать это.

Коду регулярных выражений необходимабиблиотечная функция Си malloc() длявыделения памяти, strlen() для вычислениядлины строки, strchr() для поиска одногосимвола в строке, strncmp() для сравнениядвух строк, strcspn() чтобы найти первойсимвол подстроки в строке.Первые четыре функции простые, и могутбыть написаны одной строкой на Delphi, таккак в ней уже есть подобные функции. Нодля strcspn() нет аналогичной функции вбиблиотеке кода на Delphi, поэтому онадолжна быть создана с нуля (ручками). Ксчастью, у меня есть (правда, довольноскверный) код на Си этой функции, толькокак перевод этой функции в Delphi. Впротивном случае, я очень тщательнодолжен был бы прочитать ее спецификацию,и попробовать реализовать ее сам.Недостающая часть раздела реализациивыглядит следующим образом:// так как этот блок обеспечивает код для _malloc() – онможет использовать// FreeMem и получить PRegExp. Но обычно – _regfree –самое лучшее решение.function _malloc(Size: Cardinal): Pointer; cdecl;beginGetMem(Result, Size);

end;function _strlen(const Str: PChar): Cardinal; cdecl;beginResult := StrLen(Str);

end;function _strcspn(s1, s2: PChar): Cardinal; cdecl;varSrchS2: PChar;

beginResult := 0;while S1^ <> #0 dobeginSrchS2 := S2;while SrchS2^ <> #0 dobeginif S1^ = SrchS2^ thenExit;

Inc(SrchS2);end;Inc(S1);Inc(Result);

end;end;function _strchr(const S: PChar; C: Integer): PChar; cdecl;beginResult := StrScan(S, Chr(C));end;function _strncmp(S1, S2: PChar; MaxLen: Cardinal): Integer;cdecl;beginResult := StrLComp(S1, S2, MaxLen);

end;end;

Кодинг33

vr­online | июнь 2010

Page 34: VR-Online (June 2010)

function _strncmp(S1, S2: PChar; MaxLen: Cardinal): Integer;cdecl;beginResult := StrLComp(S1, S2, MaxLen);

end;Как вы можете увидеть, эти функции должныбыть объявлены как cdecl и начинаться со знакаподчеркивания. Имена функций чувствительны крегистру, поэтому важно их правильно писать.В моем проекте я не использую этот код.Структура _RegExp содержит информацию,которая не должна быть изменена извне, это неочень удобно. Поэтому я упаковал ее внесколько простых функций, также используяфункцию RegFree, которая просто вызываетFreeMem, поскольку с помощью _malloc() яиспользую GetMem. В идеале, код регулярноговыражения должен обеспечить функциюregfree().Весь исходный код на Си, код модулей дляимпорта и упакованных модулей, а также оченьпростой загрузчик программы можно найти настраниц:http://www.rvelthuis.de/downloads.html#cobjszipИспользование msvcrt.dllВместо того, чтобы писать все эти функциисамостоятельно, вы можете использовать их избиблиотеки от Microsoft Visual C++. Это DLL,которые использует Windows, и поэтому онидолжны присутствовать во всех версияхWindows.FWTW ­ это не моя идея. Я получил ее от РобаКеннеди в группе новостей от Borland. Похоже,что проект JEDI использует эту технику внескольких своих исходниках.Используя msvcrt.dll вместо кода, приведенноговыше, можно просто объявить большинствовнешних процедур. Обязательно используйтеимя с подчеркиванием во внешнем объявлении,так как эти процедуры не имеют знакаподчеркивания в DLL:// Обратите внимание, что вы не можете использоватьменеджер памяти Си,// так что вы все равно должны переписать процедуры, как_malloc() в Delphi.function _malloc(Size: Cardinal): Pointer; cdecl;beginGetMem(Result, Size);

end;// The rest can be imported from msvcrt.dll directly.function _strlen(const Str: PChar): Cardinal; cdecl;external 'msvcrt.dll' name 'strlen';

function _strcspn(s1, s2: PChar): Cardinal; cdecl;external 'msvcrt.dll' name 'strcspn';

function _strchr(const S: PChar; C: Integer): PChar; cdecl;external 'msvcrt.dll' name 'strchr';

function _strncmp(S1, S2: PChar; MaxLen: Cardinal): Integer;cdecl; external 'msvcrt.dll' name 'strncmp';

Это будет работать даже в таких запутанныхпроцедурах, как sprinft() или scanf(). Там, гдеСи требует дескриптор файла, вы простообъявите указатель. Эффект будет тот же.Для примера:function _sprintf(S: PChar; const Format: PChar): Integer;cdecl; varargs; external 'msvcrt.dll' name 'sprintf';function _fscanf(Stream: Pointer; const Format: PChar):Integer; cdecl; varargs; external 'msvcrt.dll' name 'fscanf';

Проблемы

В то же время, я столкнулся с несколькимипроблемами, которые могут быть интересны длячитателя. Для преобразования я написалпростую тестовую программу на Си, котораяиспользует много процедур, импортируемых изmsvcrt.dll. Но оказалось, что некоторыепроцедуры были не совсем процедурами. Ониреализованы в виде макросов, которыенепосредственно являются доступнымиструктурами и они не всегда существуют, либонаходятся в запутанной мешанине с BCB C,Delphi и Microsoft C.getchar() и putchar()Возьмем, к примеру, процедуру getchar(). Вstdio.h она заявлена в виде макроса,который доступен для повышения уровнястандартного ввода, и этот стандартныйввод ­ макрос для &_streams[0]. Если наэтом уровне переменная положительная,обычно используют символы из буфера, впротивном случае будет использоваться_fgetc() (IOW, __fgetc() на стороне Delphi).Поэтому, независимо от того, как выобъявите собственную структуру, он простоне вызовется.Это значит, что я должен был объявить__streams и инициализировать уровень полякаким­нибудь отрицательным значением.Проблема заключается в том, что процедурыиз msvcrt.dll будут иметь свои собственныеверсии подобных структур (нет гарантии, чтоструктура FILE там такая же) и они неустанавливают или не читают из BCBпроцедуры _streams. Поэтому я написалсобственную версию __fgetc() для Delphi,которая проверяет, если параметр streamявляется потоком, также как @__streams[0],указав, что он вызывается с помощьюстандартного ввода в стандартный потокввода. Если это так – это означает, что онвызывается как _fgetch(stdin); который, такжекак и getchar() – является макросом. Еслиэто так, то прочитайте книги по Delphi, иначе

Кодинг34

vr­online | июнь 2010

Page 35: VR-Online (June 2010)

– используйте процедуру _fgetc() изmsvcrt.dll.Я надеюсь, что это будет работать, но яхотел бы знать, если это будет не так.Пожалуйста, напишите мне (на почту<[email protected]>) о возникших у васпроблемах.FWIW, я отдаю себе отчет о том, что одна изпроцедур (я думаю ­ fwrite())останавливается на брейкпоинте int3 вntdll.DbgBreakPoint, если ее запустить вотладчике. Если вы нажмете F9 илиВыполнить ­ то программа будет выполненадальше.стандартного ввода в стандартный потокввода. Если это так – это означает, что онвызывается как _fgetch(stdin); который, такжекак и getchar() – является макросом. Еслиэто так, то прочитайте книги по Delphi, иначе– используйте процедуру _fgetc() изmsvcrt.dll.Я надеюсь, что это будет работать, но яхотел бы знать, если это будет не так.Пожалуйста, напишите мне (на почту<[email protected]>) о возникших у васпроблемах.FWIW, я отдаю себе отчет о том, что одна изпроцедур (я думаю ­ fwrite())останавливается на брейкпоинте int3 вntdll.DbgBreakPoint, если ее запустить вотладчике. Если вы нажмете F9 илиВыполнить ­ то программа будет выполненадальше.Но процедура puthcar() ­ тоже макрос, и этоопять может повысить уровень. Такимобразом, могут возникать такие жепроблемы, которые были описаны выше. Я,пока, не встречал их. Но изменения, которыея сделал для getchar(), означают, что,возможно, ungetc() может работатьнекорректно (AFAICS ­ это тоже макрос). Вслучае необходимости, я могу эмулироватьвсю систему в Delphi. Просто потому, что Сииспользует несколько макросов.Это лишний раз показывает, что это невсегда просто ­ перенаправлять вызовы, вконце концов, к примеру ­ на mvscrt.dll.Макросы погубили эту идею.FWIW, макросы ­ это зло, зло, зло.fgetpos() и fsetpos()Похоже, что в msvcrt.dll эти две процедурыхранят дополнительные данные в позицияхпараметров. В ВСВ позиция ­ это простоедлинное целое. Использование _fgetpos() собъявлением fpos_t в stdio.h BCB вызвалонарушение прав доступа. Так я написал

собственную версию этих функций сиспользованием _fseek() и _ftell().В теории, fpos_t является непрозрачнымтипом, и обе процедуры используютуказатель на одну. Но в BCB она объявленакак длинная, поэтому она не будет больше,чем четыре байта, а это именно то, что ивыделяется. Так что, если msvcrt.dllпопытается сохранить больше, чем в неепопытаются записать или часть данныхбудет перезаписана ­ то ваша программа небудет работать должным образом иливызовет нарушение прав доступа. Это и естьриск использования кода, который написан сиспользованием другого компилятора.Заключение

При условии, что вы мало знаете про Си, ине боитесь сами писать замены длянескольких функций Си (если выиспользуете msvcrtl.dll ­ это число будеточень маленьким), связывая объектныефайлы Си с модулями Delphi ­ очень просто.Это позволяет создавать программу, котораяне нуждается в DLL и может бытьразвернута за один раз.Если вам нужна помощь с использованиемкомпилятора командной строки C++ Builder(версии 5.5) ­ вы найдете отличную помощьв группе новостей от Borland:news://newsgroups.borland.com/borland.public.cppbuilder.commandlinetoolsНовости:

news://newsgroups.borland.com/borland.public.cppbuilder.languageдоступен для вопросов о языке. Я желаювам хорошо провести время заэкспериментами.

Кодинг35

vr­online | июнь 2010

Page 36: VR-Online (June 2010)

На днях нужно было “скопипастить” один ресурсна локальный сайт (для личного пользования,конечно) с CMS типа Joomla. Решил выложитьрезультаты сих потуг.В первую очередь необходимо авторизоваться вJoomla­вскую админку. Так как Joomla у меня налокальном компьютере, WireShark для анализаhttp­заголовков (и соответственно выясненияалгоритма авторизации) не подходит. Для даннойзадачи я воспользовался удобным плагиномFireFox. Имя ему LiveHTTPHeaders.В html­коде страницы авторизацииобнаруживаем скрытые параметры.

Скрытые параметрыОсобое внимание следует уделить последнемупараметру со значением “1″. Но о нем позже.Кодим# ­*­ coding: utf­8#импорт необходимых библиотекimport urllibimport urllib2import cookielibimport reimport string#адрес админка локального сайтаhost = 'http://localhost/administrator/'#сечас стих сочиню:#информация,# для авторизацииuser = 'admin'pasw = 'pass'#подготовка опенера с функцией обработки кукисовCookieJar = cookielib.CookieJar()opener =urllib2.build_opener(urllib2.HTTPCookieProcessor(CookieJar))#запрос админской страницыconn = urllib2.Request(host)page = opener.open(conn).read()#получаем скрытые поляparams = re.findall(r'name="([^"]+)" value="([^"]+)"', page)

#Предварительная подготовка параметров для отправкиPOST­запросаparams.append( ('username', user) )params.append( ('passwd', pasw) )params.append( ('lang', '') )buf = ident = ''for param in params:

buf[param[0]] = param[1]#Отправляем подготовленные параметрыpost = urllib.urlencode(buf)conn = urllib2.Request(host+'index.php', post)page = opener.open(conn).read()

По тексту странички, полученной послеавторизации, видно, что имя последнегоскрытого поля изменяется. Поэтому необходимоего снова отловить.ident = re.findall(r'<input type="hidden" name="([^"]+)"value="1" />', page)[0]

Ну а дальше все просто:#Собственно сам постингtitle='заголовок материала'sectionid = 1 #номер разделаcatid = 2 #номер категорииtext = 'текст материала'#Передаваемые параметрыbuf = 'title':title.encode("utf­8"), #заголовок'state':'1','alias':'','frontpage':'0','sectionid':section,'catid':category,'details%5Bcreated_by%5D':'62', #идентификатор автора'details%5Baccess%5D':'0','text':text.encode("utf­8"),'version':'0','mask':'0','option':'com_content','task':'apply',ident:'1' #ранее найденный скрытый параметр#постим месседжpost = urllib.urlencode(buf)conn = urllib2.Request(host+'index.php', post)page = opener.open(conn).read()

PythonAutoForwarder for JoomlaКопируем сайт на локальный компьютер

36

vr­online | июнь 2010

Автор

:Toly

www:

http://to

ly­blog

.ruКодинг

Page 37: VR-Online (June 2010)

'details%5Baccess%5D':'0','text':text.encode("utf­8"),'version':'0','mask':'0','option':'com_content','task':'apply',ident:'1' #ранее найденный скрытый параметр#постим месседжpost = urllib.urlencode(buf)conn = urllib2.Request(host+'index.php', post)page = opener.open(conn).read()

Идентификатор автора (его конечно можно изhtml­кода после авторизации вытащить, нозаморачиваться было лень) смотреть так:

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

2. После добавления материла скриптом у негоставится статус “Опубликовано, ноприостановлено”. Максимум через сутки статуспоменяется. Если нужно публиковать мигом,добавьте к отправляемым параметр’details%5Bpublish_up%5D’ со значением какой­нибудь прошлой даты.

Кодинг37

vr­online | июнь 2010

Page 38: VR-Online (June 2010)

PythonImageGrabbingНехитрый граббинг изображений с сайта

Рассмотрим создание скрипта на питоне дляграббинга картинок с сайта. Объект моихпреследований – сайт мебельной фабрики“Витра”. Первый скрипт собирает ссылки накартинки и помещает их в файл.

Ниже код с комментариями.Скрипт 1import urllibimport reimport string#сайт для граббингаlink = 'http://vitra­mebel.ru'#элементы ссылок, по которым не нужно переходитьbad = ['mailto:','javascript:', 'http://', '?', '.']#получаем текст по ссылкеdef getpage(link):

res = urllib.urlopen(link).read()return res

#функция проверки ссылки ­ запрещенная для перехода илинетdef isbad(st):

global badres = Truefor badword in bad:

#if string.count(st, badword) > 0:

res = Falsereturn res

#получение из текста других ссылокdef getlinks(link):

res = []page = getpage(link)#регулярное выражение ссылкиlinks = re.findall(r"<a href="([^"#]+)", page)for i in xrange(len(links)):

#исключение ненужных ссылокif isbad(links[i]):

res.append(links[i])res = list(set(res))return res

#получение адресов jpg­картинок из текста страничкиdef getimageslink(link):

res = []

page = getpage(link)#регулярное выражение для jpg­картинкиlinks = re.findall(r"<img src="([^"#]+.jpg)", page)for i in xrange(len(links)):

res.append(links[i])return res

#массив ссылок на картинкиimages = []#массив ссылок, с которых уже собрали другие ссылки икартинкиpassed = ['/']#получаем ссылки с главной страницыlinks = getlinks(link)#пока ссылки не закончатсяwhile len(links) > 0:

#извлекаем ссылкуcur_link = links.pop()print cur_link#собираем с нее картинкиnew_img = getimageslink(link + cur_link)#добавляем неповторяющиеся картинки в массивкартинокimages = list( set(images) | set(new_img) )#если ссылка не отмечена как пройденнаяif cur_link not in passed:

#помещаем ее в массив отработанных ссылокpassed.append(cur_link)#получаем ссылкиnewlinks = getlinks(link+cur_link)#отсеиваем отработанные ссылкиnewlinks = [item for item in newlinks if item not in passed]#добавляем в массив ссылок ­ ставим на очередьlinks = list( set(links) | set(newlinks) )

#сохраняем ссылки картинок в файлf = open('links.txt', 'w')for img in images:

f.write(img+'n')f.close()

Данный скрипт легко можно переделать подгенератор карты сайта.P.S. Сразу скажу, что код не идеальный:1. Каждая страница загружается по 2­а раза.2. Не использована многопоточность.3. Не использованы прокси.

38

vr­online | июнь 2010

Автор

:Toly

www:

http://to

ly­blog

.ru

...although Python uses an obsolete approach to memory management, it is a good implementation of that approach, as opposed to S,which uses a combination of bad implementation and demented design decisions to arriveat what may very well be the worst memory behavior of any actually useful program.Andrew Mullhaupt, 26 Jun 1 997

Кодинг

Page 39: VR-Online (June 2010)

Скрипт 2Второй скрипт для загрузки картинок с сайта.Данный скрипт загружает картинки поссылкам в файле, сгенерированномскриптом из предыдущей статьи.Исходный код:import urllibimport re#адрес сайтаlink = 'http://vitra­mebel.ru'#имя папки, в которую будут сохраняться картинкиfolder = 'img'#процедура загрузки файла#link ­ адрес файла#name ­ под каким именем сохранятьdef loadfile(link, name):

data = urllib.urlopen(link)#открываем файл для цифровой записи ­ "wb"f = open(name, "wb")f.write(data.read())f.close()

#получаем имя файла по его адресу в интернетеdef getname(link):

return re.findall(r"/([^/]+)$", link)[0]#открываем файл ссылок на картинкиf = open('links.txt', "r")lines = f.readlines()#определяем количествоn = len(lines)for i in range(376, len(lines)):

#индикация ­ какая ссылка по счету и сколько осталосьprint str(i)+'/'+str(n), lines[i][:­1]#загрузка и сохранение картинкиloadfile( link+lines[i][:­1], folder + '/' + getname(lines[i])[:­1] )print 'ok'

f.close()

Кодинг39

vr­online | июнь 2010

Page 40: VR-Online (June 2010)

PythonAutoUp v0.1b для форума “Амит”Встроенные библиотеки urllib и urllib2

40

Сегодня я рассмотрю возможности python, аточнее его встроенных библиотек urllib и urllib2.Напишем скрипт, который после авторизации нафоруме сможет с определенной частотойпостить сообщения в выбранной ветке. Наоперационный стол ложится Благовещенскийфорум Амит.Щипцы­зажимы.Для продуктивной работы нам понадобится:* python 2.** PyScripter* сетевой анализатор Wiresharkи немного времени.Понеслась.Запускаем Wireshark, настраиваем фильтртолько на http и логинимся на любимый форум. И

вот что он нам показывает:

(в POST­запросе передается логин и пароль)(после отправки логина и пароля осуществляется редирект на/forum/index.php? )Из­за использования в механизмеаутентификации кукисов придется использоватьмодуль cookielib. В прошлом посте я неиспользовал прокси. Исправляюсь.

Исходники:

#импортируем сетевые библиотекиimport urllibimport urllib2import cookielib#начальные условияmessage = u'up'user = u'login'pasw = u'password'prox = '94.127.88.46:3128'#номера форума и топика#1 ­ это "Общий раздел"forum = '1'topic = '41298'host = 'http://www2.amit.ru/forum/index.php?'#Заголовочная информация скопированная из снифера#со вставленными логином и паролемheaders = 'User­Agent' : 'Opera/9.80 (Windows NT 5.1; U; ru)Presto/2.2.15 Version/10.00','Host' : 'www2.amit.ru','Accept' : 'text/html, application/xml;q=0.9,application/xhtml+xml, image/png, image/jpeg, image/gif,image/x­xbitmap, */*;q=0.1','Accept­Language' : 'ru­RU,ru;q=0.9,en;q=0.8','Accept­Charset' : 'Accept­Charset: iso­8859­1, utf­8, utf­16,*;q=0.1','Referer' : 'http://www2.amit.ru/forum/index.php','Connection' : 'Keep­Alive, TE','TE' : 'TE: deflate, gzip, chunked, identity, trailers' post = urllib.urlencode( 'user_usr' : user.encode('cp1251'),'user_pwd' : pasw.encode('cp1251'), 'mode' : 'login', 'queryStr' :'', 'pagetype' : 'index' )#делаем указатель на прокси­серверproxy = urllib2.ProxyHandler('http' : prox)#Создаем кукис­агентCookieJar = cookielib.CookieJar()#создаем открывалку страниц с уже готовыми кукис­агентоми указателем прокси сервераopener =urllib2.build_opener(urllib2.HTTPCookieProcessor(CookieJar),proxy)#Осуществляем аутентификациюconn = urllib2.Request(host, post, headers)data = opener.open(conn)#теперь в кукис­агент помещена информация о отм что мызалогинены#описываем процедуру отправления сообщенияdef posting(message, forum, topic):

#формируем запрос с текстом сообщенияpost = urllib.urlencode( 'postText':

vr­online | июнь 2010

Автор

:Toly

www:

http://to

ly­blog

.ru

You're going to be in a minority ­ you're coming to Python programming from a language which offers youa lot more in the way of comfortable operations than Python, instead of coming from medieval torture chambers like C or Fortran,which offer so much less.Andrew Mullhaupt, 26 Jun 1 997

Кодинг

Page 41: VR-Online (June 2010)

conn = urllib2.Request(host, post, headers)#отправляем запросdata = opener.open(conn)

#вызываем процедуруposting(message, forum, topic)#формируем запрос с текстом сообщения

post = urllib.urlencode( 'postText':message.encode('cp1251'), 'action' : 'pthread', 'forum' : forum,'topic' : topic )conn = urllib2.Request(host, post, headers)#отправляем запросdata = opener.open(conn)

#вызываем процедуруposting(message, forum, topic)

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

Кодинг41

vr­online | июнь 2010

Page 42: VR-Online (June 2010)

Ты наверное часто слышал термин Web 2.0который впервые определил Тим О’Рейли (TimO'Reilly) в своей статье «What Is Web 2.0» . Пословам О`Рейли это методика проектированиясистем, которые путём учета сетевыхвзаимодействий становятся тем лучше, чембольше людей ими пользуются. Если болеепонятно, то Web 2.0 это сайты которые даютвозможность самому пользователю наполнять иредактировать контент. Но…В настоящее время стиль Web 2.0 принятоприсваивать сайтам которые обладаюттехнологией AJAX, являющаяся одной изосновных технологий лежащей в основе Web 2.0,простой навигацией, 3D эффектами,градиентными менюшками и кнопочками,отражением, крупным текстом, и прочим добром.Об одном таком чуде и будет данная статья, аименно об AJAX. О данной технологи написаноуже много статей и поэтому здесь мы не будемрассматривать плюсы и минусы этого зверя, апопробуем связать AJAX с одним из признанныхлидеров языков веб­программирования –серверным языком PHP.Немного историяДля начала давай разберемся с тем, что же этовообще такое. AJAX или асинхронный JavaScriptи XML (Asynchronous Javascript and XML) этотехнология изменения данных на сайте безперезагрузки страницы. В результате, веб­приложения становятся более быстрыми иудобными.Однако первые приемы динамическойподзагрузки контента без полной перезагрузкивеб­страници применялись задолго допоявления этой технологии. Еще в 1998 годукомпания Microsoft предложила метод «RemoteScripting» , так же нужный эффект можно былополучить используя элементы FRAME, IFRAME иOBJECT появившиеся в HTML 4.0.Но благодаря Джесси Джеймса Гарретта (JesseJames Garrett), который ввел термин AJAX встатье «Ajax: A new approach to web applications»

и компании Google использовавшей этутехнологию в сервисах Gmail, Google Maps иGoogle Suggest технология AJAX стала, как ялюблю называть, «попсовой».Важно: AJAX использует JavaScript и по этомудля достижения того результата на который вырассчитываете, у пользователя должно бытьразрешено использование в браузереJavaScript’ов.Ближе к делуДля того чтобы продемонстрировать связь AJAXи PHP создадим очень простую форму с 2полями ввода. В первое поле будет вводитьсялюбой текст, после этого наш текст отправитсянашему PHP­скрипу, который преобразует его вверхний регистр и отправит его обратно к нам. Вконце мы выведем результат во втором полеввода.Итак, что надо сделать:• Отслеживать события нажатия клавиш вполе ввода.• При нажатии клавиши отправитьсообщение PHP скрипту на сервере.• Сменить регистр и отправить результатобратно.• Захватить возвращаемые данные иотобразить их.<!DOCTYPE html PUBLIC "­//W3C//DTD XHTML 1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1­transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http­equiv="Content­Type" content="text/html;charset=utf­8" /><title>Уроки VR­Online. Дружим Ajax и PHP</title></head><body><form name="formName">Введите текст: <input type="text" onkeyup="doWork();"name="inputText" id="inputText" />Результат: <input type="text" name="outputText"id="outputText" />

</form></body></html> Код 1. Пример создание формы с 2 полями

AJAX + PHP:Повышаем интерактивностьПогружение в Web 2.0

42

vr­online | июнь 2010

Автор

:AnK

0raka

Анато

лийКор

чагин

Anato

liy.Ko

rchagi

n@gm

ail.com

Кодинг

Page 43: VR-Online (June 2010)

Как видишь из примера, здесь используетсяфункция doWork(), которая вызывается каждыйраз когда была нажата клавиша. Но что это ещеза doWork() и как мы можем отправлятьсообщения на сервер скрипту?Перед объяснением, что же такое doWork(),необходимо научиться делать HTTP­запросы ксерверу без перезагрузки страницы. Для этогонеобходимо создать объект XMLHttpRequest:function getHTTPObject()

if (window.ActiveXObject)return new ActiveXObject("Microsoft.XMLHTTP");

else if (window.XMLHttpRequest)return new XMLHttpRequest();

else alert("Ваш браузер не поддерживает AJAX.");return null;

Код 2. Получение HTTP объектаfunction doWork()

httpObject = getHTTPObject();if (httpObject != null)

httpObject.open("GET", "upperCase.php?inputText="+document.getElementById('inputText').value, true);

httpObject.send(null);

Код 3. Функция doWork()

Теперь давай разберемся каким образом можнопоймать ответ от сервера. Для этого нужноиспользовать специальные свойства объектаXMLHttpRequest. Можем назначить функцию дляданного параметра, и эта функция будетвызываться, если состояние объекта неизменилось. Окончательный код выглядитследующим образом:function doWork()

httpObject = getHTTPObject();if (httpObject != null)

httpObject.open("GET", "upperCase.php?inputText="+document.getElementById('inputText').value, true);

httpObject.send(null);httpObject.onreadystatechange = setOutput;

Код 4. Конечный вид функции doWork()

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

• 0 = не инициализировано• 1 = загрузка• 2 = загружено• 3 = интерактивный• 4 = завершеноfunction setOutput()

if(httpObject.readyState == 4)document.getElementById('outputText').value

= httpObject.responseText;

Код 5. Функция setOutput()

Наконец­то, самое страшно позади, разобралисьс клиентской стороной, теперь напишем PHPскрипт для сервера. Реализация функцийсервера очень проста по сравнению склиентской частью. В коде PHP, простонеобходимо, проверить значение $ _GETмассива, преобразовать его в верхний регистр ивернуть результат. Выглядит это так:<?php

if (isset($_GET['inputText']))echo strtoupper($_GET['inputText']);

?>Код 6. Скрипт upperCase.php

Вроде все. Но есть одна проблема, если впеременную inputText ввести значение накириллице, то на выходе мы получим«чебурашки». Для устранения этого недостаткавоспользуемся функцией iconv().Вот теперь точно все, на этом урок закончен,ниже приведен полный код серверной иклиентской стороны. Напоследок скажу лишь,что этот материал предоставлен в качествеликбеза, так как AJAX в чистом виде уже почтинигде не используют. Сейчас в основномиспользуют фреймворки или сторонниебиблиотеки, например Jquery.P.S. Возможно именно так Google и добиласьосуществления передачи текстовых сообщенийв реальном времени, благодаря которой можнообщаться еще быстрее

Клиентская часть. Форма:

Кодинг43

vr­online | июнь 2010

Page 44: VR-Online (June 2010)

<!DOCTYPE html PUBLIC "­//W3C//DTD XHTML 1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1­transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http­equiv="Content­Type" content="text/html;charset=utf­8" /><title>Уроки VR­Online. Дружим Ajax и PHP </title></head><body><script language="javascript" type="text/javascript">function getHTTPObject()

if (window.ActiveXObject) return newActiveXObject("Microsoft.XMLHTTP");else if (window.XMLHttpRequest) return newXMLHttpRequest();else

alert("Ваш браузер не поддерживает AJAX.");return null;

function setOutput()

if(httpObject.readyState == 4)document.getElementById('outputText').value =httpObject.responseText;

function doWork()

httpObject = getHTTPObject();if (httpObject != null)

httpObject.open("GET", "upperCase.php?inputText="+document.getElementById('inputText').value, true);httpObject.send(null);httpObject.onreadystatechange = setOutput;

var httpObject = null;</script><form name="formName">Введите текст: <input type="text" onkeyup="doWork();"name="inputText" id="inputText" />Результат: <input type="text" name="outputText"id="outputText" />

</form></body></html>

Серверная часть. upperCase.php:<?php

if (isset($_GET['inputText']))$text = iconv('UTF­8', 'windows­1251', $_GET['inputText']);echo strtoupper($_GET['inputText']);

?>

Кодинг44

vr­online | июнь 2010

Используемые материалы:1. www.ajaxf1.com2. www.google.ru3. php.su4. www.wikipedia.org

Page 45: VR-Online (June 2010)

Диспетчер задач отсутствует в стандартномнаборе Windows Mobile. Он позволяет увидетьвсе программы, которые размещаются в памятисмартфона. Он также позволяет удалять изпамяти ненужные программы или процессы. Спомощью меню, размещённого в левой частиокна, можно активировать выбранноеприложение.При этом сам менеджер закрывается. Меню,расположенное в правой части окна,предоставляет следующие возможности:­ Обновить – обновляет список запущенныхпрограмм;­ Процессы – показывает список запущенныхпроцессов;­ Остановить – останавливает выбраннуюпрограмму;­ Остановить всё – останавливает всезапущенные программы;­ Вид – показывает информацию о процессе;­ Убить – закрывает процесс;­ О программе – выводит информацию об авторепрограммы;­ Готово – закрывает программу.

Пишем кодПри активации основной формы MainFormпрограмма получает список запущенных

программ при помощи процедуры fillTaskList:private void fillTaskList()

Cursor.Current = Cursors.WaitCursor;

//Получаем список запущенных приложенийwindows = WindowHelper.EnumerateTopWindows();

//Заполняем ListViewListViewItem lvi;listView.BeginUpdate();listView.Items.Clear();foreach(Window w in windows)lvi = new ListViewItem(w.ToString());listView.Items.Add(lvi);

listView.EndUpdate();if(listView.Items.Count > 0)listView.Items[0].Selected = true;listView.Items[0].Focused = true;

Cursor.Current = Cursors.Default;

Данная процедура использует классWindowHelper, который позволяет получитьинформацию о запущенных приложениях. Кодметода EnumerateTopWindows, обнаруживающийвсе окна запущенных в системе приложенийниже:public static Window[] EnumerateTopWindows()ArrayList windowList = new ArrayList();IntPtr hWnd = IntPtr.Zero;Window window = null;// Получаем первое окноhWnd = GetActiveWindow();hWnd = GetWindow(hWnd, GW_HWNDFIRST);while(hWnd != IntPtr.Zero)if(IsWindow(hWnd) && IsWindowVisible(hWnd))IntPtr parentWin = GetParent(hWnd);if ((parentWin == IntPtr.Zero))int length = GetWindowTextLength(hWnd);if (length > 0)string s = new string('\0', length + 1);

C#Самопальный диспетчер задачдля Windows MobileРаботаем с поцессами

45

vr­online | июнь 2010

Автор

:Дори

нПоло

синКодинг

Page 46: VR-Online (June 2010)

GetWindowText(hWnd, s, length + 1);s = s.Substring(0, s.IndexOf('\0'));s = s.Substring(0, s.IndexOf('\0'));

if(s != "Tray" && s != "Start" && s != "Task Manager")window = new Window();window.Handle = hWnd;window.Text = s;windowList.Add(window);

hWnd = GetWindow(hWnd, GW_HWNDNEXT);

return (Window[])windowList.ToArray(typeof(Window));

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

Для активации запущенного приложениявызывается функция SetForegroundWindow,использующая дескриптор окна. Для закрытияприложения применяется функция SendMessageс соответствующим сообщением ­ WM_CLOSE.Для закрытия сразу всех окон можноиспользовать функцию SHCloseApps, котораязакрывает все запущенные программы, кромесамого Диспетчера задач.public static void ActivateWindow(IntPtr hWnd)//Активируем приложениеSetForegroundWindow(hWnd);public static void CloseWindow(IntPtr hWnd)Закрываем приложениеSendMessage(hWnd, WM_CLOSE, 0, 0);public static void CloseApps()//Закрываем все приложенияSHCloseApps(int.MaxValue);

Перечисление процессов

Для отображения списка процессов используетсяследующая функция:private void fillProcessList()

Cursor.Current = Cursors.WaitCursor;

//Получаем список запущенных процессовprocesses = Process.GetProcesses();

//Заполняем ListViewListViewItem lvi;listView.BeginUpdate();listView.Items.Clear();foreach(Process p in processes)lvi = new ListViewItem(p.ProcessName);listView.Items.Add(lvi);

listView.EndUpdate();if(listView.Items.Count > 0)listView.Items[0].Selected = true;listView.Items[0].Focused = true;

Cursor.Current = Cursors.Default;

Список активных процессов извлекается припомощи класса Process. Основа класса методGetProcesses:public static Process[] GetProcesses()ArrayList procList = new ArrayList();IntPtr handle =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if((int)handle > 0)tryPROCESSENTRY32 peCurrent;PROCESSENTRY32 pe32 = new PROCESSENTRY32();byte[] peBytes = pe32.ToByteArray();int retval = Process32First(handle, peBytes);while(retval == 1)peCurrent = new PROCESSENTRY32(peBytes);Process proc = new Process(newIntPtr((int)peCurrent.PID),peCurrent.Name, (int)peCurrent.ThreadCount,(int)peCurrent.BaseAddress);

procList.Add(proc);retval = Process32Next(handle, peBytes);

catch(Exception ex)throw new Exception("Exception: " + ex.Message);

CloseToolhelp32Snapshot(handle);return (Process[])procList.ToArray(typeof(Process));

elsethrow new Exception("Unable to get processes!");

Кодинг46

vr­online | июнь 2010

Page 47: VR-Online (June 2010)

С помощью данного метода можно узнатьдетальную информацию о каждом процессе.Закрытие процессаЧтобы закрыть процесс, используется метод Kill:Public void Kill()IntPtr hProcess;hProcess = OpenProcess(PROCESS_TERMINATE, false, (int)processed);if(hProcess != (IntPtr) INVALID_HANDLE_VALUE)Bool bRet;bRet = TerminateProcess(hProcess, 0);CloseHandle(hProcess);

Данный метод также использует вызовы WindowsAPI. Функция OpenProcess получает дескрипторпроцесса, который затем передается функцииTerminateProcess для уничтожения процесса.

Кодинг47

vr­online | июнь 2010

Page 48: VR-Online (June 2010)

Delphi“Google API в Delphi”Проект, открытый для всех

48

О проекте в целом.Началось все с того, что одним прекраснымзимним днем у меня напрочь пропали всякиеидеи на тему программирования в Delphi. До тогомомента все как­то шло гладко – всегданаходилась интересная мне тема, которую ястарался разобрать и поделиться своимирешениями и идеями в блоге. Что было делатьтеперь, когда темы исчерпали себя, а новых нет?Я решил поинтересоваться у читателей, чтобыло бы им интересно увидеть в блоге. И одиниз наиболее активных читателей и критиков (вхорошем смысле этого слова) как бы вскользьупомянул о том, что было бы неплохопереложить на Delphi API Яндекс.Спеллера(проверка орфографии). Сказано – сделано.Опубликовал пост на эту тему у себя в блоге.Сам по себе API оказался простым, но именноопубликованный пост, а точнее комментариичитателей к нему, и стали отправной точкой дляпроекта о котором я и хочу рассказать сегодня –о проекте «Google API в Delphi». В апрельскомномере журнала VR я уже упоминал об одной изчастей этого проекта – реализации интерфейсаGoogle ClientLogin.Официальной датой старта проекта можносчитать 06.03.2010, когда была зарегистрированазакрытая группа обсуждений в Google и открытрепозиторий на Code.Coogle.com, содержащийвсе исходники, имеющиеся у меня на руках в тотмомент. Не могу сказать, что работа в проектекипела и некуда было складывать новые модули.Скорее всего сказалась моя тогдашняясумасшедшая занятость на основной работе иесли и писал что­то на Delphi, то это было что­тонебольшое по объему, чтобы сильно неотвлекаться, но и не расслабляться.Однако на сегодняшний день проект продолжаетжить и развиваться и теперь находится подуправлением Git на одном из серверовgithub.com. В состав разработчиков, изъявившихжелание продолжить работу в проекте сегоднявходят (кроме меня):Кирилл Краснов (http://www.kraeg.ru). На данныемомент Кирилл занимается приведением иподдержанием в чистоте и порядке репозитория,а также, по совместительству, обучаетпотихоньку нас грешных нормальной работе с Git

(до сих пор я имел дело только с SVN).Дмитрий ака NMD (http://nmdsoft.blogspot.com/).Детально занимается ClientLogin API, а также вближайшем будущем планируется, что Дмитрийначнет работу над Bloggerfr API (весьмазанятная вещь для блогеров).Xabi Palmer (испанец) – неофициальныйучастник проекта. Xabi изъявил желаниепровести локализацию отдельных частейпроекта на свой родной испанский язык, а такжепредложить нам свой вариант работы с GoogleCalendar API. Ждем результатов.Пример реализации Google API в Delphi

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

vr­online | июнь 2010

Автор

:Влад

www.w

ebdelp

hi.ru

Кодинг

Page 49: VR-Online (June 2010)

Аналогичная схема работы присутствует приработе практически с каждым API Google,изменяется только третий шаг – парсинг. На этомшаге используется всегда модуль для GData API,т.к. это основа всех API и без него просто никудане деться, но изменяются модули для обработкии представления специфичной информации,например, как в нашем случае – специфичнойинформации по контактам.Для реализации представленной выше схемымы используем, разработанный модульGContacts.pas, в котором определеныследующие основные типы данных:• TContactGroup – группа контактов.Содержит всю служебную информацию погруппе, название группы и её тип (системная илиопределенная пользователем)• TContact – контакт. Содержит всюинформацию, относящуюся к конкретномуконтакту пользователя.• TGoogleContact – содержит сведения повсем контактам и группам пользователя, а такжесвойства и методы для управления контактами.Основной класс для работы с API.Также в модуле определены все типы данных,позволяющие хранить и обрабатыватьинформацию по определенным свойствамконтакта, например, класс:

TcpRelation = classprivateFValue: string;FLabel: string;FRealition:TRelationType;function GetRelStr(aRel:TRelationType):string;

publicconstructor Create(const ByNode: TXMLNode=nil);procedure Clear;function IsEmpty:boolean;procedure ParseXML(const Node: TXmlNode);function AddToXML(Root: TXmlNode):TXmlNode;property Realition:TRelationType read FRealition writeFRealition;property Value: string read FValue write FValue;

end;

Определяет такое свойство «Контакт контакта»,т.е. сведения о человеке с которымподдерживает связь Контакт пользователя.Используя этот класс можно:1. Получить имя или email этот человека2. Определить, кем он приходится длянашего Контакта (брат, сестра, дед и т.д.) – дляэтого служит свойство Realition.3. Корректно записать все сведения в XML­документ при отправке контакта на сервер –метод AddToXML.

4. Корректно разобрать XML­узел вдокументе, который содержит необходимую наминформацию – метод ParseXML.5. Проверить класс на полноту данных. Еслиметод IsEmpty возвращает false, то либо вклассе не определено какое­то значимоесвойство, без которого Google не приметдокумент, либо класс вообще не содержитсведений.6. Очистить полностью все поля класса и,тем самым при обновлении контакта удалить этисведения с сервера.Аналогичным образом определены и другиевспомогательные классы и типы данных, чтоизбавляет нас от необходимости лишний разлезть в «сырой» XML­документ и искать что­либо – все делается вызовом одного метода(пример см. ниже) без прямого использованияпарсинга XML со стороны пользователя впринципе.Если представить все связи в модулеграфически, то получится примерно следующаясхема:

Схема, конечно, упрощена, т.к. не показана связьс GData API и т.д., но суть та же – все сводится киспользованию одного класса, которыйпредоставит пользователю модуля всё, чтотребуется в удобном виде.Используя модуль, в настоящее время можноосуществить следующие операции по работе сGoogle Contacts API:1. Получение сведений о контактах в целом,включая удаленные не позднее чем 90 днейназад, либо частично, например, толькоконтакты, добавленные не позднееопределенной даты. При этом можно определитьразмер принимаемого документа, которыйизмеряется количеством записей о контактах внем, например, «попросить» Google отправлятьнам все контакты частями по 5 штук вдокументе.2. Парсинг XML­документа. При этом длякаждого контакта определяется до 19 различныхпараметров, начиная от таких

Кодинг49

vr­online | июнь 2010

Page 50: VR-Online (June 2010)

распространенных, как Ф.И.О. и, заканчиваятакими, как круг общения контакта, адреса,телефоны, явки и т.д.3. Сохранение и загрузка локальнойкопии контактов из файла.4. Группировка контактов по группам.5. Изменение сведений о контакте иотправка данных в Google.6. Ведение лога всех операций.Например, можно узнать размеры всехпринимаемых документов и адреса откудаэти документы были получены.Вот пример, как с помощью TGoogleContactможно получить документ, содержащийсведения о контактах:Contact:=TGoogleContact.Create(self, FAuth, GmailAkk);//создали экземпляр, передав в параметрах ключ Auth иадрес Gmail­почтыContact.MaximumResults:=10; //получаем по 10 контактов вдокументеContact.StartIndex:=3; //начинаем получение с третьего пономеру контактаContact.SortOrder:=TS_None; //оставляем сортировку наусмотрение ГуглаContact.ShowDeleted:=true; //просим выслать информациюпо удаленным контактамContact.RetriveContacts; //получаем контакты

Все что от нас требуется после выполненияметода RetriveContacts – это немного терпенияпока прибудут все контакты. А чтобы не смотретьна уныло зависшую форму приложения можноопределить события TGoogleContact:

TParseElement = (T_Group, T_Contact);//события компонентаTOnRetriveXML = procedure (const FromURL:string) of object;//срабатывает перед началом закачкиTOnBeginParse = procedure (const What: TParseElement;Total, Number: integer) of object;//срабатывает перед тем какначнется парсинг элементаTOnEndParse = procedure (const What: TParseElement;Element: TObject) of object;//срабатывает после успешногопарсинга XML­элементаTOnReadData = procedure (const TotalBytes, ReadBytes:int64) of object;//срабатывает каждый раз при полученииинформации из СетиК примеру, если определить все события, томожно получить вот такой лог работыпрограммы:

Естественно, никто не запрещает Вам, напримерна OnReadData заполнять ProgressBar иливыполнять иные действия.Для работы с изображением, котороеопределено для контакта, в TGoogleContactтакже имеются свои методы. Например так:Contact.RetriveContactPhoto(Selected,'noimage.jpg')Здесь мы попросили загрузить изображение дляконтакта Selected и, если этот контакт не имеетсвоего изображения, то показать дефолтное.На момент написания этой статьи я заканчиваюсоздание демонстрационного проекта,реализующего всю работы с Контактами вGoogle с использованием приведенного вышемодуля. Думаю, что когда выйдет журнал, проектуже будет полностью готов.Возвращаясь к началу статьи, а именно к еёназванию, в заключение хочется сказать, чтопроект «Google API в Delphi» всегда был, есть ибудет бесплатным и открытым для всехжелающих. Может быть поэтому я и согласилсяперевести проект под управление Git, которая,кстати сказать, была разработана в свое времяЛинусом Торвальдсом. Just For Fun .Если Вы желаете скачать исходники – непроблема. Для этого не обязательнозаписываться в список разработчиков – у насполностью публичный репозиторий. Вот адрес:http://github.com/googleapi/googleapiгде вы можете скачать (бесплатно и без очереди)все исходники одним zip­архивом. Если Васинтересует конкретный API Google, то в Wiki естьсведения о том, кто конкретно разрабатываетэтот модуль – найдете последние версииисходников в ветке разработчика.Ну, а для желающих поучаствовать в разработке– адрес Wiki где найдете всю необходимуюинформацию:http://wiki.github.com/googleapi/googleapi/

Кодинг50

vr­online | июнь 2010

Page 51: VR-Online (June 2010)

DelphiМатематические процедурыи функции в Delphi

51

vr­online | июнь 2010

Автор

:Агай

гельди

евРу

сланa

kaAg

RuMa

Кодинг

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

Сегодня вашему вниманию предлагаю несколько функций:Математические функции, Функции и процедуры для работы с символьным типом Char, Функции ипроцедуры для работы со строками PChar, Преобразования различных типовДля работы с этими функциями требуется в раздел uses дописать модуль Math;Пример:usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, Math;

Page 52: VR-Online (June 2010)

Кодинг52

vr­online | июнь 2010

Page 53: VR-Online (June 2010)

Кодинг53

vr­online | июнь 2010

Page 54: VR-Online (June 2010)

Кодинг54

vr­online | июнь 2010

Page 55: VR-Online (June 2010)

Это далеко не все стандартные функции. Ждите продолжение в следующем номере Vr­online.

Кодинг55

vr­online | июнь 2010

Page 56: VR-Online (June 2010)

56

Данный keygenme довольно простой, но тем немнение, рассмотрим именно его, думаюновичкам будет интересно. В качестве отладчикабудем использовать всеми любимый OllyDbg))Скачать ASM KEYGENME#1 можно в аттаче кстатье. Из названия подопытного, ясно чем нампридется заняться.Перед тем как его перейти к реверсингу,запускаем его, и смотрим как он работает. Послечего открываем его в отладчике.Видим следующие:

Не трудно догадаться, что файл зашифрован,причем не очень хорошо. В самом начале видимпрыжок на 004011AE, ПКМ – Follow. Попадаем нафрагмент кода декриптора . Так как, сейчас намэто мало интересно, пропустим этот фрагмент,нажимаем F9. Запускается программа.Дальше в отладчике, нажимаем Ctrl + A или ПКМ– Analysis – Analysis code;После чего в окне отладчика появляетсяосновной код, нашего keygenme :

Начнем пожалуй с того, что посмотрим WinAPiфункции, используемые тут, нажимаемCtrl + N или Search for – Name(Label) in currentmodule. Видим следующие:

Там интересны только, GetDlgItemTexaA (получение текста, например из поля ввода..),MessageBoxA ( вывод сообщения) и на последокwsprintfA( сравнение строк), что уже на данномэтапе дает нам понять, что кейгенми довольнопростой.Остановимся на GetDlgItemTexaA. Выбираемего, после чего ПКМ – Toggle Breakpoint onImport. Теперь при вызове этой функциипрограммой, произойдет ее остановка, дабыдать нам возможность “осмотреться”.

vr­online | июнь 2010

Автор

:Fairh

awk

WWW:

http://fa

irhawk

.blogsp

ot.com

Кодинг

CrackingРеверсинг ASM KEYGENME#1Первый урок новичкам

Page 57: VR-Online (June 2010)

Переходим к нашей запущенной программе,вводим любое имя, с серийником, в моем случаиFairhawk;123456, нажимаем «ОК».После чего программа останавливается, т.ксрабатывает наша точка останова, что быубедиться в этом смотрим в нижний левый уголотладчика на строку состояния, и видим там:Breakpoint at user32.GetDlgItemTexaA.Смотрим, что у нас находиться в стеке:

Давайте обратим внимание на выделеннуюзеленным цветом строчку. Тут указывается нанекий буфер, куда по идеи должно занестисьвыполнение нашей функции. Выделяем даннуюстрочку, и нажимаем ПКМ – Follow in Dump.

Видим что тут пока не чего нет, т.к мыостановили нашу программу только на началефункции, и она еще не успела выполниться.Нужно это исправить.Выделяем строку где произошла нашаостановка, и нажимаем F2, что снимет от тудаBreakpoint.

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

Видим что, наша функция выполнилась, итеперь по адресу находиться то, что мы ввели вполе ввода «Name» !) Запоминаем адрес, думаюон нам пригодиться). Убираем Breakpoint, инажимаем F7 что бы выйти из функции.Останавливаемся на строчке:MOV DWORDPTRDS:[403100],EAXКоторая заносит результат выполнения функции( в данном случаи количество символов), в«ячейку» по адресу 403100. После чего EAXобнуляется, командой:XOR EAX,EAX.Нажимаем ПКМ на MOV DWORD PTRDS:[403100],EAX– Follow Dump – Memoryaddress. И видим что там тоже пусто. Но стоитнам выполнить данную команду нажатием F7,как видим там:

Число 8, в моем случаи количество символов вслове «Fairhawk») Также «запоминаем» адрес).Чуть ниже, видите еще один вызовGetDlgItemTexaA, в точности похожею на первый:

Красным цветом выделен, первый, намиразборный, вызов этой функции. Заметим также, что тут в строчке:PUSH ASM_KEYG.004030C0И указывается, тот адрес, куда и заноситьсянаше имя, в моем случаи «Fairhawk». Во втором,вызове видим подобное:PUSH ASM_KEYG.004030E0Следовательно, туда наверняка будетзаноситься наш серийник. Давайте этопроверим, ставим точку останова сюда:

Нажимаем F9. После чего ПКМ на PUSHASM_KEYG.004030E0– Follow Dump –Immediateconstant. Как видите, наши предположенияоправдались:

Кодинг57

vr­online | июнь 2010

Page 58: VR-Online (June 2010)

Там действительно находиться наш серийныйномер. Убираем, точку останова, нажимаем ПКМна MOV DWORD PTR DS:[403128],EAX– FollowDump – Memory address, после чего F7,и видимчто 403128 находиться число 6 ) длина нашегосерийника).Теперь осталось выяснить, где используетсянаши числа (6 и 8). Сделаем так, найдем в дампепервое ( 8 ), после чего выполняем следующие:

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

Тут и видим CMP DWORD PTR DS:[403100],0обращение к нашему адресу(где у наснаходиться длина нашего имени – 8 ), в данномслучаи, происходит проверка, «если по адресу403100 находиться 0, то вывести пользователюне приятное сообщение). Чуть выше тоже самое,но уже с адресом 403128 (длина поля длясерийника – 6). После того как программаубеждается, что поля не пустые, выполняетсявыделенный красным цветом код.Перед тем как разбирать его, уберем нашBreakpoint , который расположен в дампе.Делается это так:ПКМ – Breakpoint­ Remove memory Breakpoint,все первые 4 строчки в выделенной рамки,Обнуляют ESI, ECX, а в EDX заноситься 0A (10);Ну а после чего, собственно идет генерация гудсерийника. Весь его разбирать смысла я не вижу,так что расскажу только основные моменты.

MOVS XEAX,BYTE PTR DS:[ECX+4030C0] –Начало цикла, где берется первый символнашего имени, после чего выполняется, самалгоритм генерации ключа, до момента:CMP ECX,DWORD PTR DS:[403100]JNZ SHORT ASM_KEYG.00401137Где проверяется, всели буквы были «пройдены».После чего результат заноситься в стек, изрегистров EDI и ESI.Затем вызваться функция wsprintfA дляпреобразования, всего этого в нужный намформат:"LOD­%lu­%lX". Затем проверка на правильностьнашего, и сгенерированного недавно ключа тут:

Поставим Breakpoint там, где это сделал я.Нажмем F9. И видим, что нам приходитьсясравнивать.

В String1 находиться нужный нам серийник.CMP EAX,0Если наш серийник правильный, то в EAXдолжен оказаться 0. Давайте проверим это.Убираем точку останова, нажимаем F8 (тожесамое, что и F7, только не заходит внутрьфункций).

Как видите зеленым выделено подтверждениетого, что наш серийник не правильный, иначе бытам было 0 )). И флаг Z будет содержать 0,после чего выполниться переход выделенныйсиним цветом, к плохому сообщению, затемпрограмма закроется.Перед тем как писать не посредственно keygenдавайте проверим то, что я сейчас сказал).Нажимаем 2 раза F7, пока наш курсор не

Кодинг58

vr­online | июнь 2010

Page 59: VR-Online (June 2010)

окажется на:JNZ SHORT ASM_KEYG.00401191Как видите, красная линия показывает, что онвыполниться, смотрим куда.. и видим что к неочень хорошему для нас сообщению. Кликаем 2раза на флаг Z:

И видим, что переход стал тусклым, чтоозначает, что «прыжка» не будет, а вместо этоговыполниться строчка под ним. Давайтепосмотрим, нажимаем F9!!! И как нашей радостивидим, что программа говорит нам, о том, чтосерийник правильный. Осталось только написатьkeygen. Все что нам для этого нужно, так этовзять кусок кода генерации, а именно:XOR ESI,ESIXOR ECX,ECXXOR EDX,EDXMOV ECX,0MOV EDX,0AMOVSX EAX,BYTE PTR DS:[ECX+4030C0]INC EAXADD EAX,EDXADD ESI,EAXINC ECXIMUL EDX,ECXMOV EDI,EDXIMUL EDI,ESICMP ECX,DWORD PTR DS:[403100]JNZ SHORT ASM_KEYG.00401137И переделать под свои нужды. Скачатьнаписанный мной keygen на masm32 ты можешьскачать в аттаче. Он слегка сыроват, но затоисправно работает.

Кодинг59

vr­online | июнь 2010

Page 60: VR-Online (June 2010)

PHPБиблиотека мануаловИнструкция по созданию собственнойбиблиотеки мануалов

60

Привет. Перед тобой инструкция по созданиюсобственной библиотеки мануалов, работая скоторой, пользователи могут не только изучать,но и оставлять свои комментарии. Это – неподробное описание для новичков, а лишькомментарии к участкам кода. Если есть знанияPHP, то разберешься дальше сам. Итак,поехали…. :)Начнём, конечно же, с создания базы данных насервере БД, в качестве которого выбран MySQL.Можно создать таблицы вручную, но прощевоспользоваться скриптом (см. в аттаче файлmysql.txt)Как можно заметить, у нас будут 3 таблицы:категория, комментарии и мануалы. Теперьсоздай в корне на веб сервере файл“dbconnect.php”, который будет отвечать заустановку коннекта с мускулом. Помести в негоследующий код:<?php$connection = mysql_connect ('localhost', 'username','password')or die ('Unable to connect!');@mysql_select_db('database') or die (mysql_error());?>Естественно, не забудь вписать свои данные:логин, пароль, имя базульки. Далее создавайпрямо в корне на веб сервере директорию“admin”. Здесь будут все странички,предназначенные для администрирования. В этудиректорию положим файл “index.php” и внесёмв него следующий скрипт:<?phpinclude('../dbconnect.php');if(!isset($_GET['page']))$page = 1;else$page = $_GET['page'];$max_results = 10;$from = (($page * $max_results) – $max_results);$query = "SELECT * FROM `tutorials` ORDER BY id DESCLIMIT $from, $max_results";$result = mysql_query($query)or die("Error in query: $query . " . mysql_error());echo '<a href="add.php">Add Tutorial</a> | <ahref="add_category.php">Add category</a> | <a

href="category.php">Manage Catagories</a><hr>';if(mysql_num_rows($result) > 0)while($row = mysql_fetch_row($result))?><table width="100%"><tr><td width="40"><img src="<?php echo $row[3] ?>" alt="<?phpecho $row[1]; ?>"></td><td><h1><?php echo $row[0]; ?>: <?php echo $row[1]; ?><br/><a href="edit.php?id=<?php echo $row[0]; ?>">Edit</a> | <ahref="delete.php?id=<?php echo $row[0]; ?>" onClick="returnconfirm('Are you sure you want to delete thistutorial?')">Delete</a> |<?php$count = mysql_query("SELECT * FROM comments WHEREid='".$row[0]."' AND cat='tutorials'") or die(mysql_error());$comments = mysql_num_rows($count);echo '<a href="comments.php?id='.$row[0].'">'.$comments.'comments</a>';?></h1></td></tr></table><hr><?phpelseecho 'No Tutorials<hr class="news">';echo '<center>';$total_results = mysql_result(mysql_query("SELECT COUNT(*)as Num FROM tutorials"),0);$total_pages = ceil($total_results/$max_results);for($i = 1; $i <= $total_pages; $i++)if(($page) == $i)echo "$i ";elseecho "<a href='?page=$i'>$i</a> "; echo '</center><hr>';echo '<a href="add.php">Add Tutorial</a> | <ahref="add_category.php">Add category</a> | <ahref="category.php">Manage Catagories</a>';mysql_close($connection);?>Пока эта страничка ничего не делает, т.к. нетостальных страниц администрирования, накоторых можно будет посмотреть, добавить,редактировать мануалы и их категории.

vr­online | июнь 2010

Перев

од:Ро

манК

остенк

оaka

Lord_o

f_fear.

e­mail:

kosten

ko.r.kh

v@gm

ail.com

Кодинг

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

Page 61: VR-Online (June 2010)

Продолжим с создания страницы управлениякатегориями. Создай в папке админки файл“category.php” и внеси в него код:<?phpinclude ("../dbconnect.php");$query = "SELECT * FROM `category` ORDER BY id ASC";$result = mysql_query($query)or die("Error in query: $query . " . mysql_error());if(mysql_num_rows($result) > 0)while($row = mysql_fetch_object($result))?><h1><?php echo $row­>id; ?>: <?php echo $row­>name; ?> <ahref="edit_category.php?id=<?php echo $row­>id; ?>">Editcategory</a> | <a href="delete_category.php?id=<?php echo$row­>id; ?>" onclick="return confirm('Are you sure you want todelete category?')">Delete category</a></h1><h2>Description</h2><?php echo $row­>description; ?><br /><img src="<?php echo $row­>avatar ?>" alt="<?php echo $row­>name; ?>"><hr><?phpelseecho 'No Catagories';echo '<a href="add_category.php">Add category</a> | <ahref="index.php">Go back to admin home page</a>';mysql_close($connection);?>Теперь у нас уже появилась возможностьпросматривать и редактировать категории, нодля полноценной работы этого не достаточно.Добавим скрипт добавления новой категории.Пусть файл называется “add_category.php”. Чутьпозже мы подробнее разберём как это работает.А пока вот код для добавления категории:<?phpinclude ("../dbconnect.php");if (!isset($_POST['submit']))?><form action="<?php echo $_SERVER['PHP_SELF']; ?>"method="post"><h1>Add Tutorial category</h1><h2>category Name</h2><input name="name" type="text"><br /><br /><h2>Avatar</h2><input name="avatar" type="text"><br /><br /><h2>Description</h2><textarea name="description" cols="50"rows="4"></textarea><br /><br /><h2>Website URL</h2><input name="site" type="text"><p><input type="Submit" value="Submit" name="submit"></p></form><?phpelse$name = $_POST['name'];$avatar = $_POST['avatar'];$description = $_POST['description'];$site = $_POST['site'];$query = "INSERT INTO category (name, avatar, description,

site) VALUES ( '".$name."', '".$avatar."', '".$description."','".$site."')";mysql_query($query)or die(mysql_error());echo 'Category Successfully added! <a href="index.php">Goback to admin home page</a>';mysql_close($connection);?>Эта страничка даёт нам простую форму длядобавления новой категории. Добавь несколькозаписей и сможешь работать со спискомкатегорий (category.php). Теперь нужно добавитьвозможность редактирования. Создай файл“edit_category.php” и добавь в него код:<?phpinclude ("../dbconnect.php");if (!isset($_POST['submit']))if ((!isset($_GET['id']) || trim($_GET['id']) == ''))die ('Missing record ID!');$id = $_GET['id'];$query = "SELECT * FROM category WHERE id = '$id'";$result = mysql_query($query) or die ("Error in query: $query. ". mysql_error());if (mysql_num_rows($result) > 0)$row = mysql_fetch_object($result);?><form action="<?php echo $_SERVER['PHP_SELF']; ?>"method="POST"><h1>Edit Catagoy #<?php echo $id; ?></h1><input type="hidden" name="id" value="<?php echo $id; ?>"><h2>Name</h2><input value="<?php echo stripslashes($row­>name); ?>"name="name" type="text" size="50"><br><br><h2>Avatar</h2><input value="<?php echo stripslashes($row­>avatar); ?>"name="avatar" type="text" size="50"><br><br><h2>Description</h2><textarea name="description" cols="50" rows="4"><?php echostripslashes($row­>description); ?></textarea><br><br><h2>Site</h2><input value="<?php echo stripslashes($row­>site); ?>"name="site" type="text" size="50"><br><p><input name="submit" type="Submit" value="Submit"><input type="reset"></p></form><?phpelseecho 'News item not found!';else$id = $_POST['id'];$name = $_POST['name'];$avatar = $_POST['avatar'];$description = $_POST['description'];

Кодинг61

vr­online | июнь 2010

Page 62: VR-Online (June 2010)

$site = $_POST['site'];$query = "UPDATE category SET name = '".$name."', avatar ='".$avatar."', description = '".$description."', site = '".$site."'WHERE id = '".$id."'";$result = mysql_query($query)or die(mysql_error());echo 'Category successfully edited. <a href="index.php">Goback to admin home page</a>';mysql_close($connection);?>При переходе на эту страницу методом GET (?id= ) будет передаваться номер категории,которую необходимо отредактировать. Длясохранения изменений нужно кликнуть по пимпе“submit”.Последние действие, которое необходимореализовать, ­ это удаление категорий. Файлdelete_category.php:<?phpinclude ("../dbconnect.php");if ((!isset($_GET['id']) || trim($_GET['id']) == ''))die('Missing record ID!');$id = $_GET['id'];$query = "DELETE FROM category WHERE id = '$id'";$result = mysql_query($query)or die ("Error in query : $query. " . mysql_error());$query = "SELECT id FROM tutorials WHERE category ='".$_GET['id']."'";$result = mysql_query($query)or die ("Error in query : $query. " . mysql_error());while ($row = mysql_fetch_object($result))$query = "DELETE FROM comments WHERE id = '".$row­>id."'";$result = mysql_query($query)or die ("Error in query : $query. " . mysql_error());$query = "DELETE FROM tutorials WHERE category = '$id'";$result = mysql_query($query)or die ("Error in query : $query. " . mysql_error());echo 'Category records, Tutorial records and Comment recordssuccessfully deleted. <a href="index.php">Go back to adminhome page</a>';mysql_close($connection);?>Как и в случае с функцией редактирования,номер категории передаётся скрипту методомGET. Производится удаление категории и всезаписей, связанных с ней. Т.е удаляется нетолько категория, но и все мануалы по этой теме,а так же комментарии к ним.Далее я не буду вставлять исходный код, чтобыне раздувать размер статьи, а буду лишьрассказывать, что и какой функционалвыполняет, а так же где смотреть в исходниках изаттача. (прим. переводчика).За добавление материала у нас будет отвечатькод из add.php. Там всё достаточно просто,единственный интересный момент – это выборкатегории из выпадающего меню придобавлении мануала.

Редактирование материала выполняет код изedit.php. Тут нужно учитывать, что вместо именикатегории будет отображаться лишь её ID.Каждой категории соответствует уникальный ID,который можно посмотреть на страничкеcategory.php.Последней страницей управления самимимануалами является delete.php. Принципфункционирования такой же, как и уdelete_category.php. При удалении записи так жеудаляются все комментарии к ней.Последние страницы администрированияcomments.php, delete_comment.php отвечают,соответственно, за отображение и удалениекомментариев.Теперь мы закончили с администрированием иподошли в плотную в к нашей основнойстраничке. tutorials.php – отображает 10последних добавленных мануалов. Файлcategory.php в отличие от tutorials.phpотображает лишь мануалы по определённойкатегории. Методом GET обязательно долженпередаваться ID категории. Например, еслиобратиться к странице так:www.yoursite.com/category.php, то мы получимпустую страницу. А вот если будет такwww.yoursite.com/category.php?id=2, то мыполучим список мануалов по категории с IDравной 2. Страничка viewtut.php отображаетсодержимое мануала. Входные данные – IDмануала.Прим переводчика: автор не захотел описыватькод и я его понимаю. Слишком большой объем.Тут частей на 5 надо статью разбивать. Но надопризнаться, что код достаточно прост дляпонимания даже начинающему программеру наPHP.

Кодинг62

vr­online | июнь 2010

Оригинал статьи: http://designkai.com/complete­tutorial­management­system­part­1­getting­started/

Page 63: VR-Online (June 2010)

Jimmy Jonezz: Долгое время уменя не было временинастроить систему ГИСТ(бесплатный интернетпредоставляемыйправительством РТ) у себя наработе. Не было "нормальной"локалки, чтобы один разнастроил и сразу пользуйся. Ивот свершилось ­ некотороевремя назад, я переехал вновый кабинет, болеепросторный, более светлый иболее просторный. Радуюсьновой "локалке", но самоеглавное ­ настроил системуГИСТ, и теперь у менябесплатный интернет соскоростью ~800­900 Кб\сек.Радости нет предела, но сыр небесплатный и это обусловленонекоторыми ограничениями ­зарубежные сайты недоступны(не все), ограничение наоткрытие некоторых российскихресурсов, полный запретсерфинга по развлекательнымресурсам Рунета. В остальном,я прусь, что у меня есть такойинтернет, но больше всего, чтонаконец реализованы все моизадумки по использованию этойсистемы.

zahod5277: Долго перебиралсамые позитивные моментыпрошедшего месяца, и, еслиудалить наиболее личные, тоостается всего ничего, и самыйзамечательный из них ­ это мойN900. За прошедшие двамесяца, которые я его юзаю,нареканий на этот чудо­аппаратсовсем чуть чуть. Пара багов,редкие зависоны. Ну а востальном ­ офигенная штука!Ощутить весь кайф отиспользования этого аппаратаполучилось, находясь в

Тюмени. Надо найти гостиницу ­ищем в нете адрес гостиницы,забиваем в навигатор.Приехали! А инет! Инет­то тамкакой! Когда я увидел в статус­области своего N900 вместоцифр 2.5 цифру 3 и букву G,первым делом побежал наyoutube. Так как MicroB с самогорождения умеет работать сFlash, смотреть видео одноудовольствие. Нажал Play,потом паузу. Подождал секунд15­20 и наслаждалсяпросмотром. Если бы pidginумел работать с протоколомmail.ru агента я бы даже нетбукне включал. Иметь интернет­планшет с функцией"позвонить" в большом городе ­это кайф.

Spider_NET: Утренняя зарядка ­это настоящий кайф. В июне мыс lord_of_fear взяли за правилокаждый день подтягиваться.Мой друг нам прислал своюпрограмму­тренировок ирешили мы придерживаться еерамок. Помню как в первыеразы было тяжело. Тогда струдом верилось, что спустямесяц количество (и качество)подтягиваний существенноувеличиться. А теперьрезультат на лицо!Подтягиваться мы сталибольше, а чувствовать себялучше.Считаю, что зарядка ­ этожизненная необходимость. Сутра, тело нужно обязательноразмять и подготовить кдневным нагрузкам. Особенно,утренние упражнениянеобходимы тем людям, чьяработа сводится кпросиживанию целого дня вкресле (программисты,

айтишники, экономисты и т.д.).Не уделяя должного временина физические упражнения,каждый из представителей этихпрофессий рискует набратьизлишний вес. Не уже ли онкому­то нужен? За примеромдалеко ходить не надо. Я когдаустраивался на первую работувесил ~83 килограмма (у менярост 185 см). Проработавполтора года, мой весь взлетелдо 95­96. Офигеть можно!!! Яреально чувствовал себя некомфортно. Потом я перешелна новую работу и взял впривычку делать утреннююзарядку. Пролетело полторагода и теперь мой вессоставляет 85,5. Т.е. япрактически вернул массу,которая у меня была три годаназад. Считаю это круто и несобираюсь останавливаться надостигнутом. Испытываюжелание сбросить еще хотя быпять кг.

Lord_of_fear: Вот нравится мнезаниматься спортом и всё тут.Хорошее физическоесостояние даётдополнительный позитивныйнастрой. Раньше я занималсяэтим только по утрам передработой. Утренняя пробежка,подтягивания, отжимания.Другого времени, казалось мне,просто нет. Ведь на работе непозанимаешься, а послеработы хочется добратьсядомой, принять душ, покушатьи немного отдохнуть. А потомуже получается так, что испорта никакого не хочется.Желание одно – баиньки. Да и сполным желудком заниматьсяне будешь. С неделю назад яизменил свой режим и стал

Я прусь!Делимся впечатлениямиТолько позитив...

63

vr­online | июнь 2010

Я прусь!

Page 64: VR-Online (June 2010)

перекусывать на работе в 16.00.В результате я сдвинул ужин начас­полтора. Вот как раз этотчас я и трачу на поддержаниесебя в хорошей физическойформе. Прям кайфиспытываешь после того, каквесь день работал мозг, авечером поработали мышцы. Ятащусь. Попробуй сам :)Другого времени, казалось мне,просто нет. Ведь на работе непозанимаешься, а послеработы хочется добратьсядомой, принять душ, покушать инемного отдохнуть. А потом ужеполучается так, что и спортаникакого не хочется. Желаниеодно – баиньки. Да и с полнымжелудком заниматься небудешь. С неделю назад яизменил свой режим и сталперекусывать на работе в 16.00.В результате я сдвинул ужин начас­полтора. Вот как раз этотчас я и трачу на поддержаниесебя в хорошей физическойформе. Прям кайфиспытываешь после того, каквесь день работал мозг, авечером поработали мышцы. Ятащусь. Попробуй сам :)

Kastor: В конце июня яприобрел себе коммуникаторSamsung i900. Стоит лиговорить, что я прусь от него.Мощные техническиехарактеристики, большой экран,GSM модуль (носить телефон вдовесок к КПК не хотелось бы),WiFi и GPS (само собойразумеется) и, вниманиетачпад. Да­да, настоящийтачпад. Очень удобная штука,например, когда едешь вавтобусе. Стилусом при нашихдорогах экран и проткнутьможно. А так я спокойно могузапускать нужные приложения,водя курсором по экрану.Кстати, на счет приложений. Нааппарате установлена WindowsMobile 6.1. А большинство прогдля работы с WiFi написано поднее. Давно хотел такой девайс.Целый мини компьютер у меняв кармане. Теперь можно неныкаться с нетбуком сканируясети, а в наглую заходить вздания и делать вид, что

пишешь смс­ки.WWWNET: Прусь я от того, чтонаконец­то закончил учебу.Свобода!!! Теперь временибудет хватать и на работу, и наличные проекты, и на VR.Кстати, не могу непохвастаться, за госы и защитудиплома получил 5. :)

Я прусь!64

vr­online | июнь 2010

Page 65: VR-Online (June 2010)

Samsung i900Обзор мобильного устройстваВзгляд со стороны

65

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

С первого взгляда коммуникатор внушаетуважение. Строгий дизайн, серые и темные тона,закругленные края. Солидности добавляетметаллическая окантовка, которая, на мойвзгляд, очень даже не лишняя. Что бы удобнодержать такой коммуникатор в руке, надопривыкнуть. Особенно после использованияобычных, маленьких по сравнению с нимтелефонов. Вес аппарата, где­то под 120 грамм,что совсем не много. Тяжесть вовсе неощущается в руке, и совсем немного – вкармане. Никаких поскрипываний и люфтов нет ив помине. Даже задняя крышка от аккумулятораприлегает очень плотно.

В общем, сборка очень качественная. А о том,насколько, вы можете судить после просмотраего краштеста:http://www.youtube.com/watch?v=GDiclWPYm38Коммуникатор держали в морозилке, оставлялив мешке работающего пылесоса, окунали в водуи пиво, роняли и даже проехались по немуавтомобилем. Краштест не удался. Samsung i900остался цел.Кнопки на корпусе вполне стандартные. Налицевой панели кнопки ответа, сброса вызова.

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

Но иногда его очень даже удобно использовать,когда надо быстро получить доступ к какомулибо приложению. Ярлыки большие, можнопальцем по экрану выбрать нужное приложение,а не лезть в «пуск» ­> «программы» и так далее.Этой же волшебной кнопкой можнопереключаться между запущеннымиприложениями, что­то похожее на Alt+Tab вобычной винде.Кстати о системе.Коммуникатор работает подуправлением Windows Mobile6.1. Да, не андроид, как бымногим хотелось. Но дляменя это наоборот плюс. Все­таки большинство различныхпрограмм написано именнопод эту платформу. И ещеодно. Возможность,подключившись к сети,просматривать файлы воткрытых папках, как японимаю, есть только вWindows Mobile. Теперь мой i900 полноценныйклиент моей домашней беспроводной сети.Возможно, мобильная винда и самаятормознутая из всех систем для таких девайсов,но процессор в 624 МГц и ОЗУ в 128Мб не даютему зависнуть. Его производительности хватаетс избытком. Просмотр страниц в браузере,подключившись через WiFi, прослушивание

vr­online | июнь 2010

Автор

:Kast

orEm

ail:Ka

storDr

iver@

gmail.

comОбзоры от VR

Page 66: VR-Online (June 2010)

музыки и еще парочка не закрытых программвовсе не нагружают коммуникатор. Кстати, подавно сложившейся традиции в операционныхсистемах семейства виндовс, самой ходовойпрограммой является «Диспетчер задач». Но вэтот раз он используется не для завершениязависших программ, а для их закрытия. Если впрограмме не предусмотрен пункт меню длявыхода, то крестик в верхнем углу простосворачивает программу. К этому быстропривыкаешь и мне кажется, что это удобнее, чемдля запуска другой программы, рыться в меню,чтобы свернуть работающую. Закрыватьпрограммы при помощи диспетчера задачприходится не так часто. Оперативной памяти«хватает на всех». А памяти самого устройства в8 гигабайт хватает с избытком. Я так говорю,потому что на нетбуке у меня тоже всего 8 гигHDD, так что не привыкать. Плюс можно воткнутьmicroSD, на который записываемая информация,при желании, может шифроваться.Рабочий стол мне пришелся по душе. Сверхуподобие панели задач с бессмертной кнопкой«Пуск». Слева выезжающая панель с различнымивиджетами, которые можно вытаскивать на 3.2дюймовый экран. Для меня нужными являютсячасы, календарь (вечно забываю какой сейчасдень недели, да и выглядит он красочно) идиспетчер соединений. Ходовая вещь, ведь я такчасто включаю/выключаю WiFi.

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

затрудняет управление.

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

Переходим к разъемам, которых в i900 всегоодин. Уверен, ты уже догадался, что этособственный разъем коммуникатора, в которыйи зарядник, и шнур USB, и наушники втыкаются.Хотя нет. Наушники сначала в переходниквставляются, а он уже в i900. Сначала, дорогойчитатель, я не хотел показывать тебе фоткунаушников, что бы ты мог спать спокойно. Но япередумал, хе­хе.Вот спрашивается, как такое можно воткнуть вуши? Лично мне было страшно. Онинапоминают, какие ни будь примочки злобногодоктора из фильма ужасов, которые крепятся к

Обзоры от VR66

vr­online | июнь 2010

Page 67: VR-Online (June 2010)

телу. Ужас. Я их так в пакетике и оставил.Обхожусь своими родными, с нормальнойформой. Вообще отсутствие разъема длянаушников в 3.5мм двойственно. С однойстороны ужасно неудобно путаться в проводах,как елка в гирляндах. А с другой, i900 потому иперенес испытание пылью и влагой, что в немнет лишних «дырок». Динамик коммуникаторадостаточно громкий, что бы не скучать в дороге,но супер качества не будет. Это вам не MotorolaE398, которой можно было глушить школьныедискотеки, особенно после перепрошивки.

На прицеле беспроводные интерфейсы. WiFi,Bluetooth, GPS. Все на месте, ничем необделили. Модуль WiFi я бы оценил на 4­ку.Ясное дело, что до модулей установленных вноутбуках он не дотянул бы, но то, что он слабеемодуля WiFi Nokia Т97 отнимает заветный балл.Плюс убожеская стандартная программа,которая сети разве что впритык видит. Да нестрашно. Лечится это дело стороннимипрограммами, которые такие сети найдут, чтотебе и не снилось.О Bluetooth не знаю что сказать. Работает. Особоне гонял его. А вот GPS славная вещь, пришласьмне по душе. Холодный старт, где­то минут 4­5. Адальше уже можно смотреть на Google Mapsкуда тебя занесло. А если же рядом есть выход винет, то свое местоположение можно определитьпо координатам мобильных вышек, средикоторых ты находишься. Так что заблудитьсятебе будет трудно.Батарея держит прилично. Почти 1500миллиампер хватает дня на два­три. Привключенном WiFi и GPS (да­да,картографированием занимался) коммуникаторпродержался три часа. После этого в запасеосталось 20% заряда. Так что аккумулятор здесьотнюдь не слабое место.Вот немного и пролил я свет на этотзамечательный коммуникатор. Пользуюсь им ужегде­то две недели – нареканий нет. Планирую идальше качать его софтом, в основном дляработы с WiFi, о чем буду периодическиотписывать в блоге. В место вывода могусказать, что среди своих конкурентов Samsungi900 стоит в первых рядах.

Обзоры от VR67

vr­online | июнь 2010

http://kastordriver.livejournal.com

Page 68: VR-Online (June 2010)

"Джоэл о программировании"Joel on SoftwareКниги, которые могут быть интересными

68

В прошлом году, я по рекомендации МихаилаФленова (http://flenov.info) купил себе книгу"Джоэл о программировании". Данная книгане является технической в полном смыслеэтого слова. Это просто набор заметок­советов из блога одного талантливогопрограммиста ­ Джоэла Спольски. ЗаметкиДжоэла были по достоинству оценены и витоге автор принял решение сгруппироватьпосты и издать книгу.Про что книга

Я уже говорил, что книга не являетсятехнической. Это своего рода проверенныеавтором советы о том, как не нужно писатьсофт. Многие советы реально полезны ипосле прочтения их сразу же хочетсяприменить в своей работе. Во всяком случаедля себя я нашел много полезностей итеперь успешно применяю полученныезнания при разработке софта.Особенно хочется отметить главу, в которойДжоэл делиться опытом планированияпроцесса разработки. Не для кого не секрет,что грамотно составить план и указатьреальные сроки достаточно сложно.Особенно если это касается разработки нешаблонного софта. За свою практику работыпрограммистом и журналистом много разпопадал в ситуации, когда кажется, чтоуспею к одной дате, а потом появляетсянепредвиденное "но" и сроки сдвигаются вбольшую сторону. Не могу сказать, чтопрочитав опыт Джоэла я научилсяпланировать любое дело со стопроцентнойточностью (за годы работы программистом, яуже вывел если можно так сказать своютехнику планирования), но то что качествомоих планов улучшилось — факт.

Мои оценки:

Интересность: 10/10Полезность: 9/10

Стиль изложения: 9/10Общие впечатления: 10/10

vr­online | июнь 2010

Автор

:Анто

новИго

рьaka

Spide

r_NET

Email:

antono

v.igor.k

hv@gm

ail.com

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

Обзоры от VR

Page 69: VR-Online (June 2010)

Ubuntu и Debian Linuxдля продвинутыхБолее 1000 незаменимых команд

69

Начну с того, что эта книга не подойдётновичку. Тут ты не найдёшь практическиникакого знакомства с миром POSIX­совместимых операционных систем. Авторысделали небольшое вступление, и сразуперешли к делу. Мне такой подход оченьдаже нравится.Так получилось, что я купил эту книгу,обладая достаточно большим багажомзнаний в этой области. Основная частьинформации для меня, к сожалению,оказалась неинтересной. Но нашлось и кое­что новое, неизученное.Эта книга по заверению издателя относится к“серии для профессионалов”. Спорноезаявление. Если для профессионалов, тозачем рассказывать такие элементарныевещи как: копирование файлов, созданиедиректорий, новых пользователей и пр.?Профессионалы это давно уже умеютделать. Поэтому книга не дляпрофессионалов, а для продвинутых. Какговорится “Advanced user”…Что как раз инаписано на обложке.Перевод на высоком уровне. К этомупретензий нет. Но читать книгу откровенноскучно. Как­то неинтересно она написана.Т.к. эта книга не для профессионалов, то иобщаться нужно с читателем на болеепростом языке. Но, видимо, авторам виднее.Некоторые моменты совсем не раскрыты.Как, например, работа с каналами исокетами. Написан один абзац и всё. Типаразбирайтесь сами. Авторы не компетентныв этом вопросе? Сомневаюсь. Причинаостаётся непонятной… Кстати, именнопоэтому я созрел и написал для этогожурнала статью про именованные каналы исокеты Unix.Очень понравилось оформление материалав книге. Все ключевые понятия и командывыделены разными типами и разнойтолщиной шрифтов. Описание даётся вовступлении.

Стоит книга всего 330 рублей.

Подведём итоги:Полезность: 4/5 (Если это ­ твоя перваякнига по Linux), 3/5 (Если книга ­ хотя бывторая)Стиль изложения: 4/5Перевод: 5/5Качество печати: 5/5Оправданность цены: 100%

vr­online | июнь 2010

Автор

:Ром

анКос

тенко

akaLor

d_of_fe

arEm

ail:kos

tenko.

r.khv@

gmail.

comОбзоры от VR

Купить эту книгу ты можешь в магазине ozon.ru.Прямая ссылка на книгу в магазине:http://www.ozon.ru/context/detail/id/5099661/

Page 70: VR-Online (June 2010)

Введение

На протяжении всего учебного процесса, намприходится сталкиваться с проблемамиоформления сложных документов, будь тореферат по химии или физике, а может дажеи по геометрии. Что говорить о рефератах,дипломных и курсовых работах, которыенасчитывают, в среднем, более десяткастраниц, но дело не объеме, а в содержании,в том, как «правильно»расставить\выровнять\расположить текст,изображения и формулы.В этом случае, легко «спасает» любойтекстовый редактор (тестовый процессор),но когда, к этому «моменту» нужно отнестисьболее качественно и профессионально, топод рукой, всегда должен бытьспециализированный программный(е)продукт(ы), но самое главное – система,которая будет отвечать всем необходимымтребованиям.К такой системе, с уверенностью, можноотнести, многим уже известную системукомпьютерной вёрстки, под названием TeX,которая, кстати, относится к свободномупрограммному обеспечению. Это системабыла разработана американскимпрофессором информатики, ДональдомКнутом в целях создания компьютернойтипографии. В неё входят средства длясекционирования документов, для работы сперекрёстными ссылками. Многие считаютTeX лучшим способом для набора сложныхматематических формул и с этим нельзя несогласиться. В частности, из­за этихвозможностей, TeX популярен вакадемических кругах, особенно средиматематиков и физиков.

Благодаря тому, что в TeX, пользовательлишь задает текст и его структуру, спомощью специального языка разметки, и

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

Огромные возможности TeX предоставляютготовые наборы макросов и расширений, кним можно отнести: LaTeX и AMS­TeX. Всвязи с тем, что само ядро TeX неизменно,все дополнения к нему, в том числемакрорасширения, пользовательскиеоболочки, драйверы, документация и т.д. ит.п., написанные другими авторами ипредлагаемые вниманию пользователей,должны носить другие имена (в которыеобычно включается название TeX – прим.автора) и могут быть свободнораспространяемыми, но кроме этого, икоммерческими продуктами. Прииспользовании пакета расширения LaTeXможно превратить разросшуюся статью вкнигу изменением одного слова в исходнике,вставлять оглавление одной командой, незадумываться о нумерации разделов,теорем, рисунков. Есть много пакетов дляоформления химических формул (например,пакет XymTeX), диаграмм (xypic), созданияпрезентаций и визитных карточек и томуподобного. Чтобы создавать шрифты, спомощью TeX, была придумана система ­METAFONT, в которой шрифты описываютсяпрограммами на специализированном языкеMeta. Могут также использоваться

TeX & LaTeXЯзык разметкиПогружаемся в тонкости языка разметки TeX и LaTeX

70

vr­online | июнь 2010

Автор

:Анто

нКозл

овака

Jimmy

Jonezz

Email:

jimmy

jonezz

@bk.ru

Без рамки

Page 71: VR-Online (June 2010)

векторные шрифты в формате PostScriptType 1, TrueType и OpenType.Немного истории

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

После того, как Д.Кнуту пришлось зановонабирать второе издание второго тома книги«Искусство программирования», у негородилась идея создания собственнойтипографической системы. Все этоблагодаря вмешательству прогресса ­монотипия была замещенафотографической техникой, и оригинальныешрифты больше не использовались, и всвязи с этим приходилось заново набиратьвесь текст. Заинтересовавшисьвозможностями цифровой типографии,Д.Кнут, в своих заметках, начал описыватьбазовые возможности TeX (13 мая 1977).Первая версия системы TeX, появилась в1979 году, в 1982 году выходит новая версия,которая была переписана заново иназывалась TeX82. В разработке языкапринимали участие знаменитые ученые ­Франк Лян, Гай Стил. Благодаря пытливым инаходчивым умам, язык Tex все больше ибольше принимал вид той системы, котораяотвечает необходимым требованиям. Впоследнее время обновления практическине происходят (может, если только оченьмелкие), основной упор стоит наисправлении ошибок. Последнееобновление датируется 2008 годом и этотретья версия TeX.LaTeX

Как я уже говорил, язык разметки LaTeX –это макропакет системы компьютернойверстки TeX. Эта система призванарасширить возможности последнего, но насамом деле как такового расширения нет,благодаря различным упрощениям,

использование макропакетов упрощаетпроцесс программирования. Данный пакетпозволяет автоматизировать многие задачинабора текста и подготовки статей, включаянабор текста на нескольких языках,нумерацию разделов и формул,перекрёстные ссылки, размещениеиллюстраций и таблиц на странице, ведениебиблиографии и др. Кроме базового наборасуществует множество пакетов расширенияLaTeX. Существует несколько стандартныхстилевых файлов для статей, книг, писем и т.д., кроме того, многие издательства ижурналы предоставляют свои собственныестилевые файлы, что позволяет быстрооформить публикацию, соответствующуюстандартам издания.Главная идея LaTeX состоит в том, чтоавторы должны думать о содержании, о том,что они пишут, не беспокоясь о конечномвизуальном облике (печатный вариант, текстна экране монитора или что­то другое).Готовя свой документ, автор указываетлогическую структуру текста (разбивая егона главы, разделы, таблицы, изображения),а LaTeX решает вопросы его отображения.Так содержание отделяется от оформления.Оформление при этом или определяетсязаранее (стандартное), или разрабатываетсядля конкретного документа.Язык.

Пришел момент, когда немного стоитокунуться в сам язык разметки. Нанебольших примерах посмотрим, что же ониз себя представляет. Конкретно, обратимсяк языку LaTeX, как к одному из болееизвестных и популярных микропакетов.Первое правило гласит, что все командыначинаются с обратного слеша,обязательные параметры заключаются вфигурные скобки, а необязательные – вквадратные. Для определения того, чтодокумент имеет разметку и относится ккакому­либо классу, существует команда\documentclass, в обязательных параметрахуказывается один из следующих классов:article ­ короткая статья;report ­ длинная статья, с главамиbook ­ книгаslides ­ набор слайдовletter ­ письмоКонструкция, вида \begindocument …\enddocument, говорит о том, что это телодокумента. LaTeX отображает данныезаключенные в этой конструкции, но крометого, в преамбуле (все, что находится передкомандой \begindocument) могут

Без рамки71

vr­online | июнь 2010

Page 72: VR-Online (June 2010)

задаваться, кроме класса документа,используемые пакеты (команда\usepackage), автор (команда \author),название документа (команда \title), датасоздания (\date) и т. д.Например, код ниже, нагляднопродемонстрирует нам, что документвыводит на печать слово «vr­online ­сегодня», заглавие которого будетследующим – «Пример вывода текста».\documentclassarticle% Это комментарий!\usepackage[russian]babel % Пакетподдержки русского языка\titleПример вывода текста % Заглавиедокумента\begindocumentvr­online – сегодня\enddocumentТекст не выводится в оригинальном виде, аформатируется следующим образом:­ Два или больше пробелов эквивалентноодному пробелу.­ Перевод строк, с любым количествомпробелов перед и после него, эквивалентенпробелу.­ Пустая строка или строка, содержащаятолько пробелы, начинает новый абзац.Немного усложним задачу и попробуемвывести матрицу (матрица состоит из n­огоколичества строк и столбцов.) – подключаемпакет ­ \usepackagemathtext. Чтобысоставить матрицу нужно воспользоватьсяконструкцией «\begin» … «\end» и применитьокружение «array». При этом, стоит четкозапомнить, что формулы внутри текста надоразмещать между командами «\(« и «\)» илив окружении math (между «\beginmath» и«\endmath»), или выделять с обеих сторонзнаками доллара «$»:

Вышеприведенная матрица будет печататьсябез порядкового номера, и располагаться вотдельной строке, благодаря командам ­ «\[«и «\]». Количество столбцов мы задаем спомощью аргумента сссс, по количеству«с». Этот аргумент центрирует значения, нокроме «с» есть – «l» (выравнивание по левойстороне) и «r» (выравнивание по правойстороне). Каждая строка, обязательно

должна заканчиваться командой «\\», кромепоследней, а элементы внутри одной строки,относящиеся к разным столбцам,отделяются друг от друга символами «&».Команды \vdots, \ddots и \ldots задаютразличные виды многоточий, и как вы,наверное, догадались, нижние индексыобозначают командой подчеркивания – «_».Легко ли будет в будущем еередактировать? Можете не отвечать, ответитак известен.LaTeX самостоятельно выравнивает тексты,определяет переносы, интервалы междусловами, строками и абзацами. Давайтенемного глянем на возможности даннойсистемы, которые поистине неограниченны(благодаря механизму программированияновых макросов).• высококачественные алгоритмырасстановки переносов, определениямеждусловных пробелов, балансировкитекста в абзацах;• автоматическая генерация содержания,списка иллюстраций, таблиц и т. д.;• удобный механизм работы сперекрёстными ссылками на формулы,таблицы, иллюстрации, их номер илистраницу;• удобный механизм цитированиябиблиографических источников, работы сбиблиографическими картотеками;• размещение иллюстраций (иллюстрации,таблицы и подписи к ним автоматическиразмещаются на странице и нумеруются);• оформление математических формул(очень качественное их отображение,нумерация с учётомодносторонности/двусторонности печатидокумента), возможность набиратьмногострочные формулы, большой выборматематических символов;• оформление химических формул иструктурных схем молекул органической инеорганической химии;• оформление графов, схем, диаграмм,синтаксических графов;• оформление алгоритмов, исходных текстовпрограмм (которые могут включаться в текстнепосредственно из своих файлов) ссинтаксической подсветкой;• разбивка документа на отдельные части(тематические карты).Благодаря лицензии LPPL и тому, чтоданный язык относится к свободномупрограммному обеспечению, мы можем

Без рамки72

vr­online | июнь 2010

Page 73: VR-Online (June 2010)

видеть, как этот язык превратился в нечтомасштабное и действительно необходимуюсистему, которая способна облегчить многимих рутинную работу.На этой положительной ноте, я надеюсьзакончить свое повествование, а вследующих выпусках журнала мыпродолжим наше знакомство с этим,удивительно интересным языком разметки.Я надеюсь, у тебя появились вопросы илизамечания, а может и предложенияотносительно этой статьи – не стесняйся,пиши мне или на форму сайта vr­online.ru, итвои messages, будь уверен, не останутсябез ответа.

Без рамки73

vr­online | июнь 2010

Дополнительные ссылки:

Формулы: http://ru.wikipedia.org/wiki/Википедия:ФормулыОфициальный сайт: http://www.latex­project.org/Документация TeX: http://www.nsc.ru/TeX/

«Не очень краткое введение в LATEX2e»: http://www.nsc.ru/win/docs/TeX/Tobias/lshort2e.html

Page 74: VR-Online (June 2010)

Предысторией к этой статье служит тотмомент, что я достаточно часто встречаюлюдей, которые испытывают затруднения сверсткой документов. Все это оттого, чтовидимо некому было показать и указать нанужный программный продукт. Конечно, выможете верстать (если это можно такназвать) в Worde или любом другомредакторе, не предназначенным для этого, иуверен, вы справитесь с поставленнойзадачей, т.к. тот же Word предоставляеттакую возможность, но вот вопрос: ­ будет лидостигнут нужный результат? Стоитподумать.В предыдущей статье мы остановились на«общем описании» программы Scribus, незатронув самое основное, скажем так«начинку», то, благодаря чему Scribus иявляется программой, предназначенной дляоблегчения труда верстальщику. Вот именноее, мы сейчас и испробуем на вкус –заглянем «вглубь». Предупрежу сразу, свое«погружение» я буду сопровождатьполезными советами относительно правилверстки, которые, надеюсь, вам пригодятся вбудущем, независимо от того, будете ли выиспользовать Scribus или какой­либо другойпрограммный продукт.Первое, с чего стоит начать – это четкопредставить себе структуру оформлениябудущего документа, конечно при условии,что вы полны желания и несгибаемогонамерения приступить к верстке, т.к. этодовольно нудное занятие. Если все же васэто не отпугивает или вы вынужден делатьэто по принуждению, то смело берите листбумаги и начинайте вырисовывать дизайнбудущих страниц: в каком месте будет стоятьнумерация страниц, будут ли колонтитулы и,что в нем будет находиться, размертекстового поля и т.д. Все это можнопроделать прямо в редакторе, но поверьтемне на слово, на бумаге быстрее инаглядней.Если вы справились с этой задачей, а вы, яуверен, с ней справились, приступаем кнастройке документа: выбор формата,направляющих полей, ориентация, единицаизмерения и т.д. Диалог с настройкой

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

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

Даже если у тебя 100% зрение вряд ли тебеудастся выронить все объекты на рабочемполотне. Поэтому никак не обойтись безнаправляющих линий, которые создаютсядовольно просто: щелкаем нагоризонтальную или вертикальную линейку,в зависимости от того, какая направляющаянам нужна или щелкаем на уголок,соединяющий линейки (тогда получим обелинии сразу – прим. автора) и «тащим»мышь на рабочее полотно. Второй вариант:Страница ­ управление направляющими.Использование этой команды даствозможность более точнонастроить\установть направляющие.

Scribus:Записки начинающего верстальщикаУчиться, учиться... и еще раз учиться...

74

vr­online | июнь 2010

Автор

:Jimm

yJone

zzEm

ail:jim

myjon

ezz@b

k.ruБез рамки

Page 75: VR-Online (June 2010)

Без рамки75

vr­online | май 2010

Направляющие – это то, без чего никакнельзя обойтись при «конструировании»страницы. Постарайся это запомнить.Я упустил из виду, одно важное правило,несоблюдение которого может привести ккраху всей вашей работы. Запоминай: всефайлы (изображения, текст), которые будутиспользоваться в проекте, должнынаходится в той же директории, в которойнаходится сам проект. Казалось бы, пустяк,но несоблюдение этого условия лишьприбавит вам головной боли; осмелюсьзаметить, что данная ошибка довольнораспространена среди новичков. Держатьвсе в одном месте, это не особенностьScribus, которая, кстати, запоминает толькоабсолютный путь для используемых файлов,а правило, которого стоит придерживаться.Это правило применимо и ко многомудругому: кодинг, рисование и т.д.Вернемся в русло нашей статьи. Насталмомент, когда стоит обратить внимание наоформление текста. В предыдущей статье, ядал понять, что работа с текстом в Scribusпоставлена на первый план, и этодействительно так. Открываем редактортекста, для любого текстового блока, либочерез «Правка», либо при помощи клавиш:Ctrl+T. В диалоге Story Editor мы сразу жеможем применять к тексту нужныепараметры: кегль, цвет, расстояние междубуквами и т.д.

Не торопись настраивать текст в этом окне.Советую создавать стили и уже, потомприменять их к тексту. Этот методмаксимально сократит тебе время верстки.Слева от текста, есть поле, в которомуказываются стили, применяемы для строктекста. Клацай на одном из них и выбирайпункт «Изменить стили…».

В этом диалоговом окне можно выделитьдва основных «раздела» ­ дерево стилей,

которое содержит стиль линий, абзацный исимвольный стили, а также раздел снастройками, состоящий из:1. Свойства: междустрочный интервал,отступы перед и после абзаца, табуляторы иотступы.2. Символьный стиль: шрифт, кегль, цвет,применение эффектов (подчеркивание,тень, обводка, зачеркивание и т.д.).3. Настройка пользовательских «горячихклавиш».Здесь, я уже мало, что могу вампосоветовать – реализуйте свою фантазию,но не стоит забывать, что слишком«аляпистое» оформление ни к чемухорошему не приведет. Все должно бытьчитабельным.Последний момент, я акцентирую на вставкеизображений. Здесь есть своя особенность,которая заключается в следующем: послевставки блока изображения на рабочееполотно\страницу, есть два вариантазагрузки изображения в этот блок.1. Вставка через буфер обмена. На свойпрактике, я, этим методом не пользуюсь, т.к.этот метод, способен значительно сильноувеличить размер вашего проекта, но тогдавам не придется заботиться о том, чтобы всеизображения были рядом с проектом –прим. автора.).2. Загрузка изображения из файла. Этотметод более удобен – файлы, которые выиспользуете можно отредактировать, приэтом проект будет обновлять изображения ивам не придется заново загружать файл, нос другой стороны все фалы должны быть на«месте», т.е. желательно находиться рядом спроектом (Почему так? Читай выше – прим.автора).После вставки изображения («Правая кнопкамыши» – «Вставитьизображение» или Ctrl+D),вызывайте свойстваизображения. Впоявившемся диалоговомокне смотрим раздел«X,Y,Z». Благодаря этомуразделу можнопозиционироватьизображение «как душеугодно». Поворачивать,увеличивать\уменьшать ит.д.Раздел «Фигура» отвечаетза размещенияизображения в тексте, аименно за обтекание. Я

Page 76: VR-Online (June 2010)

часто использую обтекание «по контурнойлинии». Щелкаем на тип обтекания и кнопку«Изменить». После чего откроется новоеокно – «Узлы», в котором щелкаем«Изменить контурную линию». Контурнаялиния может быть, не обязательно,прямоугольного вида, добавив новые узлы,контур может выглядеть как многоугольник.Теперь изменяй синюю обводку изображенияи щелкай «Завершить».Раздел «Изображение» отвечает заразмещение загруженного рисунка в самомблоке изображения. С остальныминастройками, я советую, разобратьсясамому, в них нет ничего сложного.Совершенно забыл один момент, при работес текстом, существует одна полезнаяфункция, чтобы каждый раз не вставлятьтекст по страницам вручную, можно связатьтекстовые блоки. После такой связки, текст,который не умещается в одном текстовомблоке автоматически переходит наследующей. Данная кнопка находится напанелях инструменов ­ "Связать текстовыеблоки". Работает это так: щелкаем на текстовыйблок, далее на кнопку "Связать текстовыеблоки" и щелкаем на тот текстовый блок, накотором будет продолжение текста. Есть иобратная функция, позволяющая разбитьсвязанные текстовые блоки.Scribus, как инструмент для верстки, оченьудобен и практичен. Достаточно интуитивнопонятный интерфейс значительно упрощаетпроцесс верстки документов. Я непользовался коммерческими и другимипрограммами для верстки, и не вижу в этомсмысла, т.к. этот инструмент меня вполнеустраивает.

Дополнительные ссылки:

Официальный сайт http://www.scribus.net/Вики­страница (рус.) http://wiki.scribus.netСообщество пользователей: http://www.linuxgraphics.ru/

Без рамки76

vr­online | май 2010

Page 77: VR-Online (June 2010)

zahod5277: Меня тошнит ототношения чиновников квнедрению информационныхтехнологий в сферыгосударства. Все помнятлинукс в школы за туеву хучуденег и нулевым итогом. Всепомнят сайты по 8миллионов рублей. Куда?! Начто?! Я просто непредставляю что долженпредставлять из себя сайт за8 миллионов рублей!!!Теперь еще ОС и поисковик,бюджет которого 100миллионов рублей. Имей япсихику послабее, уже быточно сошел с ума от такихцифр. Лучше бы не тратили(а точнее не тырили) такиеденьги, а вложили бы вмедицину или образование.Был недавно в областнойТюменской больнице. Знаетекуда они данные о узивбивают а потом печатают? Ввордовский шаблон! Цифрызаписали, распечатали,документ закрыли безсохранения и зановооткрыли. Вот это бесит, отэтого тошнит и вообщехочется по увольнять на хренвсех кто занимаетсяобеспечениемспециализированного софтадля мед. целей. Такая жеситуация со многим другимсофтом. Имел возможностьужаснутся ПО для админингашколы и всего что с нейсвязано (не считая 1С).Разве нельзя писатькачественные программыдля гос. учреждений? Хотязачем? Можно же схапатьнесколько лямов за созданиеодного сайта, чемзаморачиватся на разработкемножества программ. Хотя и

на них можно достаточнонавариться. Наверное...

Spider_NET: С пятого июляваш покорный слугаотправился в отпуск. В этотраз (впрочем, как и во всепредыдущее) он получилсямаленьким ­ всего двенедельки. За такое времяособо не разгуляешься ирешил я вместе со своейлюбимой отправиться в гостик родителям, в чертовскималенький городок. Ехать кместу назначения решилипоездом. Собрались значитбрать билеты. Я как человекне расстающийся с инетом,решил попробовать заказатьбилеты в режиме Online. Наэтом все и закончилось.Доставка билетов невыполняется и закупленными билетаминеобходимо приезжать навокзал и стоять в общейочереди. Меня этот вариантне устраивал, т.к. смысл отпокупки через инет, если всеравно мне придется стоятьна равне со всеми? А стоятьбы пришлось конкретно, т.к. снужного нам направлениясняли пять вагонов и из­заэтого возле касс всегдатусуется туева хуча народу внадежде, что появятся места(можно и не стоять, араспечатать билет черезспец терминал, но когда ябыл на вокзале, он неработал). Вот тут мне ихочется сказать "Менятошнит!". Зачем вкладыватькучу баблосов в гос. порталы,если до сих пор толком неавтоматизированы(интернетизированы) такиежизненно­важные сервисы

какприобретение/бронированиебилетов?Некоторые посетители VRзнают, что у меня естьчетвероногий друг ­ собакапороды английский кокерспаниель. Уезжая в отпуск,мы решили взять мохнатогозверя с собой (а с кем емуоставаться?). Все документына собаку в порядке, поэтомумы решили съездить навокзал и купить для песикабилет. Сделаю ремарку,оказывается, купить билет наперевоз животного можнолишь на вокзале, т.е. вдругих официальных местахпродажи билетов этогосделать нельзя. Я долгодумал почему, но так и непридумал. В общемприехали мы на вокзал. Япошел в справочное бюро иуточнил на счет покупкибилета. Меня заверили, чтоникаких проблем нет."Стойте в кассе как все иприобретайте билет" ­недовольным голосомответил информационныйагент совкового режима.Ok, встали мы с любимойперед кассой и началиждать. Долго ли коротко ли,но ожидание нашей очередизатянулось на полтора часа.Не успел я произнестидолгожданную фразу: "Мнебилет на собакупожалуйста!" и протянутьсвой билет кассирше, какона сразу же ответила: "Выуезжаете не с этого вокзала,поэтому продать билет насобаку я не могу!". Меня чутьне затошнило прямо возле(на) кассы (у)! что замаразм? Какая на фиг

Меня тошнитВыплескиваем негативМеня раздражало за месяц...

77

vr­online | июнь 2010

Меня тошнит

Page 78: VR-Online (June 2010)

Меня тошнит78

vr­online | июнь 2010

разница на каком вокзалебрать? Где вообще можнопочитать (именно на вокзале)правила покупки билетов дляживотных? Короче я в шоке.Мне пришлось потратитьполтора часа времени, чтовыстоять очередь и так и нерешить свою проблему. Ацена проблемы была всеголишь 60 рублей.

Lord_of_fear: Уважаемыйчитатель, знаешь ли ты чтотакое говнософт? Если да, тозначит ты с ним сталкивался.Я имел дело с достаточнобольшим числомговнопрограмм, но на дняхмоё терпение подошло кконцу. Слышал об Инфо­бухгалтере? Думаю, да. Это– жесть! Криворукостипрограммеров можнопозавидовать. Сколько явсего повидал, но сообщение“обновление вроде какуспешно установлено” убилона повал. Скажу честно: впервый раз даже улыбнуло=) Вроде как успешно! Еслиони позвонят мне и спросят“Вы оплатили следующий годлицензирования?”, то отвечу“вроде как оплатил” :) Благо,мы практически полностьюперебрались на 1Сблагодаря Spider_NET’у. Ещёменя прикалывает как Инфо­бухгалтер переносит сетевуюработу с несколькимипользователямиодновременно. Точнее, онникак её не переносит. Черезнекоторой время базаначинает сыпаться иумирает. А если открывается,то работать низя.Вываливается куча ошибок…:) Кстати, видел их сайт?www.ib.ru .Прям а­ля 90­е.Зайди чисто поржать =) Незабудь стартовую страницупролистать до конца. =)Тошнит и хочется плакатьодновременно. И они ещёхотят за свой продукт денег!Бесплатно не возьму ;)

Kastor: Я за рулем своегоскутера на крышемногоэтажного дома. Сразуза ним объект моегоуничтожения. Выкручиваю доконца ручку газа. Из подбуксующего колесавыползает синяя дымка.Разгон и прыжок с крыши.Всего мгновение и я делаюсальто назад приземляясь наземлю в мегакрутейшей позе.Мопед влетает в будку состорожем и взрывает еенахрен. Из оставшегосяофиса моего провайдеравыползают странныебородатые существа, сосвитерами, заправленными вджинсы. Они пытаются менязакидать пачками от чипсов икипятильниками, но не тут тобыло. Мой гнев велик.Первого встречаю шлемом,остальных добиваюврукопашную. Пробираюсь кглавному компьютеру иввожу парольсамоуничтожения… Вот дотаких бредовых мыслей менядовел мой провайдер. Нонадо отдать должное,последний месяц, изодиннадцати пережитых, онработает почти без выходок.И это подозрительно.

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

Page 79: VR-Online (June 2010)

Ночь шуршит над головой

Как вампира черный плащ

Мы проходим стороной

Эти игры не для нас

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

Дальше ну прямо кадр из матрицы. Яразгоняюсь. Быстро разгоняюсь, интенсивнодвигая руками. Мне нужно приземлиться нацентр крыши, что бы не скатиться по еенаклону. Добегаю до края и отталкиваюсьчто есть сил. Полет длится секунды две.Черт! Один из самых затяжных моментовмоей жизни. Дальше следует грохот. Хрустнескольких черепиц, сломанных моимнезапланированно жестким приземлением.Распластавшись на крыше, я хватаюсь за ееизгиб, что бы не упасть. И замираю. Кусокгребанной черепицы со скрежетом сползаетв низ. Падает на землю и разбивается. Мойпульс учащается. Я не двигаюсь некотороевремя, что бы меня не заметили. Медленноповорачиваю голову, осматриваюсь.Многоэтажки достаточно далеко. Свет нигдене зажегся, движняка со стороны улицы невидно. Вытираю выступивший на лбу пот.Нормально прошло. Почти. Кажется, яколеном и расколол ту черепицу. Защитныенакладки все же помогли. Не на стопроцентов, но значительно. На секундупредставляю, как это было красиво. Мойсилуэт замирает в прыжке с крыши накрышу. Наверняка классный кадр.Осторожно подползаю на край. Вот икозырек второго этажа школы. До него ужеближе. Прыжок с места, приземление наноги и перекат на спину, насколько этопозволяет площадь козырька. Как и ожидал,тут нашлась парочка осколков, возможно отразбитого стекла или от бутылки пива. Мойкостюм достаточно прочный, на рукахперчатки. Я нигде не порезался. Встаю иосматриваюсь. Пытаюсь вглядеться в окнопередо мной, с которого можно выйти наплиту, где я стою. Кажется, в коридореникого нет. Локтем выбиваю часть стекла,что ближе к ручке. Просовываю руку иоткрываю окно. Старое здание,обшарпанные стены, мусор на полу. Двери внекоторые классы сорваны с петель, кое­гдеих нет вообще. Медленно переступаяразные балки на полу, иду вперед. Надеюсь,здесь не будет приключений в виде бомжей

"Я так люблю свою страну"Для нас эти игры, для нас...Рассказ

79

vr­online | июнь 2010

Автор

:Kast

orКреатиff

При написании рассказа были использованы тексты песен групп «Пикник» и «Lumen».Весь рассказ был написан под бессмертный рок группы «Disturbed» и непонятно как попавший в мой playlist электро от «InfectedMushroom».

Page 80: VR-Online (June 2010)

или наркоманов. Не должно быть. Все те жерешетки на окнах и заколоченные двери длятакого сброда уже преграда. Прохожу мимотого самого «тоннеля». Ясное дело никто неоставит здесь проход открытым. В концеглухая стена. Замуровано при реконструкциивторой части здания. Но я все же пройду потоннелю. Но только сверху. Подымаюсь полестнице на третий этаж. Со второго рывка,с обсыпающейся высохшей краской,открываю окно, находящееся над проходом.Переваливаю через него, свешиваюсь иаккуратно приземляюсь. В эту сторону, счасти здания компании, выходят окна ихкабинетов. Свет нигде не горит. Охранник,возможно, ходит по коридору с другойстороны или сидит вместе с товарищем вкабинете и смотрит в камеры наблюдения. Аможет и футбол. Их мы не успели всех«обработать». Эти два новенькие. За такойпромежуток времени не изучишь весьперсонал, их повадки и привычки. Я сноваразгоняюсь. Бегу по крыше перехода прямона стену. Подбегаю почти в притык иумудряюсь сделать два шага по стене,прежде чем выкидываю руку вверх иухватываюсь за край крыши. Зацепившисьвторой рукой, подтягиваюсь и забираюсьнаверх. Десять секунд передышки. Дыханиевроде не сбилось. Порядок.­ Я на месте.­ Понял. – доносится ответ из наушника. Впаре кварталов от сюда, возле станцииметро, припаркована черная Mazda 3 MPS.За рулем наверняка сидит Faila. Рядом, Voidсмотрит изображение с камер наблюденияна экране ноутбука. На подготовку коперации ушло достаточно много времени.Достаточно для того, что бы найти вподсобном помещении ближайшей станцииметро магистраль, передающую поток видеос данного кампуса, в главный офискомпании. Присоединить к нему устройстводля передачи сигнала через шифрованныйрадиоканал. Достаточно для того, что бымолодая, красивая девушка сбила одного изсотрудников компании, катаясь на роликах.Влетела так, что его барсетка улетела в однусторону, а ее рюкзак, с рассыпающимисябезделушками в воздухе, в другую. Лежа наасфальте, она вытянула руку, прося помочьвстать. Повадки всех полезных для делалюдей были изучены. Мы знали, что этотточно поможет. А еще он поможет собратьвсе это барахло, рассыпавшееся по улице.За это время, его магнитный пропуск улетелв окно припаркованной рядом машины и егодамп был благополучно скопирован. Позженанесен на аналогичную карточку. Именноона сейчас лежит у меня в грудном кармане.Времени хватило и на промывание мозгов

шефа отделения. Звонок от якобы ихпровайдера. Виновный, неуверенный голос втрубке говорил, что при установке инастройке нового оборудования былдопущен ряд ошибок, в результате чегосоединение в последнее время оченьнеустойчиво. Кто же знал, что это наших рукдело. Снятая недалеко однокомнатнаяквартира, с установленным возле окнашумогенератором, рандомно по временипускающий помехи в сторону офисакомпании. Начальник не дурак, но номерпровайдера на определителе иподтверждение сотрудников о плохой связисыграли свою роль. Двум парням, в кепках исиней одежде с эмблемами провайдера,было разрешено пройти на крышу иосмотреть оборудование. Вот тогда и былсломан замок двери, ведущей на крышу. Этусамую дверь я сейчас и открываю.­ Камера номер три под контролем. Driver,ты стал невидимкой.­ Отлично. – спускаюсь по лестнице иоткрываю дверь в коридор. А вот и камераномер три. Тут уже ничего не поделаешь.Остается верить, что видео пустогокоридора зациклено на мониторе охранника.Все же маска не лишняя, хоть свет здесь внерабочее время делают тусклым. Иду кзаветной двери. Кабинет 15. Достаюпропуск и провожу им по щелкамсчитывателя. Загорается зеленнаялампочка. Щелкает электра замок двери, иона чуть приоткрывается. Слегка толкаюдверь. Темно. В офисе очень темно. Но яразличаю несколько деревянных столов, соспециальными нишами для системника имонитора, расположенных в ряд. Над двумяокнами висят кондиционеры. В углу стоитстойка с парочкой серверов. Подхожу кпервому столу и присаживаюсь на корточки.Достаю крестообразную отвертку иоткручиваю винтики с одной стороны.Снимаю крышку с системника. А вот иаппаратный keylogger. Снимаю его сразъема клавиатуры и кладу в карман. Да,все же велики возможности социальнойинженерии. Гениальная наша Faila. Жучкибыли установлены еще до того, как этиновые компьютеры были доставлены сюда.С остальными двумя поступаю так же.Значит, ключи есть. Они должны быть там.Каждый день сотрудники работают ссекретными данными, а значит, ключи былизаписаны в память этих устройств. Что зашорох?­ Void. – шепотом говорю я.­ На камерах чисто.Странно. Надеваю крышку и закручиваю

Кретиff80

vr­online | июнь 2010

Page 81: VR-Online (June 2010)

винтики обратно. Я стараюсь двигатьсяаккуратно, ничего не задеть. По идее, меняздесь и не было. Остается последняя часть.Свалить от сюда. Выглядываю из­за двери.Никого. Выхожу и медленно закрываю дверь.Загорается красная лампочка. Щелчок замка.Дверь закрыта.­ Driver, охранник вышел из кабинета. Делаетобход против часовой.­ Дерьмо. – Это значит, что ему до входа налестницу раза в три меньше, чем мне.Только он пока за углом.­ Зайди обратно. Быстрее!Ага, обратно. Эти считыватели не такие ужеи скоростные. Две секунды для меня сейчасроскошь. Бегу по коридору пытаясь скрытьсяза углом. Но мне не хватает пары метров.­ Стоять! Стоять я сказал! – охранник рванулза мной.Не знаю, что за план у меня появился вголове. Слева от меня мелькают двериофисов, справа – большие окна,выглядывающие прямо на парковку. Может, яхотел оббежать по кругу все здание и сновавернуться к лестнице? Но даже эта детскаязатея оборвалась. В конце коридораоткрывается дверь. Второй охранникповорачивает голову в мою сторону и егоглаза расширяются. Еще бы! Его коллегагонится за каким­то незнакомцем в черномбалахоне. Ничего лучшего, чем направить наменя пистолет, этот козел не придумал.­ А ну стоять! Живо!Мое сердце бьется с бешеной скорость.Каких­то тридцать секунд назад все шло поплану. Доля секунды понадобилась моемусознанию, что бы понять – другого выходанет. Наверное, я ощутил отчаяние.Скрещивая руки перед лицом, я прыгаю вокно. Осколки стекла разлетаются в разныестороны. Руки я все еще держу перед лицом,но низ я вижу. Причем я вижу, как мнебезумно повезло. Я рассчитывал, что настоянке под окнами будет стоять рядавтомобилей. Но я и не надеялся, чтопопаду на крышу микроавтобуса. Онапрогибается под моим весом. Я невольноскатываюсь на капот. Слышу трескпереднего стекла. Падаю на землю.­ Живее, за ним! – слышны выкрики с верху.Вот бы еще чуть­чуть тут полежать.Прогоняю эту мысль прочь. Выглядываю из­за капота. В окнах никого, они побежалиспускаться за мной. Отлично, они же неузнают, в какую сторону я двинусь. Выбегаюсо стоянки и перебегаю улицу. Пересекаю

соседний двор, между тремя многоэтажками.Останавливаюсь, что бы перевести дух.Тихий гул двигателя, сбрасывающегообороты. Спортивная мазда резко тормозитпередо мной. Открывается задняя дверь.Запрыгиваю на сидение. Не успеваюзакрыть дверь. Тачка срывается с места, идверь захлопывается сама.­ Faila, ну ты гонишь.­ Еще бы. – В зеркале заднего вида замечаюрасплывающееся в улыбке лицо девушки.Глухой стук трансмиссии. Вторая передача.Нас всех от ускорения вжимает в спинкусидений. Снимаю капюшон. Прохладныйветер из приоткрытого окна приятно бьет влицо. Теперь я могу перевести дыхание.­ Живой, дружище? – Void повернулся комне.­ Да. Местами. – Протягиваю емуаппаратные keylogger’ы.Думаю, хитрые усмешки на наших лицахвидно за километр. Двигатель в 250 л.с.мчит нас по трассе.

* * *

Как же я ненавижу этот звук. С лежащегона столе коммуникатора играла ужаснаямелодия. А это значит, что уже пол восьмого,и через полтора часа я должен быть наработе. Я специально поставил этот бред набудильник. Так быстрее хочется проснуться,что бы вырубить его нафиг. Я присел надиване, протер глаза и взглянул в окно.Пасмурная погодка. На небе видно немноготучек закрывающих солнце. Похоже, ночьюнакрапывал дождь. И славно. Значит,сегодня не будет так жарко. В глазахчувствуется «песок», голова немноготяжелая. Пять часов сна, явно мало дляорганизма. Хорошо хоть хватило силрасстелить себе простыню и лечь почеловечески. Смотрю в сторону своегостола. Слышу шум куллеров из истемника.Оба двадцати двух дюймовых монитора,стоящих рядом на столе, давно ушли вспящий режим. Рядом с клавиатурой стоятдве баночки энергетического напитка.Безалкогольного конечно. Он мне абсолютнони к чему. Натягиваю штаны, подхожу кстолу и беру одну из них. Капелькакофейной жидкости скатывается мне наязык. Хм, пустая. Беру вторую, в которой надне булькает остаток, делаю глоток и идуумываться. Какое блаженство. Холоднаявода хот немного «освежает» мое сознание.

Кретиff81

vr­online | июнь 2010

Page 82: VR-Online (June 2010)

Кретиff82

vr­online | июнь 2010

Сонливость медленно проходит. Делаю ещеглоток этого кофейного напитка. Он мнеиногда помогает не провалиться в сон. В этожеланное состояние, в которое так хочетсяуйти утром. Или под утро, это уже какполучится. Следую на кухню, где завариваюсебе чай и делаю бутерброды. Да уж,завтрак чемпиона. Беру поднос с едой икружкой и иду в комнату. Сажусь в кресло.Движение мышкой и мониторы черезсекунду оживают. На одном открыт Eclipse смоим кодом на С++. В свободное время язанимаюсь разработкой системыобнаружение вторжений, только для работыс беспроводными сетями. Смотрю на экран ивспоминаю этот злостный кусок кода,который не дал мне заснуть до трех ночи. Надругом мониторе в Firefox открыт какой тофорум программистов, документация и PSI.В этом Jabber клиенте мигает сообщение от,походу давно ушедшего в offline, Мегабайта:Megabyte 2:48:12Ну че? Компилится код?Megabyte 2:54:37Чувак, ты где? В спящий режим ушел чтоли? =)

Угадал. Вспоминаю, как вчера отлучился втуалет, а когда вернулся, то между компом идиваном выбрал диван. На секундочку.Секундочка продлилась до утра. Уже началодевятого, надо торопиться. Надеваю своилюбимые джинсы, футболку и кроссовки.Достаю с полки ноутбук и кладу его в рюкзак.Закрываю дверь, спускаюсь по лестнице ивыхожу из подъезда на улицу. Не так уже ипасмурно сегодня. Я щурюсь от солнечногосвета. Глаза начинают слезиться. Опускаюна нос солнцезащитные очки. Так намноголучше. В паре кварталов находится нужнаямне автобусная остановка. Я вообще незнаю, зачем устроился админом к этомупровайдеру. Может, мне нужен стабильныйзаработок? Зарплаты хватает на оплатуоднокомнатной квартиры, продукты ишмотки. Почти хватает. На «нормальнуюжизнь», новые комплектующие для компа идевайсы, ясное дело я зарабатываю другимобразом. Моей части гонорара в пять штуквечно зеленых, от последнего нашеговыполненного заказа, мне хватит надолго.Запрыгиваю в закрывающиеся двериавтобуса. Несмотря на то, что еще естьсвободные места, я становлюсь в центре,держась за перекладину. На пути зайдет ещекуча народу. Мамы с детьми, пожилые.Лучше сразу не буду занимать место, чемпотом уступать его и искать, где бы мнеудобнее постоять до своей остановки. Блин!И надо было мне так умудриться

расшарахать свой байк! Хорошо, хоть самцел остался. Пара ушибов и синяков. А вотбайк улетел из­под меня в повороте и курочапластиковый обвес, терся по асфальту досамого ограждения. Вся надежда на Файлу,которая тащится по гоночной технике.Держит с друганами свою мастерскую.Надеюсь, она восстановит мой байк. Спецвсе­таки. Автобус тормозит на очереднойостановке. Народу на улице много. Виднотоже все на работу спешат. Из этой толпы,проходящей в открытые двери автобуса, ясразу замечаю ее. Молодая девушка, срюкзачком через плечо, заходит в автобус истановится возле окна, опираясь о кабинкуводителя. Ее длинные, светлые и немногокудрявые волосы красиво лежат на плечах.Похоже, она немного улыбается. Смотрит вокно и улыбается. Тонкий проводок тянетсяиз ее футболки к ушам. Хм, я бы сейчастоже не отказался послушать музыку. У менятакое ощущение, что она пританцовывает.Еле заметные движения говорят мне обэтом. Вот еще один плюс солнцезащитныхочков – я могу пялиться на кого угодно, а ониоб этом могут только догадываться. Хотяона на меня даже не смотрела. Вообще нина кого не смотрела, только в окно. Можетбыть, она слушает электро, а в ее рюкзакележит ноутбук? Она так похожа на мой образдевушки­хакера. Вовсе не кукла, которыелюбят ходить по магазинам, листатькаталоги с косметикой и носить туфли навысоких каблуках. На ней белые кроссовки,«вареные» джинсы, по цвету напоминающиесинее отражение воды на стене, футболка сзамысловатым рисунком и легкая курточка.Я не могу оторвать от нее взгляд. Такаямилая улыбка на ее лице. Любуюсь ей минутдвадцать, пока она не выходит на очереднойостановке. А я тупо смотрю через окно, какона поправляет рюкзак и уходит куда­то,сливаясь с толпой. Да что со мной такое?! Япридерживаю закрывающуюся дверь ивыхожу на улицу. Ну, блин, и куда онаиспарилась? Тут такой движняк. А с другойстороны, что бы я ей сказал? Я ведь даже неподумал над этим. Я вышел на двеостановки раньше, чем надо. Достаю свойmp3­шник и надеваю наушники. Люблюзабойный рок. Под него трудно грустить, онзаводит и придает энергии. На светофорезагорается зеленый и я вместе со всемиожидающими на тротуаре, двигаю по зебре,доставая из рюкзака свой «секретныйзапас» кофеина. Под забойную Inside TheFire группы Disturbed я дохожу до зданиясвоего провайдера. Ничего необычного,простое двухэтажное здание. На первомнаходится Интернет клуб, которымуправляет Илья. Нормальный парень, нераз, выручавший меня с моими косяками на

Page 83: VR-Online (June 2010)

Кретиff83

vr­online | июнь 2010

работе. Впрочем, как и я его. На второмэтаже серверные и мое рабочее место.Открываю входные двери и подхожу к столу,стоящему в центре.­ Привет, Илюха, ­ снимая очки, здороваюсья.­ Здаров, Андрей, ­ он отрывает свой взглядот монитора – опа! Опять не спал всю ночь?­ Не всю, ­ делаю глоток из баночки.­ Заканчивай пить эту дрянь. Здоровьегробишь.­ Угу, если бы не эта дрянь, ты бы ужесобирался домой, когда я пришел.Директора нет еще?­ Неа. Че то опаздывает сегодня.­ Вот и славно. Что смотришь то? – яперевалился через стол, чтобы взглянуть намонитор.­ Новости. В сеть попало видео с камернаблюдения компании SH. Помнишь, впрошлую субботу к ним в здание вломилсякакой­то незнакомец?­ Угу, видел, ­ говорю я, смотря на этотормозящее, черно­белое изображениекамер наблюдения. Вот я выбегаю из­заугла. Вот открывается дверь, выходит второйохранник и направляет на меня ствол. Вот яподымаю руки и выпрыгиваю в большое окнона парковку.­ Как думаешь, что он там делал? Говорят,ничего не пропало. Странно вообще­то.­ А фиг его, ­ зевая, отвечаю я.­Извините. Можно мне в инет на час? Мнечерез Wi­Fi. – приятный женский голосвклинивается в наш разговор. Девушкавыкладывает несколько купюр на стол,доставая ноутбук из рюкзака. Глазам неверю, это же она. Та самая девушка изавтобуса, которую уже и не надеялся когда­либо встретить. Я стою рядом, но меня онане узнает.­ Да, конечно, ­ оживился Илья – вот пароль.Присаживайтесь, пожалуйста, ­ онпротягивает ей карточку с логином ипаролем.­ Спасибо, ­ она присаживается на диване вдругом конце помещения и открываеткрышку ноутбука.­ Оу, Илюха, ты заметил, что за ноут у нее?­ Да Hewlett Packard кажется. А что?­ ХП значит, окей!­ Че? Понравилась? – он ехидно улыбается.

В ответ я только подмигнул ему. Я снял свойрюкзак и присел на соседнем с ней диване.Не так уже и много людей приходят сюда,что бы посидеть в Интернете со своегоноуткуба через Wi­Fi. В основном онисадятся за стационары, которых в этомклубе предостаточно. Включаю свой ноутбуки выбираю из трех систем, установленныхна нем, BactTrack. Прикольный дистр, сразусодержит большинство прог необходимыхдля работы. Запускаю консоль, паройкоманд перевожу карточку в режиммониторинга и запускаю airodump. Вот они.Список на экране наполняется клиентами,подключенными к беспроводной сети. Ихвсего четыре штуки и я знаю, какой именномне нужен. Вот он, Broadcom’овский макадрес, карточка вероятно от которого и стоитв ее ноутбуке. Дальше вычисляю ее ip адреси сканирую порты, надеясь найтиуязвимости. Уже прошло пять минут, а я всееще не получил доступа к ее компьютеру. Явсе больше удивляюсь поставленнойзащите. Вдруг, неожиданно для себя,замечаю на своем рабочем столе какой­толевый текстовик, с насмешливым названием«не устал?». Ну, нифига себе! Я дажерастерялся на какое­то время, но быстрособрался с мыслями. Ну, вот же! Вот же этанезаметная прореха в защите, которую я такдолго искал. У нее на экране появляетсяаналогичный текстовик, но с названием«Неа, только размялся. Удивлена?».Замечаю на ее лице явное удивление,которое через несколько секунд и парудесятков нажатий на клавиши почему­тоисчезает. В ответ получаю себе новыйтекстовик «Не очень. А ты?». И, о черт. Ябольше не могу создавать на ее компефайлы. Будь это кто­либо другой, уже быдавно тупо отрубил от сети, задосивпакетами деаутентификации. Но сейчас этобы означало мое поражение, а еще я оченьхочу продолжить разговор. Вот только как? Исловно в ответ, на этот мой мысленныйвопрос, у меня появляется третий файл, строеточием в место названия. Я открываюего и вижу фразу «интересно, ради чего жеты так старался?». Понимаю, что общениебудет продолжаться теперь здесь. Печатаюв ответ «не мог же я так просто подойти ктакой красивой девушке и завязатьразговор». Секунду задумавшись, добавляю«не оригинально как­то». Следующие пятьминут мы общались таким способом, иногдапоглядывая друг на друга. Я изредказамечал легкие улыбки на ее лице, и отэтого мне становилось легче. Значит она непротив моей компании.«­ И стоило это таких твоих усилий?

­ Сейчас узнаем.

Page 84: VR-Online (June 2010)

Кретиff84

vr­online | июнь 2010

­ ?­ Давай, как ни будь, поужинаем вместе? –замечаю очередную улыбку на ее лице.­ Я не против =) Вот мой номер…»И она напечатала его. Хах, мой коварныйплан удался, хоть и не так, как я его себепредставлял. В этот момент в помещениевошел Игорь Александрович, наш директор.Он подошел к Илье и что­то сказал ему.Илюхе ничего не осталось, как указать в моюсторону взглядом.­ Андрей, зайди ко мне в кабинет. Этосрочно.Как же он не вовремя. Вечно у него что­тосрочное.

«­Кажется кому­то уже пора.­ Да. До скорой, красавица...»Улыбнувшись ей на прощание, я последовална второй этаж, за ИА, как мы его называемв шутку. В этот момент завибрировалкоммуникатор, оповещая о новомсообщении. Это от Файлы: «Driver, байкготов. Заезжай на днях». Здорово. Еще однахорошая новость за сегодняшнее утро. Дажеугрюмый начальник мне вряд ли сможетподпортить настроение.

* * *

­ Здесь остановите, ­ говорю я, глядя в окно.­ Не вопрос, ­ таксист сбрасывает скорость иостанавливается у обочины.­ Можно без сдачи, ­ протягиваю емунесколько купюр и выхожу из машины.Красная девятка трогается с места искрывается за поворотом. Довольно тихийрайон, расположенный на окраине города.Даже людей здесь не так много. Множествокварталов с расположенными на нихчастными домами. Тихая улица и небольшаядорога, по которой я иду. В паре кварталовот сюда находится мастерская Файлы, гдеменя ждет мой Aprilia. Я специально вышелздесь. Это уже давняя моя привычка такшифроваться. Может это лишнее, но водилесовсем не обязательно знать, зачем я сюдаприехал. Красивые, в основном двухэтажные дома, расположены вдоль улицы. Укаждого на пороге есть небольшой дворик сгазоном. Вся эта картина напоминает мнекадры из американских фильмов, гдепоказывают их жилые районы. Следующийквартал начинается с большого гаража и

парковки, расположенной рядом. На нейстоит несколько серийных, но донеузнаваемости тюнингованныхавтомобилей и парочка байков. Входныеворота подняты вверх. Изнутри доноситсяшум работающего двигателя. Захожу внутрьи вижу спортивную Subaru Impreza, котораястоит на специальном стенде. В очереднойраз убеждаюсь, что эти странные знакомыеФайлы, с пирсингом, татуировками иэрокезами, вовсе не сброд панковбеспредельщиков. Дело свое они знаю,иначе им бы не доверили на диагностикуили ремонт такую тачку. Занятые работой,они меня не заметили. Я решил немногопонаблюдать за ними и оперся о стенкугаража. Один парень стоит у стола сэкранами, к которому тянутся провода отстенда. Двое просто наблюдают, как снарастающей скоростью вращаются колесагоночной машины, стоящей на нем. Зарулем этой синей, с грозным передкомSubaru сидит Faila. Своеобразная,внушительная девушка. Синие прямыеволосы, на которые натянуты очки вместообруча. Белая маечка на теле. Левая рука, всиней гоночной перчатке, лежит на руле.Правая, скорее всего на рычаге КПП.Обороты возрастают, кажется, этот монстрсейчас сорвется со стенда, проделает дырув здании и помчится прочь. Я свосхищением смотрю на нее. На еесосредоточенное выражение лица.Возможно я так же выгляжу, когда сижу закомпом, но только не так круто. Она же меняабсолютно не замечает. Вероятно, кайфуетот той мощности, которая спрятана подкапотом этого зверя. Мощности, котораяподвластна ей всего лишь движениемправой ноги на педаль газа. Вместобетонного пола и шкафов с инструментамиперед ее глазами наверняка сейчасмелькает дорожная разметка гоночноготрека. Металлический стук четкосработавшей коробки передач. Двигательснова набирает обороты и все четыреколеса полноприводной Subaruраскручиваются еще быстрее.­ Стоп! Хватит! – чувак, стоящий за столомподнял руку верх.Faila сбрасывает обороты и глушитдвигатель: «Ну как?», ­ открывая дверьспрашивает она.­ Компрессия в норме. Впрыск топливасвоевременный. Короче, можнозакругляться.­ Фух, наконец­то. Целый день маялись, ­оживился один из парней с татуировкой наплече.

Page 85: VR-Online (June 2010)

­ Вот и славно, ­ Faila выходит из машины изадерживает свой взгляд на мне, ­ Привет,Андрей! Я тебя пораньше ждала.­ Как освободился, так сразу к тебе рванул, ­я подхожу к ней. Хм, как я и думал. Черныекроссовки с синими вставками, такой жерасцветки спортивные штаны и куртка, сосвязанными рукавами на поясе.­ Пошли за мной, твой пациент уже заждалсятебя.­ Это я его заждался.­ А нефиг гонять по треку на непрогретойрезине, ­ шутка конечно, но замечаниеправильное. Я тогда сразу это понял, кактолько перестал катиться по трассе. СлаваБогу, я был в защитном мотоциклетномкостюме.­ Между прочим, твой рекорд пыталсяпобить.­ Хах, мой рекорд. Не знаю, не знаю. А вотобвес свой ты раскурочил вне всякихрекордов, ­ мы подходим к другому краюгаража, ­ любуйся.У меня нет слов. Мой Aprilia SL 750 Shiverстоит на подножке и смотрит на меня своейединственной, футуристичной фарой. Обвескак новый. Серый скелет металлическойрамы, более темное сидение и оранжевыепластиковые обтекатели. Блеск! Обхожумотоцикл и любуюсь двумя заднимиглушителями, выходящими из под сидения.Удивительные треугольные формы делаютих больше похожими на лучеметы, готовыеиспепелить любого по моему приказу.­ Ты супер! ­ Не могу сдержать своеговосторга.­ Кто? Я или твой байк? – спросила Faila,положив руку мне на плечо. Хитрая усмешкана ее лице и она протягивает мне брелок сключами.Я сажусь на байк, выжимаю сцепление изавожу двигатель. Он послушно отзываетсяна мое движение рукояткой газа, издаваясочный рокот.­ Спасибо огромное. Я даже не знаю, кактебя отблагодарить.­ Да все нормально. Лучше просто пообещайбольше не газовать так при выходе споворота.­ Постараюсь, ­ все еще не наслушавшисьэтого дивного звука от выхлопа, отвечаю я.­ Кстати, тебе Void не звонил?­ Нет. А что за тема?

­ Да есть одна затея, надо бы обсудить наднях.­ Если не срочно, давай завтра илипослезавтра встретимся, обсудим.­ Че? Планы, какие есть?­ Угу. Как у Наполеона. Залезай, подвезудомой. Я так понял вы все на сегодня?­ Да, но я на своей малышке, ­ она кивнула всторону своей Мазды 3 MPS Extreme. ТолькоFaila может назвать малышкой, гоночныйавтомобиль, от ускорения которого в глазахтемнеет.­ Ну ладно, созвонимся тогда еще, ­ мне ужене терпится прокатиться по дороге.­ Давай. До скорой, ­ она подмигнула мне ипошла к своим товарищам.Я медленно выкатываю с гаража исворачиваю на дорогу. Какое же этоудовольствие, особенно после целойнедели, которую я был пешеходом.Сцепление, щелчок коробки передач,рукоятку на себя и я уже мчусь под 100км/чпо этой совсем пустой дороге. Деревья истолбы по бокам мелькают все быстрее,перекресток со светофором все ближе.Сбрасываю скорость. Мандраж от паденияеще не прошел. Такое бывает. Надо простонемного привыкнуть и я буду ездить не хужепрежнего. У меня в запасе еще целых двачаса. Но мне стоит поторопиться, нельзя жеопаздывать на свидание. Во всяком случае,парням. С самого утра моя голова былазабита мыслями о том, как все можетпройти. О чем мне стоит говорить с Катей.Катя, какое милое имя. Вспоминая ееулыбку, мне почему­то кажется, что оно ейподходит как никакое другое. Мысли о том,как мне стоит себя вести. Но все этоглупости. Нельзя продумать все темыразговоров, все возможные вариантыразвития событий. Надо оставаться собой ивсе само получится. Я заехал домой, что быприодеться покрасивее. Но никакихофициальных брюк, рубашек и прочейфигни. Это не мое. Не понимаю людей,которые носят такие костюмы. Ладно, ещете, которым это нравится. Онидействительно выглядят солидно иаккуратно. Но остальные, всякие менеджерыи даже преподы. Смешно смотреть на них.Особенно на последних, когда они роняютмел. Им же страшно присесть за ним, вот­вот где­то треснет по швам и вся этасерьезность и официальность улетучится.Нахожу телефонную трубку и делаю звонокв одно уютное кафе, где я заказал столик.­ Да, молодой человек. Ваш столик,заказанный Вами вчера, свободен и ждет

Кретиff85

vr­online | июнь 2010

Page 86: VR-Online (June 2010)

Кретиff86

vr­online | июнь 2010

Вас, ­ этот ответ и спокойный женский голосуспокаивают меня.­ Спасибо большое, ­ мне просто надо былоубедиться, что прокола не будет.Кажется все. Уже начало восьмого. Поравыдвигаться. Закрываю дверь и спускаюсьво двор, к своему байку. Буквально двадцатьминут езды и я на месте. Почти на месте. Яснова припарковался в паре кварталов откафешки. Но в этот раз по другой причине. Уменя в запасе еще целых пятнадцать минут,которые я простоял, опираясь о парапет. Ккафе подъехало желтое такси, из котороговышла Катя. Она почти не опоздала. Я иду кней. Подхожу и понимаю, что мое «привет»,будет первым словом, которое я ей адресую.Ведь мы же не общались до этого лично,только через своеобразный чат и потелефону. Мы поздоровались. Я был одарензамечательной улыбкой. Я готов любоватьсяей снова и снова. Вовсе не застенчивая, и незагадочная. Не знаю, как ее можно описать.Просто чудесная. Мы зашли в кафе, иподошли к нашему столику.­ Андрей, кажется этот столик уже занят.­ Все верно, ­ улыбаясь, я отдаю официанткетабличку с надписью «стол заказан».Кажется, она немного удивлена. Мыприсаживаемся и открываем меню…

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

мне тоже не нужна. По крайней мере, здесь,а не в андеграунде. Катя тоже не спешитпроливать свет на свою работу и нас обоихэто устраивает. Разделавшись с десертом,мы начинаем собираться. Уже где­то полдесятого, за окном темно. Расплатившись софицианткой, мы выходим на улицу.Приятный, теплый летний вечер. Вернее уженочь. Так хорошо сейчас, тихо. Мы решилинемного прогуляться. Сворачиваем понебольшой тропинке в парк. Здесь оченькрасиво. Деревья, подстриженныекустарники, газон и тропинки, выложенныеплиткой. А здесь свежо. Прохладныйветерок приятно обдувает руки и лицо. Ярешаюсь взять ее за руку. Она не против.Покрепче сжимает мою ладонь, и мыпродолжаем нашу беседу. Уже болеераскрепощенную и более насыщеннуюшутками и сопровождающими их улыбками.­ Уже поздно, Андрей. Мне пора бы вызватьтакси.­ Окей. Давай только пройдем в соседнийдвор. Думаю, туда водитель быстрее найдетдорогу.На долю секунды мне показалось, что явызвал у нее подозрение. Но онасоглашается. Мы выходим из парка иподходим к одной из многоэтажек, подокнами которой стоят несколькоавтомобилей и мой байк. Остановившись уподъезда, она достает из карманамобильный телефон.­ Катя, не хочешь прокатиться?Она не понимает, о чем я. Потом замечаетмой взгляд, направленный на этогодвухколесного красавца.­ Это твой? – на ее лице вновь замечаюудивление.Вместо ответа достаю брелок с ключами.Пиликнув сигнализацией, мой Apriliaприветливо мигнул нам фарой. Катя сноварасплылась в улыбке. Мы садимся на байк.Я завожу двигатель и потихоньку выезжаюна дорогу. Перестроившись в левый ряд, яприбавляю газу и чувствую, как она,обхватив руками за пояс, прижимается комне. На душе становится так тепло. Сейчася чувствую, что не один. В этот момент нетбольше этого гордого одиночества. Нетмысли, что мне никто не нужен. В глубинесознания закрадывается сомнение, что ямогу лишиться этого состояния одинокоговолка. Но сейчас не тот момент, что быдумать об этом. Я сбрасываю скорость,медленно лавируя по дороге, ведущей кнескольким девятиэтажкам.Останавливаюсь возле одного из подъездов,

Page 87: VR-Online (June 2010)

Кретиff87

vr­online | июнь 2010

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

* * *

Мой любимый энергетический напиток почтизакончился, а Файлы все нет. Я стоюпосередине моста и, опираясь на перила,смотрю на движущуюся подо мной реку.Снова эта пасмурная погода. Из небольшихтучек уже давно накрапывает мелкий дождь.Теплый такой, летний, но все же противныйдля меня дождь. Впрочем, об этом говориттолько поднятый воротник моей куртки. Я несутулюсь и не пытаюсь прикрыться газетой,как некоторые прохожие, которые спешатпобыстрее укрыться от него. Я просто стоюна мосту, делаю последний глоток этогокофеина и вспоминаю прошедшую ночь.Вернее утро. Самое прекрасное утро моейжизни. Очень хотелось удивить ее еще раз.Проснуться пораньше, сделать легкийзавтрак, заварить чай и принести все это впостель. Но моих сил еле хватало для того,что бы разлепить веки и я снова провалилсяв сон, обнимая Катю. Когда я проснулсявторой раз, я поводил рукой по второйполовине кровати и понял, что ее рядом нет.Я резко проснулся. Незнакомая обстановка,сквозь белые шторы в комнату вливаетсясолнечный свет. В комнате очень светло,очень все аккуратно и очень чисто. Я слышукакой­то шум на кухне. Через несколькосекунд дверь открывается и в комнатузаходит Катя, держа обеими руками поднос.Она чрезвычайно красива. Кроме нижнегобелья, на ней всего лишь легкая, немногопросвечиваемая лучами света рубашка. Еесветлые волосы, беспорядочно, но красиволежат на плечах. А на лице, все та жеулыбка. Мои мысли рассеивает звук высокооборотистого двигателя спортивной Мазды.Рассекая лужи, эта черная тачка с краснымилиниями винила по бокам и спойлером накрыше, подкатывает ко мне. Тонированноестекло с моей стороны опускается.

­ Залазь, Driver. Прокатимся, ­ выглядываяиз окна, говорит Faila.­ На пять минут опоздала. Теряем форму? –в шутку спрашиваю я, усаживаясь в кресло.­ Да нет. Прикинь, забыла с ручника снять, ­хлопнув себя по лбу и улыбнувшись,ответила она.После этой фразы я просто не могу непристегнуться. Через мгновение мытрогаемся с места, проезжаем мост и едемпо шоссе. Быстро едем, но не гоним.­ А где Void? И что там за идея у вас?­ Он уже на месте, с нашими. Пусть лучшеон и расскажет свой план. Кстати, Flash иKornev тоже там.­ Отлично. Мы в нирвану?­ Угу, ­ сворачивая на очередном повороте,отвечает Faila.Следующие десять минут поездки явспоминаю свое утро. Смотрю настекающую по стеклу капельку воды ивспоминаю, как я не хотел, что бы онозакончилось. Мы договорились встретитьсяв ближайшие дни. Все так условно. И все такнеизвестно, как и при первой встрече.Второе свидание, наверное, всегда не менеенеожиданное и загадочное, чем первое.Faila паркуется возле одного ночного клуба,с большой вывеской «Nirvana». Это смесьночного и Интернет клуба. Пиво, компы,электронная музыка. Все это здесь. Мызаходим внутрь. С одного из балкончиковнам махает рукой Flash, держа в другойтлеющую сигарету.­ Привет народ! – я с Файлойподсаживаемся на диван, который огибаетнаш столик.­ Оу, Андрюха! Привет. Как доехал? –усмехаясь, здоровается Kornev.Обычные «привет. Как дела?». Все­такибольше недели не виделись. По крайнеймере, я только с Файлой и пересекался парураз. Я то, ясное дело, чем занимался. Днемработа. Вечером программинг под клевуюмузыку. Когда никогда выходил на турникиили стадион. Faila, даю сто процентов, вечнозависала у себя в гараже. А в свободноевремя рассекала пространство наших дорогна своей тачке. Flash, оказывается успелсмотаться на море. Вместе со своейподругой умотал в Крым на пару дней. Вон,даже загорел немного. А вот Void и Kornevмне не известно чем занимались. Послетого, как нужная информация быларасшифрована добытыми нами ключами, яих не видел. Каждый получил свою долю и

Page 88: VR-Online (June 2010)

Кретиff88

vr­online | июнь 2010

проводил время, как считал нужным. Отдыхмы заслужили. Если, конечно, можно считатьзаслугой кражу чужой информации.­ Я так понимаю, только я и Flash не в курседела? ­ спрашиваю, делая глоток сока.Каждый заказал себе, что хотел. Мне жепросто влом наливать каждый раз сок вбокал, поэтому пью прямо с горлышка.И Void рассказал свою затею. Он и Kornev несидели без дела эту неделю. Близятсявыборы. После завтра в город приезжаеткандидат в депутаты. Некий Калужин ВикторИванович. Впрочем, это не важно, Калужинили кто­либо другой. Они все «хороши».Достойных, ответственных и справедливыхмало. По крайней мере, я таких еще невстречал. Очередное выступлениекандидата, очередная порция лжи прямо влицо народу. Народу, который поверит этомучеловеку, стоящему у трибуны. Дорогойкостюм, дорогие туфли и галстук. Длинныйкортеж из дорогих автомобилей. Неужелиеще кто­то не понимает, что это не назарплату все куплено? Неужели люди ещене понимают, что их обворовывают. И впервую очередь крадут их права и свободы,которые можно отнимать бесконечно. Voidувлекся своим монологом.­ Ты, ты и ты, ­ он по очереди показал на насвсех пальцем, ­ вы все это понимаете. Вывсе это давно знаете. Мы живем запределами системы, можно сказать, нас этодаже не касается. В сети существуетнастоящая демократия, здесь – нет.Flash снова затягивается сигаретой и сзадумчивым лицом пускает дым. У меня вгорле пересохло, будто это я сейчас говорил.Я делаю еще один глоток с пака сока.­ К тому же, этот козел хочет продвинутьсвою программу против хакеров. Блин, урод!Не хватает им власти здесь, надо еще и всеть пустить свои щупальца.Мы все слышали про эту программу.Кажется, называется она «БезопасныйИнтернет». Дибильнее не придумаешь.Многие форумы забиты этой темой.Некоторые сообщества отреагировали наэто взломами государственных сайтов,оставляя на них свои возражения. Не оченьпредрассудительно, но так уж мы умеем. Воти Void хочет внести свою частичкубунтарства и, хакерского такого,неповиновения. И кажется не только онодин.­ Flash, что скажешь? – Спросил Kornev,всецело согласный с Void’ом.­ Почему бы и нет? Сотрем к хренам ихнаглость! – он затушил сигарету о

пепельницу.Его можно было и не спрашивать. Яростныйпоклонник манифеста хакеров, готовый датьотпор любому, кто посягнет на свободуинформации. В данном случае, так и есть идругого ответа от него никто не ожидал.­ А что ты думаешь, Driver? – Void посмотрелна меня.А что я думаю. Пару часов назад моя головабыла занята совсем другими мыслями. Атеперь я сижу за столом со своей тимой иобсуждаю, как бы обосрать выступлениеэтого придурка чиновника. И похоже всеждут только моего согласия.­ Не знаю, Void. – я откинулся на спинкудивана, ­ у тебя хоть план есть? Все такспонтанно.Впрочем, как и всегда.­ Ну, канешн, ­ он расплылся в улыбке.Следующие минут семь Void и Failaрассказывали нам свою идею. Вовсе некрупная, но красивая затея. И кто попало, еене провернет. Но я почему­то ещесомневаюсь.­ Мне надо подумать.­ Думай, Driver. Время еще есть, ­ Failaвстала из­за стола и застегнула курточку.Закончился второй пак сока. Flash затушилтретью сигарету. Kornev, похоже, набиралсмс­ку. Он встал из­за стола: «Мне пора,народ. Скоро увидимся».­ Погоди, я с тобой, ­ я встал за ним.­ Давайте, до встречи, ­ Void махнул намрукой.Мы вдвоем вышли на улицу. Уже стемнело.Мокрый асфальт, кое­где лужи. Галимаяпогода, в общем. Kornev подошел к своемуOpel.­ Я думал, ты на своем звездолете, ­удивился он отсутствию моего байка.­ По такой погоде? Потом ни его, ни костюмне отмою. Faila как знала и заехала за мнойпосле работы, ­ объясняю я.­ Так давай я подвезу тебя.Мне сейчас хотелось пройтись. Подумать.Взвесить все «за» и «против». А это сложноделать, когда рядом кто­то находится.­ Спасибо, но я лучше пройдусь.­ Что ж, тогда до скорой, ­ он махнул мнерукой и сел в автомобиль.Я иду к ближайшей автобусной остановке,

Page 89: VR-Online (June 2010)

обходя лужи. Кое­где на лавочках сидятпьяные парочки. Здесь очень малолюдно, дак тому же в такое время. Под легкимипорывами ветра с деревьев капают мелкиекапельки воды. Не пойму, то ли душно, то липрохладно и сыро. Непонятная какая­топогода. Как и мое настроение. Сейчас нехочется никого видеть, особенно встретитьзнакомого. Задумавшись над словами Void’a,я не сразу заметил двух парней, стоящих наостановке. Один из них достает из пачкисигарету и хлопает себя по карманам.Второй, делает глоток пива из бутылки.Может, зря я не поехал с ним на машине?­ Эй! Пацан, у тебя огонька нет?­ Не курю, ­ коротко отвечаю я, пытаясьпройти между ними.­ А если подумать?! – он толкает меня вгрудь ладонью и ехидно усмехается.Что бы не упасть я, пятясь назад, делаюпару шагов. Если бы ты умел думать, сейчасбы не приставал ко мне. Я нарочно делаюшаг вперед, пытаясь пройти между нимиеще раз.­ Ты, кажется, не понял! – и этот дибилведется. Он снова хочет меня толкнуть, но яуже готов к этому. Обеими руками крепкохватаю его за кисть и движением по дуге,выворачиваю ее наружу, на излом.Айкидошный прием. Что бы избежатьперелома, тело интуитивно делаетпереворот в воздухе. И он падает наасфальт. Это не на маты падать. Больно, язнаю. Нет времени фиксировать его руку. Яуже получаю в челюсть кулаком от второго.Отшатываюсь назад и спиной опираюсь офонарный столб. В последний моментуспеваю пригнуться и бутылка от пива,разлетающейся на осколки над моейголовой, врезаясь в столб. Сейчас не времядумать о гуманизме. Бью кулаком ему в пах.Корчась от боли, он выпускает из рук толькочто образовавшуюся «розочку». Я встаю,хватаю обеими руками его за голову, и бьюколеном. Словно спиленное дерево онгрохается на траву, сзади павильона. Яповорачиваюсь ко второму. «Куряга»,держась за кисть, пытается встать. Делаюшаг в его сторону и с разворота бью ногойему в грудь. Он слетает с бордюра на крайдороги. Каким способом можно побеждать?Любым. На улице по прежнему никого. Порабы уходить отсюда. Возможно, кто­то виделдраку из окна и вызвал милицию, а она небудет разбираться кто прав, а кто нет. Но явсе же решаюсь склониться над лежащим наземле и держащимся за грудь мужиком, ипрошептать: «Это ты не понял, пацан.Курить вредно». В его глазах видно боль и

гнев. Но теперь он не может мне возразить.Я выворачиваю свою двустороннюю курткуна изнанку и одеваю, но уже красную поцвету. Пройдя дворами к другой дороге, явызвал такси. Мандраж прошел, когда я ужепринимал душ. Такие стычки это всегданеприятно и страшно. Настроение упало вноль. Делать ничего не хотелось. Я смотрелна город с балкона и рассуждал над планомVoid’a. Я поймал себя на мысли, что я невсегда был таким. Решительным, дерзким,может наглым. А какого черта? Я достаюкоммуникатор и набираю ему смс: «Я свами». Нервное окончание дня выдалось.Единственное, что успокаивает меня этомысль о скорой встрече с Катей.

* * *

Девять часов утра. Солнце почти высушилолужи на дорогах от недавних дождей. Легкийветерок одаряет собравшихся людейтеплым воздухом. На одной из площадейгорода, возле дома культуры, собраласьдовольно большая толпа народа. Какобычно это пенсионеры, пришедшиепосмотреть на будущего депутата, которыйуж точно наведет порядок. Еще пришлистуденты и школьники, готовые за налогисвоих же родителей махать флажкаминеобходимой партии. Причем им безразницы, какой. Сегодня платит один, завтра– другой. Некоторые родители пришли сосвоими детьми. Где­то в этой толпенаходятся Flash и Kornev. Основную частьсвоей работы они уже выполнили, теперьбудут снимать на камеру все происходящее.На здании ДК, с большими стеклами с однойстороны, на уровне третьего этажа висят трибольших экрана. Раньше там был толькоодин и использовался он для рекламы.Перед приездом чиновника, распорядилисьповесить по бокам еще по одному. Еговыступление будут снимать на камеры, аизображение передавать на эти экраны. Такбудет видно и слышно тем, кто не сможетподойти близко к трибуне. Так жепланируется после выступления показатьлюдям маленький патриотический видеоролик, рассказывающий о достижениях изаслугах данной партии перед народом.Ближайшие кварталы патрулируютсясотрудниками милиции. Некоторые участкидорог перекрыты для свободного проездакортежа чиновника.­ Не много ли чести? – недовольная Failaсворачивает в объезд, куда ей показываетсвоим жезлом гаишник.Она проезжает еще пару кварталов и

Кретиff89

vr­online | июнь 2010

Page 90: VR-Online (June 2010)

Кретиff90

vr­online | июнь 2010

паркуется на обочине. От сюда есть прямаявидимость на здание с экранами. Как раз то,что надо. Void, как всегда, сидит рядом. Наспециальной подставке лежит его ноутбук. Вслот расширения вставлен адаптер длябеспроводной сети. От него тянетсяпроводок к маленькой антенне, которая покалежит на бардачке. Я давно прошмыгнул вздание и сейчас подымаюсь по лестнице натретий этаж. Все оборудование,необходимое для выступления,настраивалось техниками какой­то компаниисегодня утром. Поэтому у нас не быловремени подготовиться заранее и основнаяработа делается буквально за пол часа довыступления. В этот раз никаких костюмов имасок. На мне неброская одежда: джинсы,футболка, кепка и рюкзак через плечо. Врюкзаке точка доступа, которуюспециальным образом перепрошил иперепаял Flash. А еще схема с инструкциейсборки этих экранов, которую я, кажется,выучил наизусть. Подымаюсь на третий этажи прохожу на маленький балкончик, накотором и закреплены три монитора. Сноваотвертка, снова я откручиваю винтики иснимаю крышку. Все как положено, все насвоих местах согласно схеме. Интересно,каким образом Kornev раздобыл этуинструкцию? Данные мониторы могутработать как один, разделяя между собойширокоформатное изображение. Вот видеорегистратор, распределяющий картинку.Провода, от него спускаются с балкончикавниз. Оператор управляет всем с улицы. Ондолжен видеть выступающего и включатьнеобходимые слайды или видео вопределенный момент времени,подстраиваясь под его речь. Что ж, мы тоже.Я подсоединяю к нужным разъемамкрокодилы, идущие с проводами от точкидоступа. В нее вставлена SD карточка всеголишь с одним видео файлом, который намнеобходимо запустить. Но только мнежелательно быть в это время уже запределами здания. Ведь убедившись, чтооператор не напартачил, охрана думаю,сбежится сюда. В этот раз мы непереговариваемся через радио. Voidпереживал, что переговорные устройстваохраны могут работать на той же частоте. Дав принципе, не сильно они и нужны сейчас.Тем временем, внизу на трибуну ужеподнялся кандидат в депутаты. Он встал замикрофоны и начал произносить свою речь.Я не вслушивался в его слова. И так ясно,что он будет гнать пургу. Все этисладкоголосые болтуны и политиканыговорят одно и тоже. Мы сделаем вашужизнь лучше, мы позаботимся о вас, тольковыберите меня. Дайте мне власть. Я ужезакончил. Дождавшись пришедшую через

минуту смс­ку «Есть линк. Сваливай», яразворачиваюсь и выхожу с балкона. Вследующий момент я цепенею. Это же она.Мое сознание просто переполненодогадками. Да что она тут делает?­ Кто вы такой и что здесь делаете? –деловым тоном спрашивает Катя.Я подымаю козырек кепки, и она узнаетменя.­ Это… это ты? Андрей? Что… что ты здесьделаешь? – она растеряна не меньше моего.­ У меня к тебе тот же вопрос, ­ даже не знаятолком, что сказать, ответил я.­ Я вообще­то отвечаю за работу этоймультимедиа системы. А твое присутствиездесь мне абсолютно не понятно, ­ вероятноона тоже теряется в догадках.Как же я был прав. Вторая встречаоказалась не менее неожиданной изагадочной. Чиновник тем временем ужезаканчивает свою речь.­ Уважаемые друзья! А теперь я бы хотелпродемонстрировать вам результаты нашейработы. За прошедшие пару лет, с нашейпомощью были реконструированымножество детских садиков, школ,библиотек, детских домов, ­ вся его речьсопровождается интенсивными жестами рук,­ наши специалисты создали специальныйролик с интервью благодарных директоров,воспитателей, пенсионеров. Всех, ктооценил нашу работу по достоинству.Надеюсь, вы так же оцените наш труд, ­ онвытянул руку вверх и провел ею, указываяна экраны.­ Кина не будет. Электричество кончилось, ­Void явно доволен происходящим. Оннажимает пару клавиш на ноутбуке, испециальные команды летят по радиоканалуэти триста метров и достигают своей цели.Лампочка приема данных на только чтоустановленной точке доступа начинаетинтенсивно мигать. Ей нужна была толькоэта команда, дальше она будеттранслировать видео сама.­ Ты прикинь, как он сейчас обделается вштаны, ­ с довольной улыбкой, Voidпосмотрел на Файлу.­ Это все круто, но я по­прежнему не вижуDriver’a, ­ Faila все наблюдает за стоянкой, скоторой я давно должен был выехать насвоем мотоцикле.Неожиданно звук с колонок экрана за моейспиной пропадает. Небольшое мгновение,кажется, что экраны вообще вышли ихстроя. Но потом начинает играть

Page 91: VR-Online (June 2010)

Кретиff91

vr­online | июнь 2010

электронная гитара и барабаны. Катяпонимает, что я здесь не случайно.­ Это что такое? – неуверенным голосом онаспрашивает у меня, ­ Что здесь происходит?­ Это ответ на твой вопрос, что я здесьделаю, ­ я понимаю, что мне сейчас надомногое ей объяснить. Я так же понимаю, чтоделать надо это быстро, так же, как и валитьот сюда, ­ да, я здесь, что бы сорватьвыступление чиновника.Люди внизу, ожидавшие увидеть фильм,прославляющий этого кандидата, замерли,смотря на экран. Видео колышущегосяфлага России, сменяется кадрамиразрушающегося жилого дома, стычками наулицах между обычными гражданами иотрядами ОМОНА.Заплати налоги и живи спокойноНо каждый рубль как покойникНа эти деньги люди сверхуНас, всех остальных, превращают в перхотьОни проводят невнятные реформыМеняют гаишникам название и формуКидают стариков через одно местоКаждый день проверяя, из какого же мытеста!Остолбеневшие, все как вкопанные смотрятна это видео. Кандидат тоже. Его лицопокраснело. Его охрана переговаривается порации.Здесь типа демократия, на самом делецарствоЯ так люблю свою страну... и ненавижуГосударство, государство, государство!Я ненавижуГосударство, государство, государство!Съемки достопримечательностей нашейродины, памятники, леса, архитектурныесооружения быстро сменяются кадрамиразжиревших морд чиновников, их драк припринятии очередного закона и ихнедовольными ухмылками.­ Но зачем? – она все еще не верит своимглазам.­ Зачем? А ты посмотри на этих людей, ­ янемного подымаю тон, ­ они же веряткаждому его лживому слову. Пусть хоть натри минуты задумаются, кого они выбираюти каковы будут последствия.­ Но… но этим же ты ничего не изменишь, ­

она все еще растеряна.­ Кардинально нет. Но это уже что­то.На экране продолжают сменяться кадры:ребенок с шапкой у ног играющий нагармошке, колонна БТР едущая по улицегорода, пенсионер, стоящий у магазина ипересчитывающий мелочь.Заплати налоги и живи спокойноНа эти деньги продолжают войныЛюди делят власть и нефтьМы пешки в играх, мы не люди, нет!Плати налоги, живи спокойно,И похеру на то, живешь ли ты достойно!Твое право ­ заткнуться, молчать!Ты еще не понял!?Гони бабки, твою мать!Она так и не сдвинулась с места.­ Катя, ­ я хочу подойти к ней.­ Уходи, Андрей. Тебе надо уходить, ­ онаподняла на меня свои глаза, на которых язамечаю слезы.­ Но…­ Я сказала, уходи! – она впервые накричалана меня.Сейчас не тот момент, что бы выяснятьотношения или объясняться. Если меняпоймают, то я этого сделать уже не смогу.Кажется, на улице начался какой­то движняки гул. Наверное, это видео вызвало буйнуюреакцию у собравшихся людей. Впрочем, яэтого не вижу. Открывая ногой дверь,выбегаю на лестницу.Здесь типа демократия, на самом делецарствоЯ так люблю свою страну... и ненавижуГосударство, государство, государство!Я ненавижуГосударство, государство, государство!На последнем пролете вижу мужика вчерном костюме, подымающегося мне навстречу. Я на взводе. Не знаю, есть ли уменя другой выход? Бросаю ему в лицо свойрюкзак. Он ловит его руками и тут жеполучает в плечо ногой. Падает на спину иоткатывается. Я пробегаю мимо него ивыхожу в двери, ведущие на стоянку,которая находится с обратной стороныздания. Блин! Не идиоты все же. Второйохранник опускает шлагбаум на въезде и

Page 92: VR-Online (June 2010)

Кретиff92

vr­online | июнь 2010

бежит в мою сторону. Я запрыгиваю на свойбайк. Ключ в зажигание и двигательзаводится с пол оборота. Зажимаю переднийтормоз, выкручиваю ручку газа иповорачиваю руль. Буксуя, мотоциклразворачивается на месте. Отпускаю тормози, с нарастающей скоростью, переднееколесо подымается вверх. Охраннику ничегоне остается, кроме как сделать перекат всторону, что бы не попасть мне под колеса.Деревянный шлагбаум разлетается нащепки, встречаясь с рамой моего байка. Яснова становлюсь на два колеса и жму, всебыстрее разгоняясь по выезду из этойстоянки. Но в следующее мгновение двемилицейские семерки перекрывают мневыход. Плотно так друг к другу стали носами,я не протиснусь. Заднее колесо перестаетвращаться, идя юзом и оставляя наасфальте след от резины. Мои гениальныеидеи закончились. Я словно загнанный вугол зверь. На этой мысли из­за поворота сзаносом вылетает Mazda Файлы и мчится вмою сторону. Она все быстрее разгоняется,и останавливаться не собирается.­ Faila, твою мать, что ты делаешь! – я, чутьли не кричу это.В десяти метрах от милицейской баррикадыиз их автомобилей Faila делает полицейскийразворот. Визг низкопрофильных покрышек иMazda уже мчится задом. Скрежет металла игрохот разлетающихся фар. Две семеркиразворачиваются под ударом Мазды илишаются своих передних бамперов вместес помятыми капотами. Тачка Файлы тожепострадала. Заднего бампера как небывало,фар тоже. Спойлер слетел с крыши ипроцарапал по асфальту несколько метров.Она дает мне гудок пару раз и спробуксовкой снова газует вперед. Вот он,зеленый свет. Я снова набираю скорость ипролетаю мимо двух покореженныхавтомобилей милиции.

* * *

Людей здесь как всегда много. Кто­то тащитсвои сумки, кто­то остановился, что быпосмотреть расписание поездов на табло,кто­то уже бежит за ним, явно опаздывая. Яже стою за колонной и выискиваю в толпеее. Неужели не придет? Очень надеюсь наобратное. А может она не получила моепослание? Вряд ли. Я все проверил, онодошло. Должно было дойти. Отрываясь отпогони, признаюсь, я не сильнозадумывался, когда и каким образом вновьувижу Катю. Бешеная гонка длилась недолго. Я смог скрыться дворами, лавируя на

своем мотоцикле. А догнать Файлу этимребятам на их «мусорных ведрах» просто недано. Собравшись в оговоренном ранееместе, решено было пропасть из виду накакое­то время. Новые снятые квартиры длявещей, гаражи для автомобилей, путевки наруках. Все по­тихому разъехались кто куда.Отснятое Flash и Kornev видео вызваломножество восторженных отзывов наyoutube. Впрочем, оно разнеслось по многимсайтам. Тут я замечаю знакомую фигуру втолпе. Катя стоит в центре вокзала ипытается найти меня. Хм, кажется, пришлаодна.­ Я очень рад видеть тебя снова, ­подкравшись сзади, тихо говорю я.Она оборачивается. На ее лице явнаягрусть. Я ожидал всего. Упреков, криков,пощечины. Но я и подумать не мог, что онабросится мне на шею с объятиями. Я немогу сдержать свою радость и крепкообнимаю ее в ответ.­ Ты дурак, Андрей, ­ с вздохом шепчет она.Я улыбаюсь, глядя ей в глаза. Кажется, онатоже немного повеселела. Катя достает изкармана открытку, которую я послал ейвместе с цветами. Открывает и зачитываетмое послание: «Любой поступок,безразлично, чем он был вызван, тянет засобой целую цепочку следствий. А вот каких– зависит совсем не от самого поступка,только от отношения к тебе». Внизу дата,время, место и моя подпись.­ Поехали со мной?­ Что? Куда? – наверное, я не перестаю ееудивлять.­ В Крым. На море. Не на долго, отдохнем,погуляем.­ Но как же…­ Брось все, ­ я осмелился перебить ее, ­забудь про все на неделю. Поехали, ­достаю из кармана билет на поезд.­ Но у меня нет билета, ­ снова удивление наее лице.Я пальцами расслаиваю в руке билеты,которые были сложены один на один. Катяснова улыбается и целует меня. Это значитда!

Page 93: VR-Online (June 2010)

Песнь легионаЧасть 3

93

09:00, 1 5 часов назад

Прошло всего две­три минуты, как вдруг донего донеслись звуки приближающихсямашин. Он лёг на пол, поджав под себя руки.Здесь неподалёку были отделения милиции,поэтому они приезжали быстро.Два человека в форме зашли внутрь.­ Помогите, ­ прохрипела лежащая на полуфигура в плаще.Они спешно подняли его под руки, он былслаб, еле стоял на ногах. Один из нихподхватил его и прислонил к стенке, чтобыбыло легче стоять. Человек что­то бормотали надолго закрывал глаза, норовя заснуть.Его приходилось потряхивать, чтобы он незаснул окончательно.Второй милиционер осматривал трупы.­ Скажите, кто на вас напал? ­ С этимвопросом он обратился к ещё живомупострадавшему. То, что он увидел, ввело егов ступор: только что умирающий человек,которого они подобрали, стоял у стены идержал в руках голову его напарника. Номерсто двадцать четыре. Ещё больший ужас онощутил, когда эта голова полетела в него. Они не думал уворачиваться, у него простовдруг как­то защемило в груди. Он потянулсяк ней рукой, но не успел, ибо в грудь ему какраз в сердце воткнулся нож. Номер стодвадцать пять."Голову нужно отрезать следующим образом:сначала делаем надрез по окружности,разрезая кожу и частично мышцы. Далееследует приложить нож, желательно пилкой,к горлу и начать пилить. Горло быстроразойдётся, нужно только, чтобы появиласьдырочка. Дойдя до позвоночника, нужнопросто оторвать голову."С трофеем в виде головы он проследовалнаверх. Всё шло по плану ­ в квартиреубитых находилось три человека, а этажомниже была приоткрыта дверь в квартиру.Внутри на кровати спал ребёнок лет семи­восьми. Без особых предисловий он отрезалему голову. Тот, конечно, проснулся за миг доконца, открыл глаза, всплеснул руками и что­

то прохрипел. Номер сто двадцать шесть.Дело было начато, он отрезал голову доконца. В каждой руке по трофею, онподнялся наверх. В трёх жертв полетелиголовы убитых. Одну из женщин, ту, чтобыла справа, он убил, размозжив ей головуломиком. Номе сто двадцать семь."При ударе справа наибольшая силадостигается, если бить справа налево подуглом к горизонтали в сорок пять градусов.При ударе слева одной рукой всёаналогично. Слева одной рукой ударполучается сильнее, чем двумя руками, номенее точный."Другую женщину и, видимо, её дочку онвтолкнул плечом на отлёте в комнату. Онивсе вместе повалились на пол."Смерть. Идём дальше."­ Стоять! Вы умрёте.В этих случаях принято брать детей взаложники, но он решил этого не делать.Начнутся крики, ажиотаж, паника. Нет, всегоэтого нам не надо. Дотянувшись левойрукой, он вжал её виском в угол стены. Оназадёргалась и попыталась укусить его, но онуже был на ногах. Правой рукой он ударилей в горло, она сжалась и захрипела.Подхватив за талию дочку, он в два прыжкаоказался у окна и бросил её вниз. Оналетела наперегонки с битым стеклом. Удароб козырёк. Номер сто двадцать восемь.Слушать. Главное ­ слушать. Он не видел,но слышал, как за его спиной в яростиподнялась женщина, забыв о боли иневозможности вздохнуть. Она как паровозпошла на таран."Ярость затмевает сознание. Нельзявыиграть на одной лишь ярости. Дляуспешного боя нужен холодный расчёт.Уклоняйся."Он отпрыгнул в сторону. Просто иэффективно, как всё гениальное. Вбольшинстве случаев эта гениальностьлежит на поверхности, только людипривыкли издревле глядеть вдаль, поэтому

vr­online | июнь 2010

Автор

:Neon

_Kalig

ulaКреатиff

Page 94: VR-Online (June 2010)

не видят очевидного. Логика проста ­ она неможет вздохнуть, у неё перебито горло, а влёгких плещется кровь. Её даже не стоиттрогать. Через пару минут номер стодвадцать девять умрёт.Её имя было Зинаида Вячеславовна. Такоесложное для произношения детьми, а ведьон её знал ещё с детства. Ещё с детскогосада, куда они приходили вместе с егомамой. Зинаида Вячеславовна всегдаприносила ему какую­нибудь конфетку, восновном, конечно, карамельки, чтобыможно было растянуть удовольствиенадолго.Сейчас она совсем не была похожа на тудобрую мадам, какой он знал её с детства. Вней кипела злость и желчь, она не узнавалаего. Они не виделись уже больше десяти лет,но он помнил её. А она его ­ нет. Какаядосада."Ой, я же забыл, что у служителейправопорядка должно быть табельноеоружие. Надо забрать."Он спустился вниз, к своим баранам. Трибарана лежали уже в луже крови. В карманечеловека в форме он нашёл пистолет,причём с глушителем, и ключи от машины.Приятное приобретение. В магазине былошесть пуль.Он сел в машину. На дворе было уже утро,но народу было очень мало. Видимо, дождьне способствовал тяге к природе. Многие бымогли сейчас поехать на дачи или просто загород, всё поближе к природе. Ну, что ж, онивольны сами выбирать, и сегодня некоторыеиз них уйдут в лоно природы навсегда.Убить всех, никого не оставлять в живых.Сейчас, по прошествии более чем девятичасов, он не ощущал ни физической, ниморальной усталости. Тело его работало какчасы, моторчик в груди бился, все мышцыдвигались на ура. В голове всё было ясно,мир не двоился и не мутнел, его ещё ни разуне повело.Тут можно было бы задуматься, что так недолжно быть, что он должен былвыдохнуться уже давно. Но он не думал обэтом. Эта была одна из привычек, котораяникогда его не подводила ­ пусть он сейчас ине чувствует ничего, но это всё за счётсамовнушения. Если хоть на долю секундыон задумается над этим, если позволит хотьчастичке сомнения войти внутрь, то онпроиграет.­ Не останавливаться! ­ Как заклинаниеповторял он себе, заводя машину.

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

Креатиff94

vr­online | июнь 2010

Page 95: VR-Online (June 2010)

ограждение, сложившись пополам.Номер сто тридцать два."Убивайте, убивайте, убивайте. Не думайте опоследствиях. За вас будет отвечать партия."Прекрасный вид открывался из окна:четырёхполосная дорога, справа и слевапроплывают высокие деревья. Он ехал вдеревню, это всего в паре километровотсюда по прямой. Народу здесь вообще небыло, да и кому нужна эта дорога.Возвращаться будем в объезд черезновостройки.Он выжимал сотню по дороге, где былоразрешено не более половины. Но, даже наэтой скорости он смог заметитьобразовавшуюся сзади красную десятку смигалками и тонированными боковымистёклами. Она стремительно догоняла его ихотела идти на обгон.Пижон. Видит, что тачка патрульная с синиминомерами, а всё равно наглеет. Мигалкукупил. На вид ему лет двадцать, не более,рядом сидит девушка, это заметно попышным волосам. На долю секунды Легионупоказалось, что пижон едет без ремнейбезопасности.Подпустив десятку к себе метров на пять, онплавно опустил руку к ручнику. Прошла всегоодна секунда, в течении которой раздалсяпронзительный визг тормозов, а вслед заним звук удара. У десятки смялась морда, отудара она аж подпрыгнула.Лобовое стекло вылетело, а вслед за нимоттуда вылетел водитель, пролетел метровдесять по мокрому асфальту и застыл в поземорской звезды. Номер сто тридцать три.Прошла минута. Девушка испыталатяжелейший шок, но всё ещё была жива, ибопристёгнута."Это жестокий мир, что бы там не говорили.Либо ты, либо тебя."Кто­то будил её, хлестав по щекам. Ондёрнулась и открыла глаза. Почему­то всёбыло темно, а потом она услышала громперед собой, и что­то жгучее вошло ейпрямо в сердце. Слёзы хлынули у неё изглаз. Это было больно, очень больно. Она незнала, что такую боль вообще можноиспытывать.Как будто миллионы игл воткнулись ей вголову, всё вокруг зашипело, и насталатишина. Номер сто тридцать четыре."Вон, за рубежом, говорят, паренёк в метро вкачестве самообороны пристрелил двадцать

с лишним человек. Ничего, оправдали."Десятка была уже на списание, нопатрульная всё ещё на ходу. Он поехалдальше, минуя автобусную остановку. Здесьслева неподалёку было радио­поле, тамбыло множество антенн.Он остановился около остановки противдвижения. Человек, до этого прятавшийсяпод навесом листвы ближайших деревьев,выскочил и подбежал к машине.­ Хотите подвезу? ­ Вежливо осведомилсяЛегион.Не дожидаясь ответа, он резко отворилдверь, попав человеку по лбу. Тот упал вгрязную лужу.­ Спать, ­ прошипел он и выпустил ему пулюв лоб.Номер сто тридцать пять.Осталось четыре пули в пистолете, он сунулего в карман. Дождь продолжал моросить,но ветер вроде бы стихал. Природа.

1 0:00, 1 4 часов назад

Романтика, однако.Он снова сидел в покрякивающей машине,ехал к первой отметке в своём плане. Задесять часов он обошёл почти всю новуючасть своего города, не оставляя никого вживых после себя. Романтика.По дороге далее справа следовалипокосившиеся и давно необитаемые дома.Пару лет назад всех выселили отсюда,аргументируя тем, что здесь будутновостройки. Все ушли, а новостроек всёнет. Они есть там, далеко в глубинедеревни, там продолжение города строится.Через пару сотен метров он повернулнаправо. Здесь в некоторых домах всё ещёкто­то жил; тут была подстанция и ещёпарочка муниципальных сооружений.Проехав ещё пару сотен метров, онповернул налево. Вот он ­ купол церкви. Уворот заборных сидел под навесомпопрошайка с протянутой рукой. Легионостановился около него. Сунув руку вкарман, он выудил оттуда десятку, протянулему. Тот трепетно принял взятку. В ту жесекунду его схватили за голову, и он получилудар коленом в лицо. От неожиданности онупал и ударился головой о твёрдый бетон.Номер сто тридцать шесть.

Креатиff95

vr­online | июнь 2010

Page 96: VR-Online (June 2010)

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

Двоих он уложил первыми двумя пулями.Достаточно было просто заметитьизначально путь пробега, а потом стрелять,как если бы стреляли в тебя. Первая пуляскользнула человеку сзади в районе уха, авторому попала в шею.Последующие летели уже не так точно ­было истрачено десять пуль, а может ибольше, прежде чем удалось завалить ещётроих. Они падали, стараясь уберечься,потом вставали и пытались бежать. Номерасо сто тридцать девятого по сто сороктретий.Перехватив оружие на манер двуручноговесла, он оттолкнулся правой ногой от стеныне снижая скорости, и прыгнул наоставшихся в живых мужчину и женщину."Каждой твари по паре, плодитесь иразмножайтесь."Женщина стояла, как вкопанная, даже недумая отходить от прущего на неётепловоза. Мужчина попытался дёрнуться,чем привлёк внимание убийцы. Тот немногоизменил направление, решив не убиватьдвоих сразу, а повалил мужчину, изо всехсил вдавливая ему приклад в горло. Онвидел, как горло прогибается и ломается,приклад ушёл внутрь по самые позвонки.Номер сто сорок четыре.А потом он обратился к ней, направив на неёокровавленный приклад автомата. Онастояла от него на расстоянии вытянутойруки, платок, обрамлявший её голову, сползна плечи, волосы мелко дрожали."Цербер вышел на охоту. Он голоден."Он опустил ствол. Металл гулко упал накаменный пол. В руках у него появиласьудавка. Женщина явно осмелела, вдругприосанилась и ударила ему в промежность.Боли не было. Боль наступит через парусекунд, но сейчас время ещё есть.Резким движением ноги он заставил еёсогнуться, тут же прыгнул, очутился позадинеё и набросил струну ей на шею. В тот жемомент боль настигла его. Такая резкая,проходящая снизу и до головы. Он молчал.Вся боль и ярость от боли он перевёл в руки.С нечеловеческой силой он стягивал струнуна её шее, потом последовал рывок. В стенуотлетела женская голова. Телоперевернулось и пролетело пару метров.Номер сто сорок пять.Его даже не испачкало кровью, так всёбыстро произошло. Кровь при полётевыплёскивалась из тела, разлеталась встороны, окропляла фрески на стенах. В техже стенах теперь были пули, как

Креатиff96

vr­online | июнь 2010

Page 97: VR-Online (June 2010)

напоминание о бойне.Откуда­то из­за помоста выскочил мощноговида человек в рясе. Такой здоровый как быки бородатый. Он закричал тоненькимголоском, почти завизжал, бросился наЛегиона. Тому было больно, но эта больперешла в ярость.Из лежачего положения он вскочил и соспринтерской скоростью ринулся начеловека в рясе. Подобно стреле онбуквально вонзил ему руку в грудь. Кулакбуквально ушёл внутрь. При этом грудьчеловека хрустнула и заскрипела, рёбравдавились внутрь, выходя с другой стороны.Легион чувствовал у себя под рукой горячеесердце, как оно бьётся. С животным рыкомон вырвал свой кулак обратно, по ходузацепив нательный крест.Номер сто сорок шесть.На стене напротив входа в залу стоялогромный крест из двух осиновых брусьев,таких неровных и необработанных. Взяв трупсвященника с пулей во лбу за руки, онводрузил его бренное тело на крест,задницей к выходу.За следующие десять минут он воткнул вкаждого убитого по три свечки и поджёг.После этого он встал у большой и красивойиконы с изображением какого­то святого,расстегнул ширинку и отлил на неё.Помещение озарялось приятнымподрагивающим светом десятков свечек. Вэтом была некая романтика."Это сложно ­ ощущать романтику вситуации, когда её нет. Вот, прожив этуситуацию, можно говорить, что это былоромантично. Но почему­то никто не говорит,что то, что он сейчас делает ­ романтично."Ещё на входе он заметил стоящую за угломшестёрку. Судя по всему, хозяин её лежалздесь. Через минуту поисков он обнаружилключи.На улице в побитой казённой машине до сихпор лежал труп. Надо было избавляться отулик. Безусловно, такое действие, какрасстрел церкви, не может пройти безвнимания общественности, и скоро по городуначнётся ажиотаж. Но, не следовало быоставлять указание на путь его следования.За церковью был овраг. Через пару минут онстолкнул машину вместе с трупом в овраг.Скорее всего, новостройки не замахивалисьна дом отдыха, а как раз к его территориипримыкала деревня. В сущности, это был непросто дом, а целый комплекс, которыйзанимал огромную территорию. Тут былонесколько домов для проживания, парк с

высоченными деревьями, детский сад, своякотельная и подстанция, множествоплощадок для игр, тренажёрные залы ипрочее.Первой на очереди шла котельная, котораяотвечала за подачу горячей воды в домотдыха. Дверь была закрыта, но онпостучал. Открыл ему толстый дядька сусами и раздражённым взглядом.­ Выходи, ­ сказал ему Легион, сунувпистолетом в пузо, Развернись.Тот покорно вышел, встал лицом к стене ирасставил ноги, как при обыске. Легионподошёл к нему и ударил пистолетом ввисок. Крови не было, он просто упал безсознания. Он выудил из рюкзака упаковку содноразовым шприцем и иглой."Всегда только одноразовые шприцы. Надозаботиться о здоровье."Он нашёл у лежачего вену на сгибе руки иввёл туда воздух. Хорошая такая вена была,толстая. Человек лежал без сознания,словно спал, дышал спокойно и равномерно.Вдруг он резко вздохнул полной грудью,дёрнулся, и больше не дышал. Номер стосорок семь."Только красота спасёт мир... Хотя, нет, вру.Его уже ничто не спасёт. Армагеддон близок.Ближе, чем сотню лет назад."Шло время.В глубинах котельной всегда что­то гудело ишкворчало, впрочем, к этому привыкаешь.Это работал нагнетатель с компрессором.Около них за стеной мужчина лет сорока сбольшим пивным животом целовался взасосс проституткой. Странно, конечно, но этобыла его жена.­ Что­то он застрял совсем. Я щас.Немного заплетающейся походкой онпрошёл мимо компрессора и вышел наулицу. Там он и увидел своего товарища,прислонённого к стене, спящего.­ Витёк, твою мать, ­ воскликнул он, отливаяна железяку рядом, ­ мы его ждём, а ондрыхнет.­ Нет, он умер, ­ раздался голос рядом. Тамстояла странная фигура с затемнённымлицом. ­ Это я его убил.Мужчина не знал, что сказать. Он взглянулна Витька. Тот спал, не было сомнений.Только вот грудь не вздымалась. Он хотелспросить незнакомца что­то, но получилметаллической трубой в дыхалку. Он упал наколени. Легион размахнулся, и снёс ему полголовы. Номер сто сорок восемь.

Креатиff97

vr­online | июнь 2010

Page 98: VR-Online (June 2010)

Креатиff98

vr­online | июнь 2010

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

11 :00, 1 3 часов назад

"Чистая работа ­ это чистая работа, еслитолько она не грязная. Это аксиома игры,можно сказать, одно из правил. Хочешьиграть, соблюдай правила. Не хочешь ­выбывай. А всё остальное ­ это блеф."Если отключить котельную, скоро здесьбудут все. Он щёлкнул несколькимивыключателями. Если план, висящий настене, верен, то он только что отключиладминистрацию. Оставалось ждать.В течение минуты он спрятал трупы вподсобке. Можно было подготовить ловушку,но это если успеет.Он направился в детский сад, так как он былближе всего. Тут должна бытьадминистрация и воспитатели. На входеникого не было, но сторож просто обязанбыть. За зданием обнаружилась небольшаяпристройка, вроде склада. Дверь былатонкая, но рядом с ней лежал амбарныйзамок внушительных размеров.­ Эй ты! А ну айди оттуда! Собак натравлю! ­грозно ругался сторож, седой дядька стросточкой.Легион не раздумывал, просто побежал нанего, пригнувшись, готовясь к тарану. Дедокподнял, было, палку, готовясь ударить, какбыл сшиблен. Легион протащил его паруметров на плече, поднял в воздух и шмякнулоб землю. Дед от удара выронил трость,схватился за грудь двумя руками и захрипел.В этот момент ему свернули шею. Номер стопятьдесят."Человеческое тело гораздо более хрупкое,чем кажется. Человека легко убить всегоодной раной, а может и всего одним ударом.То, что показывают в фильмах, когда геройполучает ногой в голову, а потом встаёт идерётся ­ враньё. После такого удара он несможет встать несколько дней, если не

недель."Парадный вход был открыт. Внутри былокрасиво и уютно. Когда он входил, ураздевалки сидела молодая женщина скнижкой в руках. Она как­то безразличноподняла на него глаза, за что они тут жебыли выколоты. Такой звук лопающегосяпузыря. Она закричала. Удар сверху трубойодной рукой. Череп треснул, обнажаякроваво­розовые мозги. Номер стопятьдесят один."Когда ты будешь там, ты будешь не один."Прошла минута, и в коридоре послышалсяшум двух пар ног: они услышали крик.Громкое цоканье каблуками, как кобылы встойле. Их взору предстало, вероятно, неочень приятное зрелище: женщина сраскроённым черепом, из которого норовиливывалиться мозги."В сущности, нет ничего страшного ипротивного. Есть просто предубеждения.Если понять, что мозг есть в каждомчеловеке, то противно не будет."Женщины любят кричать, кричатьпронзительно, переходя на визг. Эти стоялимолча. Был ли это шок или они пока ещёничего не поняли, разбираться не быловремени. Он подкрался незаметно сзади сметаллическим стулом в руках. Размах,удар. Номер сто пятьдесят два.Она стояла молча. Такая статная женщина вочках и высокой причёской красного цвета.Таких мы в школе звали Мегавольт. Онасмотрела, не двигаясь, только зрачкибешено вращались, перемещая взгляд субитых на убийцу. Он же держал стул усамых ног.Прошло две секунды. Он отвёл стул чутьвлево, сделал шаг правой ногой вперёд, чутьпригнулся и на выдохе махнул стулом снизувверх. Удар пришёлся ей по животу,скользящий, он вдавился внутрь неё, норазрывов не было. Железка пропахала весьживот и упёрлась в солнечное сплетение.Она подпрыгнула и отлетела в сторону,извиваясь, как червяк, которого достали изземли. Он вновь налетел на неё, прицельнопопав по рёбрам. Те хрустнули и ввалилисьвнутрь. Номер сто пятьдесят три.Пришло время возвращаться.Под дождём по аллее, уходящей вдаль,бежала женщина лет тридцати со своейдочкой. Обе они были одеты в спортивныекостюмы, а сверху на них были плащи.Стоп! Это не по правилам. Но так дажеинтереснее.

Page 99: VR-Online (June 2010)

Он выступил из­за угла в неожиданныймомент. Просто пристрелил однимвыстрелом маленькую девочку. Номер стопятьдесят четыре. Вы можете представить,что чувствует родитель, когда у него наглазах умирает его же ребёнок? У вас естьтакая возможность. Ну, или появится вбудущем.Мать была в одновременно множествесостояний: ярости, панике, горе инедоумении. Она не могла поверить, что то,что бежало только что рядом с ней, теперьпредставляет собой охладевающее тело.Желание спасти ребёнка придаёт иногдаматерям большую силу."Есть теория, что в моменты критическихопасностей организм, во избежание смерти вцелом, снимает все ограничения. При этомследует понимать, что, раз границы сняты,то человек запросто может себе навредитьименно использованием своего организма нанестандартных режимах. Но именно этиповреждения позволяют не умереть."Но ярость всегда ослепляет. Силы много, ноеё нельзя направить в нужное русло. Онуклонился просто присев немного. Она неожидала этого, она хотела его задушить наместе, а он вдруг присел.В момент, когда они поравнялись, он схватилеё за плащ и развернул. Она удариласьголовой об угол и упала. Он встал над ней,делая разрез на всю шею. Номер стопятьдесят пять.Класс! Складируем. Он спихнул тела вканаву рядом. Там их скоро найдут крысы.Впрочем, те, кого он ждал, ещё непоявились. Дорога к домам здесь всего одна,стоит самому к ним сходить.Они сами пришли к нему как миленькие.Такие взволнованные. Их было трое ­ двеженщины в пиджаках и один мужчина, повиду слесарь. Они остановились около него,спросив, не видел ли он чего необычного. Вобыденной жизни это можно было назватьхамством, но он промолчал. Они жезамолчали, когда он достал пистолет.Как раз три пули оставалось, но он не хотелтратить больше одной. Ветер усиливалсяснова, а дождь всё лил. Целиться нужно вголову или сердце, так умирают сразу.Слесарь получил пулю точно в пах, а дамыбросились наутёк.­ Стоять! ­ скомандовал он. ­ Помогите ему!Быстро!Ему приходилось говорить громко, коротко ичётко, чтобы его понимали.

"В критических ситуациях отказывает логика,человек двигается по интуиции ивоспринимает только короткие и простыекоманды. Это правильно ­ у мозга задачавыжить стоит, а не решать двойнойинтеграл."Раздался звонок мобильника. Просвистелвыстрел. Пуля угодила в грудь правойженщине. Мобильник звонил у мужика, нопопала пуля в женщину. Всего однопятнышко, одна дырочка в теле. Крови небыло совсем. Номер сто пятьдесят шесть.Вторая женщина почему­то бросилась намужика, закрывая его собой, хотя он былтаким объёмным, что мог бы сам покрыть еётри раза.Он приставил ей пистолет ко лбу.­ Нет, пожа... ­ жаль, что она не договорила.Ей стало плохо, её испортила пуля, котораявошла ей в мозг. Тихий хлопок, она даже незакрыла рот, но глаза закатились добельмов. Номер сто пятьдесят семь.Она упала на мужика. Тот, видимо, потерялуже дар ощущений, отползая в сторону.Кровавый след тянулся за ним по земле, идаже дождь не смывал его.Легион подошёл к нему спокойно и снекоторым презрением."Отработанный материал системы. Тыбольше никому не нужен, система тебяпоюзала и отвалилась напрочь. Один противсистемы идти может, но это будет тяжело."Он перевернул мужика на спину и однимдвижением разрезал ему сонную артерию.После чего вторым быстрым движениемразрезал ему кожу на шее, и достал оттудатрубочку артерии. Такая упругая, но мягкая,с бьющей оттуда кровью. Номер стопятьдесят восемь.Он шёл дальше по аллее ещё метров сто, апотом перешёл на лёгкий бег.На ствол дерева сидел большой жук сдлинными чёрными усами, видимо, короед.Он обладал мощными челюстями идлинными цепкими лапами. Не стоитподдаваться на то, что он хочет вас укусить,и совать ему пальцы. У саранчи челюстибольше, но они не могут сравниваться посиле. Саранча грызёт траву, а короед ­ коруи дерево.Надо было возвращаться. Дорога была всёещё не близкая, близился экватор. Еслиотсюда выходить, то нужно идти жилымидомами через магазины.В одном из домов, самом богатом, эдаком

Креатиff99

vr­online | июнь 2010

Page 100: VR-Online (June 2010)

Кретиff100

vr­online | июнь 2010

двухэтажном коттедже, горел свет на второмэтаже. Дверь была не заперта."Наивные, непуганые. Хотя, чего им тутбояться."Первый этаж, затворяем дверь тихо. Справав комнате кто­то смотрит порнуху; её всегдаможно распознать по звукам. Тихая музыкаили наоборот жестокие гитарные рифы.Спиной к нему сидел парень лет двадцатипяти, но уже лысеющий, и дрочил нателевизор. Легион спокойно стоял и смотрелнам телевизор."Хорошая проверка готовности. Нельзядумать о чём­то другом."Парень сидел в кресле, его удобней всегодушить. Он не сможет встать или ударить.Если это было бы не кресло, а стул, тонужно было бы валить на землю. Он накинулему на шею удавку, упёрся коленом в спинкукресла, и натянул. Тот попеременнохватался то за горло, то за подлокотники, тоза стоящий член."В старину, когда вешали, у смертников частослучался стояк."

Page 101: VR-Online (June 2010)

I2PАнонимность в сетиСеть, за которой легко спрятаться

101

В последнее время ходит многоразговоров об анонимности в сети, побольшей части это связано сужесточением ведения политики противпиратства и защите авторских прав.Известные нынче торренты ифайлообменники, все чаще подвергаютсянападкам голливудских студий.Вспомнить тот же, The Pirate Bay -интернет просто нашпигован различнымиисториями о разбирательствах надкрупнейшим BitTorrent-трекером, читаякоторые невольно начинаешьзадумываться об анонимности и о том,какие изменения, в связи с такойобстановкой, нас ждут.

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

На выручку спешит открытое программноеобеспечение, а именно I2P, созданное дляорганизации анонимной, оверлейной,зашифрованной сети. Она построена наоснове самоорганизующейсяраспределенной сети Network database,которая является модифицированной DHT,

но отличается тем, что хранит в себехешированные адреса узлов сети,зашифрованные AES IP­адреса, а так жепубличные ключи шифрования, причемсоединения по Network database тожезашифровано. Ее особенность состоит втом, что трафик в сети, который шифруетсяот отправителя до получателя проходитчетыре уровня шифрования: сквозное,чесночное, туннельное и шифрованиетранспортного уровня, а в качестве адресовсети используются криптографическиеидентификаторы (главным образомсостоящие из пары публичных ключей).Каждое сетевое приложение на компьютерестроит для себя отдельные шифрованные,анонимные туннели. Туннели в основномодностороннего типа (исходящий трафикидет через одни туннели, а входящий черездругие) — направление, длину, а такжекакое приложение или служба создали этитуннели выяснить практически невозможно.Все передаваемые сетевые пакеты имеютсвойство расходится по нескольким разнымтуннелям, что делает бессмысленнымпопытки прослушать и проанализировать спомощью сниффера проходящий потокданных. Так же происходит периодическаясмена (примерно каждые 20 минут, нопользователь может самостоятельнонастроить этот период – прим. автора) ужесозданных туннелей на новые (с новымиподписями и ключами шифрования).В I2P сети нет никаких центральныхсерверов и нет привычных DNS­серверов,также сеть абсолютно не зависит от внешнихDNS, что приводит к невозможностиуничтожения, блокирования и фильтрациисети, которая будет существовать ифункционировать, пока на планетеостанутся хотя бы два компьютера в сети,поэтому анонимные сайты и различные веб­ресурсы – это уже реальность, а не запискифантаста.Исходя из этого, выходит, что можносоздавать скрытые сервера и сайтыработающие в этой сети в «домашнихусловиях», при этом небольшим бонусомслужит красивое имя, вида ­ name.i2p

vr­online | июнь 2010

Автор

:Jimm

yJone

zzEm

ail:jim

myjon

ezz@b

k.ruБезопасность

Page 102: VR-Online (June 2010)

(«name» – имя ресурса). Имея связку«Apache» + «PHP» + «MySQL», вполнереально поднять сервер. Второй элемент –настройка, без правильного подхода можно ине добраться до заветной цели, так иостановившись у начала, но об этом чутьниже.Я упоминал, что данная программакроссплатформенна? Если нет, то повторюсь– в виду того, что использовался язык Java,при программировании данной системы, мыполучаем возможность использовать ее наразличных платформах, начиная с ОСWindows и заканчивая Solaris, не говоря ужео Unix\Lunix, MacOS.В I2P сети используются (для разныхуровней и протоколов) следующие системыи методы шифрования и подписи:1.256 бит AES режим CBC с PKCS#5;2.2048 бит Схема Эль­Гамаля;3.1024 бит DSA;4.2048 бит Алгоритм Диффи — Хеллмана;5.Хеширование SHA256.История данного проекта начинается с 2003года для поддержки всех тех, кто участвует всоздании более свободного общества изаинтересован в новом нецензурируемом,анонимном и безопасном средстве общения.I2P — это попытка создать защищеннуюдецентрализованную анонимную сеть смалым временем отклика и свойствамиавтономности, отказоустойчивости имасштабируемости. Одной из важных задач,является способность функционировать всамых жестких условиях, даже поддавлением организаций обладающихзначительными финансовыми илиполитическами ресурсами. Как уже былосказано, все аспекты сети доступны в видеисходного кода и бесплатны. Этоодновременно и позволяет пользователямубедиться, что программное обеспечениеделает именно то, что заявлено, и облегчаетсторонним разработчикам возможностьсовершенствовать защиту сети, «заточив»ее под свои определенные нужды, а такжеоградиться от настойчивых попытокограничить свободное общение.Выпущенная в мае 2009 года стабильнаяверсия программы ­ 0.7.2, начала отсчет повнедрению этого релиза в массы. До мая2009 года авторы проекта всеми силамиудерживали пользователей от активнойрекламы I2P сети, указывая на возможнуюнестабильность и beta­статус разработки. В2009 году было выпущено девять

обновлений, а трафик сети увеличился в 5раз.Пришел момент, затронуть самое главное,ради чего все это затевалось – настройка ииспользование. Принцип работызаключается в следующем – на компьютерепользователя, после установления клиентаi2p и Java­платформы (второй критерийобязателен – прим. автора), запускаетсявиртуальный шлюз и программа начинаетработать в режиме прокси­сервера, котораяперенаправляет поток траффика в i2p сеть,тем самым, образуя некую «локальнуюпетлю» – не зашифрованный траффик идёттолько между локальным прокси иконкретным приложением. Затем онпоступает в шлюз, шлюз его шифрует, и помиру отправляет уже в защищённом виде.Придя на адрес назначения, сообщениедешифруется только на удалённом шлюзе,на котором в свою очередь тожеприсутствует «локальная петля», будь тосервер или собеседник. Для тех, ктопользуется платформой Windows, особыхкривляний с настройками не требуется,лишь достаточно открыть настройки проксив браузере и вбить следующий адрес:127.0.0.1:4444.В качестве подопытного возьмем другуюсистему — Ubuntu 10.4. Java есть поумолчанию, поэтому перейдем сразу кустановке программы и воспользуемсясамым удобным способом — загрузке иустановке через терминал (легче непридумаешь — при. автора):wget "http://mirror.i2p2.de/i2pinstall­0.8.exe" ­O./i2p_install.exeЗагружаем последнюю версию прямо срепозитория сайта, флаг ­О позволитзагрузить файл в домашнюю директорию изаписать файл под именем: i2p_install.exe.Не обращайте внимания на расширениефайла, Wine нам не понадобиться. Далее,пробуем установить программу на свою«тачку»:java ­jar ./i2p_install.exeПосле завершения установки, необходимоперейти в директорию с установленнойпрограммой и запустить сервер:/home/anton/i2p/i2prouter startХочу заметить, что путь долженсоответствовать вашему каталогу, куда выустановили программу. Теперь, чтобы начатьиспользовать i2p, настраиваем HTTP­проксив браузере: 127.0.0.1:4444. Это еще не все,если руки чешутся, а они бесспорно должнычесаться, то советую глянуть в панель

Безопасность102

vr­online | июнь 2010

Page 103: VR-Online (June 2010)

администратора I2P, просто перейдите поэтому адресу: http://127.0.0.1:7657/index.jsp.Панель управления полностью на русскомязыке, навигация очень простая, подробнаястатистика, дополнительные сервисы,которые я советую опробовать. Здесь же выможете настроить запуск шлюза в режимеслужбы, чтобы каждый раз не загружать еговручную, но то уже на ваше усмотрение.Осталось только проверитьработоспособность всего этого «хозяйство»на деле: http://i2p2.i2p – официальный сайтпроекта.

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

Дополнительные ссылки:

Безопасность103

vr­online | июнь 2010

Page 104: VR-Online (June 2010)

МанипулированиеВоздействие и манипуляцииПринципы воздействия и тонкости манипуляций

104

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

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

vr­online | июнь 2010

Автор

:Jimm

yJone

zzE­m

ail:jim

myjon

ezz@b

k.ru

К несчастью, очень часто мы испытываем сужение сознания: получив сообщение,мы сразу же, с абсолютной уверенностью принимаем для себя одно­единственное его толкование.И оно служит для нас руководством к действию.­ Сергей Кара­Мурза "Манипуляция сознанием"

Психо

Page 105: VR-Online (June 2010)

на программирование мнений илиустремлений масс, психического состояниянаселения и т.п. Конечная цель таких усилий— контроль над населением, егоуправляемость и послушность.Манипуляция может быть в виде духовногоили психологического воздействия. В данномслучае мишенью действий манипулятораявляются психические структурычеловеческой личности. Самым опаснымвоздействием, можно считать скрытоевоздействие, когда сам факт манипуляции незамечен объектом манипуляции. При этомуспех достигается гораздо быстрее, ведьесли манипулируемый верит, что всепроисходящее естественно и неизбежно, тои сам факт манипуляции не отражается впамяти субъекта. Вы не забили, о том, что вкаждом из нас есть маленький «божок»?Кстати он тоже не любит, когда имманипулируют, но «покомандовать» простообожает. Именно поэтому, при скрытойманипуляции, достигается лучший эффект иуспех в большинстве случаев гарантирован,но стоит помнить, что нужно особотщательно скрывать главную цель, так чтобыдаже разоблачение самого факта попыткиманипуляции не привело к выяснениюдальних намерений.Есть отдельные личности, которыепреуспели в манипуляциях над другими,благодаря тому, что манипуляция сталаобщественной технологией, но и требуетзначительного мастерства и знаний.Манипуляция имеет две формы:положительную (невербальное заигрывание,общие интересы, комплименты,успокаивание и т.д.), отрицательную(высмеивание, деструктивные советы инаставления, упоминание о прошлыхошибках и негативных фактах). Все этопоказывает, насколько разнообразенарсенал манипулятора, если не знать какпротиводействовать этому, можно легкооказаться легкой добычей.Противостоять очень легко, достаточно лишь«проснуться», в смысле, нужно четкопроводить анализ поступающейинформации, а также уметь организовать ее,по мере поступления ионной из разныхисточников, но и это еще не все. Чтобыманипуляцию свести к минимуму илиполностью ее пресечь, необходимо знатьнесколько способов ответа на манипуляцию.Самое простое, это игнорированиеоппонента. Ответ уловкой на уловку. Болеещадящий способ — изменение темыразговора или ее перефразирование, но вотрицательную форму, дабы вызвать уманипулятора отрицательные эмоции или

дать «внешнее» согласие, показав, что высогласились с манипулятором, но на самомделе пропустили все «мимо ушей». Средиобщих методических приемов реакции наманипуляцию, снижающих эффективностьприменяемых по отношению к вам уловок можноотметить:* выспрашивание;* осведомление;* повторение;Это приведет к снижениею количества уловок,которые может применить манипулятор.Конечно, можно попытаться изменить игру,показав, что в интересах обеих сторонотказаться от манипулятивного поведения инаправить совместные усилия на поиск решенияпроблем.Гораздо опасней, если в ходе манипуляцииприменяются технические средства. Ни длякого ни секрет, что на данный момент такиесредства существуют и этот фактнастораживает. Человек хрупкое существо,особенно его нервная система, а еслиучесть, что происходит вокруг, вся этанапряженная обстановка, то представьте,что каждый индивидуум это «ходячая»мишень — стреляй в любую ­ попадешь вцель. Поэтому уделим внимание способамвоздействия:1.Светом и цветом.2.Звуком (Не так давно, данный способвоздействия использовался для разгонадемонстрантов на Красной Площади, путемподачи звука определенной тональности ивибрации ­ прим. автора).3.На рецепторы кожи:а) Теплом.б) Электромагнитным излучением.Как видим, способы манипуляции перешлина новый уровень, и пока мы будемвзращивать своего внутреннего «божка»,манипуляции будут приобретать новыевиды, будут разрабатываться способывлияния на человека, будут производитьсяразличные технические средства,позволяющие на 100% контролироватьобщество и подчинить его себе. Будьтеосторожны и всегда анализируйтепоступающую к вам информацию. Даприбудет, с вами VR.

Психо105

vr­online | июнь 2010

Page 106: VR-Online (June 2010)

Скачать файл изИнтернета средствами C#

106

Сегодня разгребал почту и получил письмо свопросом жизни и смерти (автор так и написал :­)) от одного из наших посетителей. Вопрос былтаким: «Spider_NET, подскажи, как можно быстрои непринужденно скачать файл из инетасредствами C#».В C# это сделать проще простого, и я решил неоткладывать, а сразу помочь человеку. ОткрылVisual Studio и за пять секунд набросалпростенький примерчик. Отправил и подумал: «Аведь наверняка, кто­то может столкнуться саналогичным вопросом?». И решил я сразупомочь всем в виде этой небольшой заметки.Надеюсь, что она кому­нибудь пригодится.Я уже сказал, что пример крайне прост внаписании и требует для реализации чертовскимало времени. Итак, первое, что я сделал –набросал дизайн приложения:

На форме у меня всего лишь одна строка вводаи кнопка «скачать». Собственно по нажатиюкнопки и будет происходить загрузка.Делай форму и переходи в редактор кода. Сразуже подключи два неймспейса:

using System.Net;using System.IO;Первый позволит нам работать с сетью, а второйс файлами. Сделав это, создавай обработчиксобытия Click() для единственной кнопки инапиши в нем следующий код:WebClient myWebClient = new WebClient();string downloadFileName =System.IO.Path.GetFileName(textBox1.Text);myWebClient.DownloadFile(textBox1.Text, @"D:\" +downloadFileName);

В первой строчке кода я создаю экземпляробъекта WebClient(). С его помощью мы и будем

выполнять загрузку файла из сети. Во второй, яобъявляю переменную downloadFileName иприсваиваю ей в качестве значения имязагружаемого файла.Имя файла я получаю при помощи методаGetFileName класса Path. На этом подготовказавершена и можно выполнять саму загрузкуфайла. Делается она при помощи методаDownloadFile класса WebClient. Методутребуется передать два параметра:

1. Адрес загружаемого файла2. Путь, по которому файл будет сохранен.

В первом параметре я указываю текст, которыйбыл введен в textBox1, а во втором жесткопрописываю D:\ + имя загружаемого файла. Темсамым, все файлы будут сохранятся в кореньдиска D:.

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

Пользуйся на здоровье!

vr­online | июнь 2010

Автор

:Игор

ьАнто

новaka

Spide

r_NET

E­mail:

antono

v.igor.k

hv@gm

ail.com

Historically, languages designed for other people to use have been bad: Cobol, PL/I, Pascal, Ada, C++.The good languages have been those that were designed for their own creators: C, Perl, Smalltalk, Lisp.— Paul Graham

Школа

Page 107: VR-Online (June 2010)

UnixИменованные каналы и сокетыПросто о сложном

107

Одной из самых полезных возможностейunix­like систем заключается в возможностииспользовать пайпы (pipes) или в переводе:каналы. Если ты уже сталкивался с такимпонятием, то у тебя могло сложитьсявпечатление, что это трудно для понимания.Да ничего подобного. Всё проще некуда.Очень странно, что в интернете нет ни однойпростой и понятной статьи для начинающих.Читай и впитывай информацию! Расскажудоступнее некуда :)Если тебе необходимо, чтобы информация изодного процесса передавалась в другой,достаточно передать выводимые данные одногопроцесса на вход другого. Чтобы обеспечитьэффект присутствия в файловой системе, изкоторой один процесс может осуществить связь сдругим, как раз и предназначены именованныеканалы и сокеты. Именованные каналы обычноиспользуются для осуществления связи междупроцессами, в то время как сокеты – дляобеспечения связи в сети.Возьмём простой пример использования канала:ls | grep xКогда bash работает с командной строкой, топервым делом обращает внимание навертикальную черту, разделяющую две команды.Bash и другие шеллы выполнят обе эти команды,при этом передав результат выполнения первойкоманды как входные данные для второй.Команда ls выведет список всех файлов втекущей директории. А команда grep в своюочередь отобразит лишь те строки, которыесодержат букву “x”.

Рис.1. Пример выполнения ls | grep xТакое использование каналов многим известно.Кстати, такие каналы называются безымянными.Канал существует только внутри ядра инедоступен процессу, который его создал, т.е.

bash’у.Так же существуют именованные каналы,которые так же иногда называют FIFO, чтоозначает “First In, First Out”. Тебе, какпрограммисту, это должно быть понятно: первымвошёл, первым вышел. Этот принцип относитсяабсолютно ко всем байтам данным,попадающим в именованный канал. Каналыхранятся как файлы в файловой системе. Такимобразом, “имя” такого канала – имя файла. И этовполне логично, т.к. всем известно, что в ОС Unixлюбой элемент может быть отображен в видефайла, включая устройства и нашиименованные каналы.Таким образом, посмотреть список каналовможно командой ls. Ранее для созданияименованных каналов использовалась утилитаmknod. Сейчас же стандартом является mkfifo.Синтаксис использования достаточно прост.Нужно лишь передать программе имя, котороебудет носить именованный канал. См. рисунок 2.

Рис. 2. Пример создания именованного канала pipeБуква “p”, что подчеркнута на рис.2 красным, какраз и означает, что тип этого файла –именованный канал.Теперь пришло время посмотреть, как жеработает запись и извлечение данных. Т.к. каналуже создан, то обменяемся между двумяконсолями списком файлов и поддиректорийтекущей директории.

Рис. 3. Работа с именованным каналом на практикеЭто – самый простой пример работыименованного канала. Откроем первую консоль

vr­online | июнь 2010

Автор

:Ром

анКос

тенко

akaLor

d_of_fe

arkos

tenko.

r.khv@

gmail.

comАдмининг

Page 108: VR-Online (June 2010)

и напишем в ней:ls ­l > pipeТеперь открываем вторую консоль и переходим вэту же директорию. Выполняем:cat < pipeВуаля! И мы видим список файлов иподдиректорий нашей папки. (см. рис. 3)Интересной особенностью является то, чтопорядок выполнения команд не имеет значения.Т.е. можно сначала выполнить чтение из канала,а только потом подать команду записи в него.Результат будет один. После приёма первойкоманды будет выполняться “ожидание” второйкоманды.Такой способ очень прост и эффективен длявзаимодействия двух разных процессов.Допустим, что у нас существует сервер, которыйожидает приёма данных (например, данные дляпечати), открыв канал для чтения. Клиенту лишьнужно будет подать команду на запись данных впайп. Печать начнётся сразу же по окончаниюзаписи данных клиентом. Очень удобно.Изучаем сокеты

Сокет Unix является ещё одним способомобмена данными между процессами. Процессыпри таком обмене могут исполняться как наодном компьютере, так и на различных ЭВМ,объединённых в сеть. Как и почти всё остальноев Unix, сокет – это файл. Интерфейс сокетоввпервые появился в BSD Unix. Программныйинтерфейс сокетов описан в стандарте POSIX.1и в той или иной мере поддерживается всемисовременными операционными системами.Существует 2 основных типа сокетов: Unixdomain sockets (AF_UNIX) и Unix network sockets(AF_INET). Разница заключается в том, что Unixdomain socket (Доменный сокет Unix) неиспользует для работы сетевой протокол. Ониспользуется в операционных системах длямежпроцессного взаимодействия. Корректнымтермином стандарта POSIX является POSIXLocal IPC Sockets. UDS используют файловуюсистему как адресное пространство имен, чтопозволяет двум различным процессам открыватьодин и тот же сокет для взаимодействия междусобой.Unix network sockets используют интернетпротоколы, которые позволяют обмениватьсяданными между несколькими Unix системами:протокол IP для соединения и протоколыTCP/UDP для транспорта.Принцип функционирования сокетовзаключается в том, что каждый процесс можетсоздать слушающий сокет (серверный сокет) ипривязать его к какому­нибудь портуоперационной системы (следует учитывать, что в

UNIX непривилегированные процессы не могутиспользовать порты меньше 1024). Слушающийпроцесс обычно находится в цикле ожидания, тоесть просыпается при появлении новогосоединения. При этом сохраняется возможностьпросто проверить наличие соединений наданный момент, установить тайм­аут дляоперации и так далее.Наверное, самым простым примером сокетаявляется /dev/log демона syslogd, которыйотвечает за ведение логов.

Рис. 5. Информация о сокете /dev/log.Программную реализацию работы с сокетами ярассматривать не буду, т.к. эта статья – всеголишь базовая теория. В плане кодинга есть кучапримеров в инете. Надо лишь погуглить. :)

Админинг108

vr­online | июнь 2010

Page 109: VR-Online (June 2010)

Поднимаем VPSАвтоматизация обслуживанияАвтоматизируем рутинную работу по созданию бэкапов

109

Нет смысла тратить время на действия,которые реально автоматизировать.Создание бэкопов как раз такая операция.Нудная, надоедливая. Одним словом —рутина. Вот такие операции и надо впервую очередь автоматизировать.

Собственно решил написать небольшойскриптик на sh. Перед написанием скриптаследует чётко определиться какие файлыдля нас являются важными. В моём примерея сделал уклон на файлы сайта, базу данныхи системные логи. Бэкап базы данных явыполняю посредством утилиты mysqldump;архивирую файлы сайта и логи системыпосредством утилиты tar, всё гениальнопросто и надёжно.Привожу сам скрипт, с подробнымикомментариями.

Осталось добавить скрипт на cron, делаемследующее:

Вводим в файл:

Как только файл будет сохранён, заданиесразу же добавиться в очередь заданий cronBackup compleate

Для автоматизации много времени не надо.vr­online | июнь 2010

Автор

:Gh[]s

tАдмининг

#!/bin/shbackdir=/usr/home/sysop/backs #задаём папку в которойбудут бакупыbacktmp=$backdir/tmp #промежуточная папкаuser=sysop #задаём пользователя от которого будемзабирать бакупыmysqluser=root #админ мускулаmysqlpasswd=пароль #пароль мускулаmysqlport=3306 #порт мускулаmysqlhost=localhost #хост мускулаDB=nullday #имя базы даныхmysqldump ­u $mysqluser ­P $mysqlport ­h $mysqlhost­p$mysqlpasswd $DB > $backtmp/sql #делаем дамп базыданых

#здесь копируем все важные для нас файлы и конфигиcp /usr/local/etc/apache22/httpd.conf $backtmp/httpd.confcp /usr/local/etc/squid/squid.conf $backtmp/squid.confcp /usr/local/etc/squid/passwd $backtmp/passwdcp /var/sq/* $backtmp/cp /etc/passwd $backtmp/passwdcp /etc/master.passwd $backtmp/master.passwd

#копируем файлы сайтаcd /usr/local/www/apache22/data

tar ­cjf site.tar.bz2 administrator/ cache/ components/ images/includes/ language/ libraries/ logs/ media/ modules/ music/plugins/ rokdownloads/ templates/ tmp/ xmlrpc/CHANGELOG.php configuration.php index.php index2.php#архивируем файлы сайта (можно всю папку с сайтом, ноу меня там левые файлы:)

mv /usr/local/www/apache22/data/site.tar.bz2$backtmp/site.tar.bz2 #перемещаем файл архива сайта

#архивируем логиcd /vartar ­cjf varlog.tar.bz2 log/auth.log log/httpd­error.loglog/mysql.log log/ppp.log log/slip.logmv varlog.tar.bz2 $backtmp/varlog.tar.bz2

#задаём имя для бэкапа, в моём случае это день­годname=backup_`date +%d­%y`.tar.bz2

#архивируем всю папкуcd $backdirtar ­cjf $name tmp/

#и очищаем временную директориюcd $backtmprm *cd $backdir

#меняем владельца файла на юзера который его заберёт(файл то создаёться рутом)chown $user $name

#ставим праваchmod 700 $name

ee /etc/crontab

15 1 * * * root sh /bin/backup.sh

Page 110: VR-Online (June 2010)

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

Админинг110

vr­online | июнь 2010

Page 111: VR-Online (June 2010)

JimmyJonezz: По­поводу этойновости мне нечего сказать,т.к. со стороны это выглядитвсего лишь забавно и непредставляет никакогоинтереса. Много былоразговоров, что Медведевведет свой видеоблог, в ЖЖзарегистрирован и теперьtwitter. Может сложитсявпечатление, что нашпрезидент действительно"продвинутый" в этомнаправлении, но как­то всеэто тускло выглядит на фоневнутренней обстановки(технической, транспортной ифинансово­экономической) вРоссии.

zahod5277: ЖЖ, iPad, теперьтвиттер. Нет, я лично ничегопротив не имею, все имеютправо на свободное время,хобби и так далее, но чтодумают другие? Если хотя бытреть населения странызнало бы о IT­увлеченияхпрезидента, думаю,отношение к немусущественно бы ухудшилось.Более старшее поколение(люди от 35 лет) навернякадумают типа "вот нифигагосударством не занимается,только в своих интернетахсидит, фоточки в блог опоездке в Штаты заливает".Но с другой стороны,комменты в ЖЖ и в твиттерепо любому читаются, и еслине самим президентом, тоспец. службой. Был жеслучай, когда в ЖЖ кто­то начто­то нажаловался и потом,по прочтению этой службойсего коммента, этоустранили. Если бы всепроблемы так решались... Но

аккаунт в твиттере даже ясчитаю ребячеством. Нусерьезно, для кого фотки свидом из окна гостиницы ипосты типа "сегодня обедал сБараком Обамой вМакДональдсегамбургерами"?

Spider_NET: Твиттер стал поистине мировой социальнойсетью нового формата.Вроде появился не такдавно, а уже сталнеслыханно популярным.Причем не только средиобычных пользователей, но изнаменитостей. Известныеактеры, музыканты, а такжепредставители властиобзавелись аккаунтами в"чирикалке". В нашей страневсе происходит с"тормозком", но совсемнедавно и наш президентзавел персональный твит­акк. Когда я впервые об этомуслышал, я подумал, чтоскорей всего постить твитыпрезидент будет не лично, нопочитав его ленту убедился вобратном. Может я конечно иошибаюсь, но буду верить вхорошее :­) Мне всегданравилось, что Д.А.Медведев очень активныйпользовательинформационныхтехнологий. Его появлению втвиттере я искренне рад.Считаю, что публичностьдействий/решенийпрезидента сможет улучшитькачество обратной связи снародом. Любой желающийможет зафоловитьпрезидента и читать новостииз первых уст. На мой взглядэто здорово и было быхорошо если бы все

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

Lord_of_fear: Скажу честно:по началу мне было долампочки. Затем через парудней промелькнула мысль“”хм… а правильно Медведевсделал. Обама, например,давно уже во всю твиттерит,а фоловят его миллионытвиттерян. Чем нашпрезидент хуже? Да иинтересно иногда почитатьчем же он там занимается”:)Рад, что глава нашегогосударства не стремаетсяюзать последние достиженияв ИТ сфере. И пусть, скореевсего, не сам лично онтвиттерит, но всё равно яподдерживаю такоеначинание. А вот сам язабросил писать в твиттер.Надоело. Хотя юзал еговсего 4­5 месяцев. Надеюсь,наш президент продержитсядольше. :)

Kastor: Мне нравитсядеятельность ДмитрияМедведева. Такоеощущение, что он пытаетсявлить новую волну в жизньстраны и сделать ее лучше.Он даже выглядит всегдабодрым ицелеустремленным. Еще мненравится его симпатия кновым технологиям. Это жездорово! Так почему бы и не

Мнение VR"Д.А. Медведев в twitter'e"Размышления на тему...

111

vr­online | июнь 2010

Мнение VR

Page 112: VR-Online (June 2010)

Мнение VR112

vr­online | июнь 2010

пользоваться ими в 21­омвеке. Многие могут начатьшутить, мол, президентувремя некуда девать больше.А вы других президентов иполитиков часто видите?Наверное, только передочередными выборами, когданадо больше мелькать передглазами, или при различныхскандалах. Может такМедведев пытается бытьближе к народу. В блоге ведьне ерунда написана, а егодеятельность.

WWWNET: Медведев оченьактивен в сети. Теперь у негопоявился и twitter­аккаунт. Есличестно, то я его не зафоловил.Я далек от политики и впоследнее время малопользуюсь твиттером. Но самото, как ведет себя президентпоказывает, что он продвинутыйпользователь и возможно с нимРоссия займет достойное местов IT­индустрии.

Page 113: VR-Online (June 2010)

FAQ по FreeBSDВопрос & ОтветВы спрашивали, мы отвечаем...

113

Вопрос: Установил FreeBSD 7.2 на сервер,вхожу под ssh (через putty), пускает всехпользователей кроме root. В чём дело и какразрешить рут?Ответ: Дело в том что FreeBSD заботитьсяоб безопасности, и возможность бродить подroot’ом из сети по умолчанию отключена. Втерминале можно юзать команду su (man suв помощь), а вот для доступа к файламчерез sshd действительно бываетнеобходимым root. Для этого открываемфайл /etc/ssh/sshd_config (ee/etc/ssh/sshd_config) находим строкуPermitRootLogin по дефолту там будетPermitRootLogin no исправляем наPermitRootLogin yes. Делаем ребут и готово!

Вопрос: Мой хостер предоставляет sshдоступ, но не предоставляет доступ кфайлам бакупа MySQL базы данных, есть лиу меня возможность самостоятельновыполнить бэкап?Ответ: Да. В пакете MySQL есть такаяутилита как mysqldump именно она позволитлегко и безболезненно сделать бэкап базыданных. Синтаксис команды таков

где: LOGIN имя пользователя, PORT порт накотором висит мускул, PASS парольпользователя, DBNAME имя базы данных,dump.sql файл куда произойдёт бэкап.Для восстановления базы данных из таковабэкапа можно воспользоваться следующейкомандой:

где: LOGIN имя пользователя, PORT порт накотором висит мускул, PASS парольпользователя, DBNAME имя базы данных,dump.sql файл откуда будет произведеновосстановление базы данныхПодробнее смотрите mysqldump –help

Вопрос: На моей машине по умолчаниюстоит редактор vi, возможно он и хорошийредактор, но я не умею им пользоваться, апри создании тех же crontables открываетсястандартный редактор. Как сменитьредактор?Ответ: В зависимости от shella который выиспользуете, для csh и его модификацийвыполните следующую команду:

Найдите строку setenv EDITOR vi изаменяете её на setenv EDITOR ee (либодругой редактор)В случае если вы используете shвыполняем:

Находим и заменяем xport EDITOR=vi наxport EDITOR=ee.

Вопрос: Недавно глянул на в wmware клиент,и был повергнут в шок, какая­то личностьбрутила мой пароль на ssh. Есть ли способзащититься от таких напастей?Ответ: Да, есть такая утилита именуемаяsshit, её задачей являеться именно защитаот недоброжелательных пользователей. Впортах она находиться здесь/usr/ports/security/sshit. Устанавливаем.Небольшая инструкция:Редактируем файл /etc/syslog.confПод auth.info;authpriv.info/var/log/auth.logДобавляем auth.info;authpriv.info|exec /usr/local/sbin/sshitПерезапускаем демон, /etc/rc.d/syslogdrestartВ конфиге самого sshit’a в строкеFIREWALL_TYPE = ipfw2 необходимоуказать фаер который вы используете.Далее, необходимо добавить правило длятаблицы в файрволл.

vr­online | июнь 2010

Автор

:Gh[]s

t(Ha

ck­Lab

bsTea

m)Em

ail:gh0

st_nul

l­day@

3a.by

FAQ

$ mysqldump –u LOGIN –P PORT –h HOST –p PASSDBNAME > dump.sql

$ mysql –u LOGIN –P PORT –h HOST –p PASS DBNAME <dump.sql

ee ~/.cshrc

ee ~/.profile

Page 114: VR-Online (June 2010)

FAQ114

vr­online | июнь 2010

Вопрос: С приятелем подняли серверок, подуправлением FreeBSD. Приятель наредкость вандал, боюсь, что он может что­нибудь поломать. Есть возможностьзащитить файлы от вандала? (у него естьпароль рута)Ответ: Есть, есть стандартная утилита вкаталоге /bin имя ей chflags. Сие чудопоможет сделать файлы неизменяемыми, неудаляемыми (даже от рута!). Даная командасделает файл неизменяемым chflags schg/home/pit/porno.avi. За более подробнымруководством рекомендую обратиться к manchflags

Ответа на твой вопроса здесь нет? Нестесняйся! Пиши мне на мыло и вследующем номере прочтешь свой ответ.Вопросы шли на [email protected]

FAQ

Page 115: VR-Online (June 2010)