VR-Online (April 2010)

231

description

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

Transcript of VR-Online (April 2010)

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

Михаил Фленов aka Horrific (http://flenov.info)

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

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

Lord_of_Fear

Андрей Васючков aka Soffrick

Антон Козлов aka JimmyJonezz

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

zahod5277

Soffrick, JimmyJonezz, Neon_Kaligula, Spider_NET,

Lord_of_fear, Soffrick, Kastor, zaho5277

Приветствую Вас, дорогие друзья! Сегодня у нас не совсем обычный номер. Мало того, что его объем зашкаливает за две сотни (!) страниц, так он еще является и юбилейным. Сколько нам лет? Год, два? Нет, не угадал, нам уже все 10. Наш проект стал по-настоящему взрослым. Или как еще говорят - проверенным временем. И вот с этой знаменательной датой я хочу поздравить вас в первую очередь! С нашим общим праздником, друзья! В дни рождения проектов принято подводить какие-то итоги, но я делать этого не буду. За эти десять лет были как хорошие моменты, так и совсем грустные. Пусть все идет своим чередом. Надеюсь, VR будет существовать еще очень долго, и когда-нибудь на наш сайт будут заходить тысячи посетителей. Разглагольствовать больше не буду, а лучше пожелаю тебе приятного чтения и скажу большое "Спасибо" всем нашим авторам. Если не они, то журнала не было бы. Спасибо Вам за энтузиазм и желание развивать проект. И самое главное, отдельное спасибо Тебе, дорогой читатель! Еще раз приятного чтения! С днем рождения!

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

Page 3: VR-Online (April 2010)

НОВОСТИ VrIP Персона

Программисты за бугром. М. Фленов Кодинг

Delphi. Точки восстановления C#. Как отправить E-mail из Flash Delphi. Когда выгодно использовать record вместо class CSS. Наложение изображений Delphi. Делаем стеклянный эффект Хакерский кодинг на 1С:Предприятие 8.x 15 регулярных выражений для WEB-разработчиков Delphi. Tips and Tricks #1 Delphi. KOL'ьная диета для дельфийца. Часть 3 Delphi. Google API в Delphi. Аутентификация пользователя

Без рамки Чужое или свое? 10 поисковых трюков Google Обзор мобильных ОС. Что выбрать, на чем кодить? Знакомьтесь, штриховой код Фриланс вне закона

Меня тошнит Безопасность

Утечки за 2009 год: виды, каналы распространения, защита Вардрайвинг по-взрослому

Я прусь Админинг

FireBird. Знакомство с огненной птицей Как определить свой IP. Фундаментальное руководство

Графика Photoshop: Быстрая коррекция фотографий Photoshop: Управление рабочим пространством Inkscape: Создаем обои для рабочего стола. Часть 1

Обзоры от VR Рецензия книги Drupal Рецензия книги Библия C# Рецензия книги Большая книга CSS Умный будильник

Креатив Не забивайте гвозди плоскогубцами! Песнь легиона. Часть 1

Психо Взаимоотношение полов. Полная версия Как работать с "тупыми" людьми

Мнение VR Школа

Как посчитать количество файлов в unix-like OS Охлаждаем по-гиковски! Учимся рисовать. Эффект абстрактной волны Учимся рисовать. Лого Volkswagen Учимся рисовать. Полярное сияние Учимся рисовать. Планета в каркасной модели

Page 4: VR-Online (April 2010)
Page 5: VR-Online (April 2010)

Игорь Антонов aka Spider_NET [email protected]

IT Новости А ты хранишь пароль в браузере?

Почти четверть пользователей (23%) сохраняют пароли от сервисов в браузерах, сообщает The Register. Около 60% пользователей ленятся регулярно менять пароли. Такие тревожные результаты продемонстрировал опрос компании Symantec, в котором приняли участие 400 человек. Специалисты отмечают, что пользователи, помимо всего прочего, крайне легкомысленно относятся к самому выбору паролей. Например, 12 пользователей признались, что использовали в качестве пароля слово «password». Каждый десятый пользователь использует для пароля кличку своего домашнего животного - которую легко узнать, даже не зная человека, а просто

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

Паспорт через Интернет

Как известно, сейчас в России развернута широкая компания по "интернетизации" госуслуг, в рамках которой создан и одноименный сайт по адресу gosuslugi.ru. Начиная с 1 апреля сего года как минимум, на территории Москвы можно оформить заявку на загранпаспорт прямо через указанный сайт. Но, как известно, Россия - страна загадочная и непредсказуемая. Внимательно читаем о том, какой "квест" придется пройти желающему сэкономить свое время и оформить загранпаспорт через Интернет. Ему предстоит пройти следующие этапы: 1. Для регистрации необходимо на сайте ввести номер своего свидетельства о пенсионном страховании.

2. Логин и пароль новому пользователю будут высланы заказным письмом по городской почте (это в век Интернета, кроме того, как "работает" "Почта России" все наслышаны). 3. Идем в ФМС и фотографируемся. 4. Через интернет (сайт) направляем в УФМС фотографию и анкету. 5. Опять идем в УФМС и показываем квитанцию об уплате государственной пошлины. 6. После готовности загранпаспорта - приходим в УФМС и получаем загранпаспорт. Хотелось бы поблагодарить чиновников УФМС за "упрощение" процедуры получения загранпаспорта.

Page 6: VR-Online (April 2010)

SMS на Email Абоненты МТС теперь могут отправлять текстовые сообщения на адрес электронной

почты посредством SMS с любого мобильного телефона. Новую услугу не нужно включать, и она является бесплатной. Оплачивается только отправка SMS-сообщений. Российский сотовый оператор МТС объявил о запуске услуги «SMS на e-mail», позволяющей отправлять сообщения коллегам, друзьям и знакомым на электронную почту, когда под рукой нет компьютера с выходом в интернет, или просто удобнее воспользоваться мобильным телефоном. Для того чтобы отправить текст на адрес электронной почты, нужно набрать на телефоне SMS-сообщение формата: 'e-mail адресата «тема» текст сообщения' и направить на короткий номер 9883. На e-mail-адрес получателя поступит письмо с заданными темой и

текстом. В поле «От» будет указано 7хххххххххх@sms.mymts.ru, где 7хххххххххх – номер сотового телефона отправителя. Новая услуга не требует дополнительного подключения и уже доступна на всех тарифных планах МТС. Отправка сообщений на адрес электронной почты при нахождении в домашнем регионе составляет 2 руб. Во внутрисетевом, национальном и международном роуминге к стоимости сообщения прибавляется роуминговый тариф. Погоняем в кваку по-новому

В рамках проекта GWTQuake несколько разработчиков компании Google портировали игру Quake II на Javascript и технологии HTML5, такие как WebGL и элемент Canvas для рендеринга графики, WebSocket для работы в сети, Storage API для локального хранения данных, тэг "audio" для вывода звука. Игра была представлена вчера под видом шутки, но суть розыгрыша была в том, что проект оказался реальным.

В качестве основы для GWTQuake был использован код проекта Jake2, в рамках которого ранее был создана реализация игры Quake II полностью переписанная на языке Java и запускалась на ОС Android. Для преобразования Java-кода в веб-приложение, разработчики использовали инструментарий Google Web Toolkit (GWT), предназначенный для разработки динамических веб-приложений на языке Java, которые затем при помощи специального транслятора преобразуются в представление на базе JavaScript и HTML (GWT использован при разработке таких сервисов, как Google Maps и Gmail). В настоящий момент запустить игру можно только в тестовых версиях веб-браузера Chromium, запущенного с опцией "--no-sandbox" (модель безопасности Chromium ощутимо замедляет вывод графики) и одной из последних ночных сборок Webkit. Что касается поддержки Firefox, то разработчики сообщают, что принципиальных проблем нет, в тестовых версиях Firefox поддерживается Canvas 3D и WebGL, но производительность JavaScript-движка Firefox в настоящее время не может обеспечить приемлемую для игры частоту кадров (в WebKit на MacBook и MacBook Pro удалось достичь 20-25 и 40-45 FPS). iPad начал свое шествие

Page 7: VR-Online (April 2010)

В США 3 апреля начались продажи планшета iPad корпорации Apple. Устройство продается в магазинах компании, а также в большинстве магазинов электроники Best Buy. В продажу пока поступили только планшеты из младшей линейки iPad, лишенные возможности выхода в сети 3G и не имеющие модуля GPS. Тем не менее, за несколько часов до начала продаж в магазинах Apple и Best Buy собрались очереди из десятков и

сотен человек. Первые люди в очереди перед флагманским нью-йоркским магазином Apple появились во вторник. Прием предварительных заказов на iPad начался в США 12 марта. По оценкам аналитиков, потребители уже заказали несколько сотен тысяч устройств, хотя никто из них еще даже не держал их в руках. Стоимость iPad составляет 499 долларов за 16-гигабайтную модель, 599 долларов за 32-гигабайтную и 699 - за 64-гигабайтную. Незадолго до начала продаж в магазине App Store

появилось свыше 2300 приложений для iPad. Их стоимость в среднем выше, чем у приложений для iPod touch и iPhone. Впрочем, последние также работают на iPad - их в магазине уже свыше 150 тысяч. Blu-ray станут еще вместительней

Отраслевая организация Blu-ray Disc Association 3 апреля анонсировала две новых спецификации дисков Blu-ray, BDXL и IH-BD. Окончательные версии соответствующих документов будут доступны через несколько месяцев. Первая спецификация позволяет выпускать диски емкостью 100 и 128 гигабайт для однократной записи и перезаписываемые диски емкостью 100 гигабайт. Такая емкость достигается расположением на диске трех-четырех слоев. BDXL должен найти применение на корпоративном рынке, однако представители ассоциации обещают и

потребительскую версию. Второй формат предполагает создание двухслойного диска, причем один слой является перезаписываемым, а другой нет. Это позволяет защитить важную информацию на диске и одновременно хранить на нем пользовательские данные. Оба формата предназначены для особых сегментов рынка. Для воспроизведения записи дисков BDXL и IH-BD понадобятся новые приводы. В ассоциации уточняют, что новые спецификации - всего лишь расширение существующих. Благодаря этому приводы следующего поколения не потеряют совместимости с обычными дисками Blu-ray емкостью 25 и 50 гигабайт. Intel научилась читать мысли "Чтение мыслей" перестало быть исключительно темой научной фантастики или "спиритических" сеансов. Специалисты американской корпорации Intel Corporation разработали компьютерную программу, которая может довольно точно определить, о чем в данный момент думает человек. С помощью магнитно-резонансной томографии (МРТ) программа выявляет, какой именно участок головного мозга задействован в настоящий момент, и выдает варианты, о чем может думать человек. Экспериментальные данные

Page 8: VR-Online (April 2010)

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

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

Разработчики из компании Apple поделились информацией о проекте WebKit2, в ходе которого планируется существенно модернизировать популярный браузерный движок WebKit. Среди главных целей, которые ставит проект WebKit2, стоит выделить новую «модель расщепления процессов» и так называемый «неблокирующий» программный интерфейс API. Впервые модель расщепляемых процессов была представлена в браузере Gooogle Chrome в конце 2008 года. В рамках этой модели каждое отдельное представление (в

данном случае – вкладка браузера) работает в собственном процессе. Главное преимущество такого подхода заключается в повышенной устойчивости браузера к различным ошибкам и сбоям. Например, если недоработанный подключаемый модуль или ошибка в механизме рендеринге приведут к аварийной ситуации, закроется только одна вкладка, а остальные продолжат работу. Подобные механизмы уже реализованы в браузере IE8, для браузера Firefox существует проект Electrolysis, а вот в браузере Apple Safari расщепление процессов реализовано лишь частично. Другая цель проекта WebKit2 – реализация нового интерфейса API для доступа к механизму рендеринга без блокирования остальных процессов основного приложения. Это означает, что разработчики смогут обращаться к методам API с использованием самых разных способов получения отклика (callback) от окон с WebKit-представлениями. Пока рендеринг веб-страницы не закончен, приложение может выполнять другие действия в ответ на команды пользователя. Действия приложения для загруженной и отображенной веб-страницы запустятся только тогда, когда ядро WebKit2 сообщит этому приложению о наступлении нужного события. Теоретически, новый подход должен привести к созданию приложений, быстрее реагирующих на действия пользователя – ускорение реакции обеспечивается за счет более продуманной системы откликов ядра WebKit на команды извне, приложение продолжает работу, ожидая обратного вызова от представления WebKit через шину событий. Сейчас уже реализовано три типа обратных вызовов WebKit – клиентские обратные вызовы в форме оповещений, клиентские обратные вызовы в форме политик и работа с вызовами через единую политику приложения. Ведется работа и над

Page 9: VR-Online (April 2010)

четвертой формой обратных вызовов – «инъекция кода», – которая позволит напрямую обращаться к объектной модели документа DOM. Сериал про нас

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

полный круг обращения информации, технологии передачи данных и сами данные». Жанр картины находится в процессе обсуждения, заявил источник в Минкомсвязи. Вероятнее всего, по его словам, это будет детектив, наименее вероятно, что ситком (ситуативная комедия). По замыслу разработчиков проекта, герои сериала должны жить и работать в технопарке, где «с помощью суперсовременных технологий проводить сбор информации о противозаконной деятельности тех или иных лиц и компаний». Задача героев – собрать необходимую доказательную базу для разоблачения отрицательных персонажей. «Необходимо показать группу креативных молодых профессионалов, которые познакомятся в первой серии и превратятся на протяжении сериала в крепкую команду, - говорится в тексте проекта. - В каждой серии герои решают важные для страны задачи, связанные с их профессиональной деятельностью». В создании сценария будущего сериала предполагается постоянное участие специалиста-консультанта: «Он должен подробно посвятить сценаристов в обстоятельства деятельности прототипов будущих героев сериала. То есть, познакомить их с этими прототипами, рассказать о сфере их деятельности, о подробностях их повседневной жизни, дать научно-практические консультации». Предполагается, что сериал будет состоять из 8-16 новелл по 45 минут. Стоимость каждой серии оценивается в $120-200 тыс. Трансляция фильма обсуждается с «Первым каналом» и ВГТРК. Финансирование сериала, по данным источника в Минкомсвязи, было запланировано, но в связи с кризисом его решили приостановить. В настоящее время, по его словам, этот вопрос временно заморожен, но с повестки дня не снят. 800 миллионов за сайты Государство потратило 800 миллионов рублей на интернет-проекты в период с 2008 по март 2010 года. Издание Slon.ru пересчитало все публично доступные госзаказы, касавшиеся создания, поддержки, модернизации интернет-ресурсов. Самый дорогой контракт, пишет Slon.ru, был заключен с «РИА Новостями» - создание новой версии интернет-портала правительства РФ обошлось в 70,2 миллиона рублей. Заказ был поручен подрядчику без конкурса, так как формальный заказчик «Росинформтехнологии» обратился к «единственному поставщику, исполнителю, подрядчику». Создание центра мониторинга и контент-анализа информационных ресурсов российского сегмента сети интернет на основе портала ФСБ России обошлось в сумму более 56 млн рублей. А развитие интернет-портала этого же ведомства – в 39 млн.

Page 10: VR-Online (April 2010)

Модернизация интернет-ресурса президента обошлась в 33,7 млн рублей. А вот создание интернет-портала, посвященного нано-технологиям, обошлось Роснауке всего в 37 миллионов. Существуют и заказы, реального подтверждения осуществления которых в Интернете найти так и не удалось. Например, Росмолодежь потратила около 2 млн рублей

на некую поддержку функционирования «отраслевого сайта молодежной политики» (подрядчик - ИП Загребной Юрий Леонтьевич) и разработку и создание молодежной социальной сети (ООО «Стирокс»). Проплаченные версии сайта МВД на арабском и испанском языках тоже так и не нашлись. Наконец, более 10 контрактов были распределены без конкуренции. Среди заказчиков – президент, Ростехрегулирование, ФСБ, ФСКН (аж с тремя заказами без конкурса), Росархив, Минкульт и др. резидентский сайт Kremlin.ru, напомним, был признан одним из самых продвинутых в рейтинге госсайтов. А самыми худшими ресурсами признали сайты Госдумы и Конституционного суда. Opera: Теперь и в России Opera Software открыла российское представительство в Санкт-Петербурге, сообщается в официальном пресс-релизе компании. Компания надеется, что создание российского представительства поможет ей расширить присутствие на рынке. В задачу сотрудников представительства будет входить поддержка сообщества пользователей браузеров Opera, а также сотрудничество с разработчиками и партнерами компании в России. Opera сообщила, что, по данным StatCounter, в марте 2010 года ее решение стало лидером российского рынка браузеров с долей 31,7 процента. Известно, что аудитория компьютерного браузера Opera в мире превышает 50 миллионов человек. Также Opera рассказала о доле рынка мобильных браузеров. По данным компании, браузеры Opera Mini и Opera Mobile занимают 82 процента российского рынка мобильного интернета. Количество пользователей Mini за год выросло на 65 процентов. Отметим, что всемирная аудитория мобильных браузеров Opera также превышает 50 миллионов человек. Бешенные деньги. 7 миллионов за сайт госдумы

Объявлен конкурс на разработку нового интернет-сайта Государственной Думы РФ. Информация о конкурсе была опубликована на официальном ресурсе госзакупок Zakupki.gov.ru. По условиям конкурсной документации, максимальная сумма контракта составит чуть более 6,9 миллиона рублей. Конверты с заявками от желающих принять участие в тендере будут вскрыты 18 мая, а комиссия по оценке и сопоставлению заявок проведет свое заседание 1 июня. В предлагаемом Госдумой контракте оговорено создание

первой очереди сайта. Так, подрядчик будет обязан разработать новый дизайн, установить сайт на серверы заказчика и запустить его в эксплуатацию в срок до 3 декабря 2010 года. Как отмечает РИА Новости, в марте 2010 года аппарат Госдумы разместил еще один заказ. Тогда был объявлен тендер на разработку "Типового сайта комитета Госдумы". Внедрение соответствующего инструмента для 23 комитетов должно было обойтись Госдуме в 2,5 миллиона рублей. Госдума представлена в интернете с 1998 года. Как отмечается в конкурсной документации, существующий вариант сайта функционирует с 2003 года. Он был создан Управлением документационного и информационного

Page 11: VR-Online (April 2010)

обеспечения Госдумы. Oracle начинает гребсти деньги за ODF-плагин

В 2007 году компания Sun выпустила Sun ODF Plugin, бесплатный плагин, позволяющий пользователям MS Office обмениваться документами в формате ODF (Open Document). На момент написания этой заметки, на сайте Oracle есть ссылка "загрузить бесплатно", однако при попытке инициировать загрузку, пользователю предлагается приобрести однопользовательскую лицензию за 90 долларов, дополнительно доступна подписка на техническую поддержку, на первый год за $19.80, сообщает opennet.ru. Причем в розницу

лицензию приобрести нельзя - минимальное количество для покупки - 100 лицензий. ODF plugin для MS Office действительно был полезным для развивающегося нового стандарта и разрабатывался параллельно с OpenOffice.org. Текущая версия спецификации ODF соответствует OpenOffice.org версии 3.2, которая вскоре стандартизируется комитетом ISO, как ODF 1.2. Начиная с Service Pack 2 в MS Office 2007 добавлена встроенная поддержка ODF 1.0. Согласно приведенным выше суммам, услуга технической поддержки оценивается в 22% от стоимости лицензии и, в отличие от лицензии, ее приобретение не является обязательным. Также следует отметить, что данный программный продукт никогда не относился к открытому программному обеспечению и, таким образом, Oracle не отступает от данных ранее обещаний в этом контексте. Еще одно замечание состоит в том, что цена плагина соизмерима со стоимостью самой дешевой лицензии MS Office: компания Oracle это пока никак не комментирует. Dr.WEB 6.0 для Linux

Компания «Доктор Веб» сообщила о выпуске Антивируса Dr.Web для Linux версии 6.0. Обновленный продукт располагает центром управления, включает в себя монитор фонового сканирования SpIDer Guard и поддерживает 64-битные версии ОС Linux. Фактически, шестая версия Dr.Web для Linux – это новый продукт Dr.Web для защиты рабочих станций под управлением

данной ОС. В его состав вошел новый компонент – монитор SpIDer Guard, который осуществляет проверку файлов на вирусы в реальном времени. В числе преимуществ продукта – графический инсталлятор, наличие единого управляемого карантина с возможностью восстановления подозрительных файлов и ограничения размеров их хранилища; возможность настройки расписаний периодической проверки системы; настраиваемые уведомления, в том числе и звуковые, менеджер лицензий. Графический интерфейс программы с выходом новой версии был полностью обновлен. Пользователи старой версии продукта Антивирус Dr.Web для Linux (6 месяцев и более) имеют возможность перейти на использование нового продукта на льготных условиях – по цене лицензии продления, причем даже в том случае, если срок лицензии уже истек. Для этого необходимо приобрести лицензию продления на Антивирус Dr.Web для Linux на 1, 2 или 3 года. Оставшийся срок действия текущей лицензии будет добавлен к cроку новой лицензии и защитными функциями нового продукта можно будет начать

Page 12: VR-Online (April 2010)

пользоваться уже с момента регистрации серийного номера лицензии продления. Тетю асю купили 28 апреля, компания AOL и крупнейший инвестфонд Рунета - Digital Sky Technologies (DST) объявили о достижении соглашения о приобретении DST системы мгновенного обмена

сообщениями ICQ за $187,5 млн. Инвестиционная группа Digital Sky Technologies является основным владельцем сервиса Mail.ru, а также частично инвестирует развитие различных социальных проектов Рунета, в числе которых Одноклассники.Ру, ВКонтакте, Facebook и ряд других. ICQ был создан в 1996 г. израильской компанией Mirabilis. AOL приобрела активы Mirabilis, основным из которых являлся ICQ, в июне 1998 г. Сегодня ICQ доступен на 16 языках и имеет более 32 млн уникальных посетителей в месяц. ICQ занимает лидирующие позиции на рынках России, Германии, Чехии и

Израиля. «Приобретение ICQ - стратегический шаг в развитии нашего бизнеса в России и Восточной Европе. Многолетняя история бренда ICQ и значительная база постоянных лояльных пользователей предоставляют отличную возможность для дальнейшего усиления наших позиций в регионе», - сказал Юрий Мильнер, генеральный директор DST. «AOL продолжает работу по перестройке нашего бизнеса, и мы очень рады найти достойный «дом» для ICQ в лице DST», - сказал Тим Армстронг, председатель совета директоров и генеральный директор AOL. MS засветится в разработке Joomla

Разработчики Joomla сообщили, что компания Microsoft приняла участие в разработке Joomla 1.6. Первые порции предоставленного Microsoft кода уже интегрированы в разрабатываемую версию Joomla 1.6. Предоставленный код передан под лицензией GPL, при этом Microsoft на общих основаниях подписала соглашение Joomla! Contributor Agreement (JCA), подразумевающее безвозмездную передачу

сообществу Joomla всех прав на предоставляемые проекту исходные тексты. Помимо прочего, достигнуты договоренности о помощи в тестировании Joomla с Microsoft IIS и повышению совместимости Joomla с данным веб-сервером (это, по словам разработчиков, особенно актуально, так как в последнем релизе возникло сразу несколько серьезных проблем у пользователей Microsoft IIS).

По материалам с uinc.ru

Page 13: VR-Online (April 2010)

Роман Костенко aka Lord_of_fear ЖЕЛЕЗНЫЕ НОВОСТИ

INTEL РАЗРАБОТАЛА НОВУЮ ПЛАТФОРМУ ДЛЯ МОБИЛЬНЫХ УСТРОЙСТВ

Компания Intel сообщила о выпуске новой мобильной платформы на базе процессоров Intel Atom, ранее известною как Moorestown, обладающую высочайшей энергоэффективностью.

Новинка обладает существенно более низким энергопотреблением и ориентирована на применение в компактных мобильных устройствах: смартфонах, карманных компьютерах, интернет-планшетах, мультимедийных проигрывателях и др. Платформа поддерживает возможность декодирования HD видео, многостороннюю видеоконференцсвязь, многозадачность. МОНОБЛОЧНЫЙ КОМПЬЮТЕР EEE KEYBOARD PC ОТ ASUS Компания ASUS официально представила свой компактный компьютер Eee Keyboard PC, который впервые продемонстрировала еще на выставке CES 2009. Позже его релиз неоднократно переносился, и лишь сейчас такое устройство представлено официально. Компьютер ASUS Eee Keyboard PC основан на наборе системной логики Intel 945GSE+ICH7-M и содержит экономичный процессор Atom N270, работающий на частоте 1,6 ГГц. Также устройство содержит 1 ГБ оперативной памяти стандарта DDR2, твердотельный накопитель емкостью 16 или 32 ГБ, интегрированное графическое ядро Intel GMA 950 и мультимедийный чип Broadcom 70010/70012, предназначенный для декодирования HD видео. В данном устройстве реализованы три порта USB 2.0, видео выходы VGA и HDMI, звуковые интерфейсы. Также представленный моноблочный компьютер ASUS Eee Keyboard PC обладает поддержкой технологии беспроводной передачи видео UWD (Ultra-wideband Technology), которая позволяет передавать потоковое HD видео в разрешении 720p на дистанции до 5 метров. При передаче прочих данных (не видео) дистанция передачи может достигать до 10 метров. БЛОК ПИТАНИЯ ОТ OCZ С КПД ОКОЛО 90% Компания OCZ разработала новый высокоэффективный блок питания в рамках серии Z мощностью 1000 Вт, который сертифицирован 80 plus Gold.

Page 14: VR-Online (April 2010)

Новинка обеспечивает высокий КПД: 87% – при загрузке 20% и 100% и 90% при загрузке 50%. Устройство содержит единую линию напряжения 12 В и тихий, но производительный вентилятор. На сайте производителя пока отсутствует информация о блоках питания серии Z. Очевидно, подробное описание таких устройств станет доступно в ближайшие дни.

HP ПРЕДЛАГАЕТ ИСПОЛЬЗОВАТЬ ПРИ ПРОИЗВОДСТВЕ ДИСПЛЕЕВ ПЛАСТИКОВУЮ ОСНОВУ Компания HP в настоящее время разрабатывает технологию, которая позволила бы заменить нынешние стеклянные основы дисплеев на пластиковые. Подобная замена позволит не только снизить затраты на производство, но и значительно уменьшить вес дисплеев: изображённый на фотографии образец пластиковой подложки в два раза тоньше листа бумаги и в сорок раз легче стеклянного аналога. Технологическое оборудование, необходимое для производства пластиковых дисплеев, чем-то напоминает типографские машины - благодаря своей гибкости, листы пластика могут подвергаться обработке на валиках большого диаметра. Гибкие дисплеи на пластиковой основе компания HP начнёт использовать в 2011 году в продуктах, предназначенных для армии США. Крупнейшему производителю компьютеров эти разработки пригодятся и в "мирной жизни".

ВИНЧЕСТЕРЫ ОБЪЁМОМ 3 ТБ ПОЯВЯТСЯ В ЭТОМ ГОДУ Несмотря на растущую популярность твёрдотельных накопителей, спрос на классические жёсткие диски в ближайшие годы снижаться не будет. Основное преимущество традиционных винчестеров - выгодное соотношение цены и объёма, которого SSD не достигнут ещё долго. Британский сайт www.theregister.co.uk ообщает, что компания Seagate собирается в этом году представить винчестер типоразмера 3.5" объёмом 3 Тб, который пропишется в семействе

Constellation ES. Жёсткий диск будет оснащаться интерфейсом SAS, обеспечивающим скорость передачи информации 6 Гбит/с. К середине года компания также может представить винчестер типоразмера 2.5" объёмом 1 Тб. Главный конкурент Seagate, компания Western Digital, тоже может анонсировать в этом году винчестер типоразмера 3.5" объёмом 3 Тб.

В ЭТОМ ГОДУ МОГУТ ПОЯВИТЬСЯ СЕРВЕРЫ НА БАЗЕ ARM-

Page 15: VR-Online (April 2010)

ПРОЦЕССОРОВ Мы привыкли к тому, что процессоры с ARM-архитектурой используются преимущественно в мобильных устройствах, где их низкое энергопотребление позволяет обеспечить высокую степень автономности. Для обозначения мобильных компьютеров на базе таких процессоров даже придуман специальный термин - "смартбук", который намекает на симбиоз смартфона и нетбука. Между тем, как сообщает сайт www.eetimes.com со ссылкой на заявления главы ARM Holdings, в ближайшие двенадцать месяцев мы можем стать свидетелями появления на рынке серверных решений на базе процессоров с ARM-архитектурой. Она уже сейчас позволяет создавать процессоры с четырьмя ядрами, работающими на частоте 2 ГГц. Остаётся только разработать эффективный интерфейс для обмена информацией между процессорами в серверной системе. Подобные решения позволят снизить уровень энергопотребления серверов - эта проблема привлекает к себе всё больше внимания по мере роста потребности в производительных серверных конфигурациях.

Page 16: VR-Online (April 2010)
Page 17: VR-Online (April 2010)

Игорь Антонов aka Spider_NET [email protected]

Программисты за бугром Интервью с М. Фленовым 1. Миша, почему ты решил стать именно Канадским программистом? Как ты выбирал страну для иммиграции и почему выбор пал именно на Канаду? Когда переезжаешь из города в город, то это громадный стресс для любого человека. А когда меняешь страну, то это неописуемо. Я сразу же догадывался, что переезд будет не легким, и поэтому помощь государства в адаптации очень важна, а в Канаде большинство народу иммигранты и государство помогает всеми силами. Полно различных курсов по адаптации, бесплатные курсы английского и помощь в поиске работы. В общем, не чувствуешь себя брошенным на произвол судьбы. 2. В какой области программирования ты сейчас трудишься? Какие языки программирования приходится применять в работе? Web программирование и использую C#. 3. Какие языки программирования/технологии наиболее востребованы в Канаде (твое имхо)? Требуются ли Delphi программисты? Самый востребованный пока Java, но ее популярность постепенно падает и мне кажется, падение будет скоро очень резким. На втором месте наверно PHP и .NET. Кого больше, сказать не могу, но за PHP платят меньше раза в два. Delphi здесь практически нет. Если увидишь хотя бы одно объявление на миллион вакансий, то это будет чудо. Я за полгода поиска работы видел только два объявления - одно было связано с работой перевода текущего Delphi приложения на .NET, а другая работа в Канадском офисе Европейской компании. Вот В Европе Delphi пока еще используют, а в Северной Америке - это зверь из красной книги. 4. Расскажи, пожалуйста, чем отличается работа программистом за рубежом по сравнению с Россией? Здесь народ работает, а не ищет способы укрыться от работы. Да, бюрократия круче советских времен, но все равно, народ работает. Очень хорошее отношение начальства к сотрудником. Начальники понимают, что их доход зависит от сотрудников и всячески помогают и поддерживают. 5. Трудно ли устроиться на работу программистом в Канаде? Как работодатели относятся к эмигрантам из России (претендующим на эту должность)? Есть ли шанс быстро найти работу? Найти работу трудно, по крайней мере первую. К эмигрантам относятся нормально, просто здесь очень важно иметь локальный опыт работы и собеседования проходят в несколько этапов. В Канаде очень сложно уволить человека, поэтому, чтобы не тянуть

Page 18: VR-Online (April 2010)

мертвый груз, проверяют по всем статья. Шанс найти работу быстро есть, но "быстро" в Канаде - это три месяца. Менее трех месяцев поиска работы - это считай мгновенно. Вот когда у тебя будет локальный опыт, тогда тебе будут звонить, даже не смотря на то, что ты уже давно не ищешь работу. 6. Как ты производил поиск работы - в Канаде, или работу искал удаленно заранее? Сколько в среднем времени тебе потребовалось на поиск работы? Удаленно искать бесполезно, потому что с рабочей силой тут проблем нет, и никто удаленно говорить не будет. Первую работу искал около двух месяцев. 7. Расскажи про процесс собеседования? Во сколько этапов они обычно проходят? Минимум в 3. Если меньше, то компания скорей всего фуфло. Первое интервью происходит по телефону. Просто знакомятся и выясняют основные вопросы, стоит ли вообще вызывать и тратить на тебя время. Если все прошло удачно, то в течении недели могут перезвонить или написать письмо, с просьбой прийти на второе собеседование. Второе чаще всего техническое. Просят что-то сделать, написать, придумать решение проблемы. В основном с каверзными ответами и без возможности пользоваться литературой или визуальными вещами. Если умеешь только кнопочки расставлять, то дальше второго собеседования не пройти. Тут очень часто нужно знать алгоритмы и уметь писать код, а не тягать иконки по форме. Третье собеседование уже с директором или с высшим начальством. Если к нему попал, то это уже 90% вероятность, что тебя берут. Тут нужно показать заинтересованность именно в этой компании, что ты ищешь не просто работу и деньги, а ты хочешь работать в этой компании. Если не хочешь, то это сразу чувствуется и тебя не возьмут. 8. Когда ты жил в России, то писал статьи и книги. Планируешь ли теперь писать статьи/книги для Канадских изданий? Я знаю, что некоторые твои книги были переведены на английский. Пользуются ли они успехом за бугром? Для местных писать не собираюсь. 9. Каким уровнем английского языка нужно обладать, чтобы комфортно чувствовать себя на собеседовании в Канадской компании? Сколько времени ты потратил на изучение английского? Я его до сих пор учу. Язык не нужно знать отлично, потому что очень часто на язык не особо обращают внимания. 10. Если кто-то из наших читателей задумается о переезде в другую страну, то с чего стоит начинать подготовку? Как искать жилье? Как лучше выбирать страну? Очень хочется услышать советы от бывалого :) Начать нужно с переезда внутри своей страны и проверить, сможете ли вы это. Как я сказал, просто смена города внутри одной страны - это уже хороший стресс. Не каждый выдерживает. 11. Многие считают, что такие страны как США, Канада - рай для

Page 19: VR-Online (April 2010)

программистов. Что об этом думаешь ты? В плане зарплаты и Москва является раем, так что смотря как посмотреть. Если сравнить программеров со строителями, то для программерав США и Канада - это рай, а для строителей может быть адом. Если сравнить нагрузки программеров в Питере и в Канаде, то в Канаде работают минимум в 4 раза больше, чем в Питере. С Москвой не знаю, там не работал, но слышал, что там тоже можно халявить во многих компаниях. Так что если нужен рай, то это наверно Москва, потому что зарплата большая, а можно найти работу с небольшой нагрузкой. 12. Сертификаты, каких компании наиболее востребованы в Канаде? Дает ли наличие сертификата преимущество при трудоустройстве? Дает, но небольшое и желательно местное. Российские сертификаты можно повесить на стену вместо обоев. Мало кто обратит на них внимание. По крайней мере на мои не смотрели. 13. Какие технологии ты планируешь изучать в ближайшее время? Как ты сейчас относишься к Delphi? Применяешь его в своих проектах? Delphi не запускал и не видел вообще уже почти год. Последний раз видел его в апреле 2009, когда уволился с последней работы в Питере. Что изучать нового? .NET. Там еще много чего изучать. 14. Как в Канадских компаниях (на примере той, где работаешь ты) компании происходит повышение квалификации сотрудников? Отправляют ли вас на какие-нибудь курсы и т.д.? Вроде отправляют, но я в это не вникал. 15. Не жалеешь, что уехал из России? Есть в планах возвращение? Пока нет. 16. Перед тем как закончить интервью, хочется расспросить тебя о твоих планах на будущее. Как книги планируешь написать/переиздать в ближайшее время? Ближайшее будущее - Linux глазами хакера 3. Это небольшая корректировка, а точнее обновление к нынешним реалиям. Все же Linux не стоит на месте. Больше ничего нет и контрактов нет. Если и подпишу в ближайшее время что-то, то результат будет не раньше, чем через пол года, но сейчас времени нет подписывать. Я решил больше времени уделять Web проектам, а точнее, планирую расширить www.heapar.com и www.photo-garden.com. 17. Ну и напоследок, чтобы ты хотел пожелать нашим читателям, мечтающим найти счастья за границей? Счастье не в загранице. Люди могут быть счастливы и в своей стране, и несчастливы за бугром. Но если решились, то нужно готовить себя, изучать страну, в которой будете жить, учить язык.

Page 20: VR-Online (April 2010)

Delphi. Точки восстановления C#. Как отправить E-mail из Flash Delphi. Когда выгодно использовать record вместо class CSS. Наложение изображений Delphi. Делаем стеклянный эффект Хакерский кодинг на 1С:Предприятие 8.x 15 регулярных выражений для WEB-разработчиков Delphi. Tips and Tricks #1 Delphi. KOL'ьная диета для дельфийца. Часть 3 Delphi. Google API в Delphi. Аутентификация пользователя

Page 21: VR-Online (April 2010)

Антонов Игорь aka Spider_NET [email protected]

Delphi. Точки восстановления Получаем точки восстановления при помощи WMI. Начиная с версии XP (а если быть точней, то с Windows ME), системы семейства Windows обзавелись очень полезным механизмом – созданием точек восстановления. Благодаря этой возможности ты можешь не бояться (вру, бояться все равно нужно) последствий установки левого драйвера, который стал вгонять систему в BSOD при загрузке. Создал точку останову (в идеале, ее должен создать установщик приложения/драйвера), установил бажный драйвер. Не работает? Не беда! При появлении стартового меню выбираем загрузку с последней точки восстановления и перед тобой вновь рабочая система. Разве, не замечательно? Как посмотреть созданные точки восстановления Для проделывания этой операции не нужно быть гуру Windows. В меню «Пуск» -> «Стандартные» -> «Служебные» есть ярлык на запуск приложения «Восстановления системы». Попробуй запустить его. Перед тобой должен появиться мастер восстановления системных файлов и параметров. Нажав один раз кнопку «Далее», ты увидишь окно, в котором и будут перечислены все имеющиеся в системе точки восстановления.

Page 22: VR-Online (April 2010)

Я не буду вдаваться в тонкости создания новой точки восстановления при помощи этого мастера. Здесь нет ничего сложного, и ты без труда сможешь самостоятельно проделать эту операцию. Моей задачей будет научить тебя получать список точек восстановления в своем приложении. Точки восстановления в Windows Чтобы перебрать все имеющиеся точки восстановления есть как минимум три способа: Windows API. В системе есть соответствующие API функции, которые ты без проблем сможешь заюзать в своем приложении. Наверняка эти функции не описаны в стандартных заголовчных файлов, поэтому тебе однозначно придется погрузиться в изучении MSDN и описать все необходимое самостоятельно. WMI (Windows Management Instrumention). Инструментарий для управления Windows представляет из себя набор интерфейсов для управления операционной системой через специальные компоненты. Одним из главных преимуществ этой технологии – возможность управлять ОС как локально, так и удаленно. WMI уже достаточно старая технология и ее поддерживают абсолютно все версии Windows (для 9x нужно скачивать отдельно). Мне нравится WMI за простоту использования. Сегодня ты в этом убедишься. PowerShell. Windows PowerShell – это язык сценариев, построенный (и интегрированный) на базе .NET Framework. При работе с этим языком ты взаимодействуешь с командлетами – готовыми приложениями. Таких приложений великое множество и при умелом использовании языка сценариев PW ты можешь творить настоящие чудеса в системе (под чудесами я подразумеваю богатые возможности для автоматизации).

Page 23: VR-Online (April 2010)

Каждый из этих способ хорош по-своему. Самым универсальным из них конечно же будет первый. Функции API – они и в Африке API. Работают безотказно. Прямо как автомат Калашникова. Несмотря на их универсальность и крутость, сегодня мы их оставим в покое, а решим поставленную задачу при помощи технологии WMI. Немного занудной теории Не будет врезаться с разбегу о телегу, сначала разберемся с теорией. Для того, чтобы пробежаться по всем точкам восстановления нужно нам придется воспользоваться WMI классом SystemRestore (http://msdn.microsoft.com/en-us/library/aa378951%28v=VS.85%29.aspx). В этом классе реализованы методы для выполнения различных операций над точками восстановления. Среди них: - Включение/отключение мониторинга точек восстановления - Получение списка доступных точек восстановления - Инициирование восстановления на локальной системе. Сам класс описан следующим образом: class SystemRestore { String Description; uint32 RestorePointType; uint32 EventType; uint32 SequenceNumber; String CreationTime; }; Ну а теперь поговорим подробней о методах и свойствах этого класса. Начнем с свойств. Их не так уж и много. CreationTime (String) – дата создания точки восстановления Description (String) – описание точки восстановление. Используется для того чтобы можно определить для чего же была эта точка создана. EventType (uint32) – тип события. Может принимать одно из следующих значений: BEGIN_NESTED_SYSTEM_CHANGE (102) – Начало изменений в системе. Следующие вложенные вызовы не создают новую точку восстановления. В качестве следующего вызова ты должен использовать END_NESTED_SYSTEM_CHANGE, а не END_SYSTEM_CHANGE. BEGIN_SYSTEM_CHANGE (100) – Изменения в системе начались END_NESTED_SYSTEM_CHANGE (103) – Изменения в системе завершены END_SYSTEM_CHANGE (101) - Изменения в системе завершены RestorePointType (uint32) - тип точки восстановления. Может принимать одно из следующих значений: APPLICATION_INSTALL (0) – приложение было установлено. APPLICATION_UNINSTALL (1) – приложение было деинсталлировано CANCELLED_OPERATION (13) – приложению необходимо удалить созданную точку восстановление. Такая ситуация может возникнуть, когда пользователь решил отказаться от установки приложения. DEVICE_DRIVER_INSTALL (10) – драйвер устройства был установлен

Page 24: VR-Online (April 2010)

MODIFY_SETTINGS (12) – приложение добавило или удалили какие-то свои возможности/компоненты. SequenceNumber (uin32) – порядковый номер точки восстановления. Как видишь, все достаточно просто и понятно. Зная теорию, можно состряпать работоспособный пример. Но перед тем как это сделать, взглянем функции, которыми нам придется воспользоваться в Delphi. Можешь не волноваться, их будет совсем немного. procedure OleCheck(Result:HResult). Данная процедура описана в модуле ComObj и предназначена для создания исключительной ситуации EOleSysError, если в переданном в качестве параметра выражении возникла ошибка. В качестве единственного параметра, процедуре OleCheck можно передавать любые выражения имеющие тип HResult. Благодаря этой процедуре у нас появляется отличная возможность обрабатывать исключительную ситуацию. Для типа HResult существует предопределенные константы. Некоторые из них я перечислю ниже: S_OK – операция выполнена успешно S_FALSE – операция выполнена успешно. Это константа отличается от предыдущей тем, что подразумевает специфическую особенность при выполнении функции. Применение S_FALSE строго не регламентируется. E_FAIL – просто ошибка. Причина не указана. E_UNEXPECTED – катастрофическая ошибка. Операция не может быть выполнена из-за непредвиденной ситуации E_NOTIMPL – описание функции не реализовано. E_OUTOFMEMORY – недостаточно памяти. E_INVALIDARG – неверный аргумент функции E_NOINTERFACE – запрашиваемый интерфейс отсутствует на сервере. E_POINTER – неверный указатель. E_HANDLE – ошибочный дескриптор. E_ABORT – операция прервана E_ACCESSDENIED – доступ запрещен. function CreateBindCtx (reserved:LongInt; out bc: IBindCtx): HResult; stdcall;

Функция CreateBindCtx() возвращает указатель на реализацию интерфейса IBindCtx. Этот объект хранит информацию о том, как выполняется процесс связывания. Как только функция завершит свое выполнение, она создаст новый контекст с заполненной структурой BIND_OPS2. Этой функции требуется передать всего лишь два параметра: reserved. Параметр зарезервирован и должен быть 0. ppbc. Указатель на интерфейс IBindCtx. function MkParseDisplayName(bc: IBindCtx; szUserName: POleStr; out chEaten: Longint; out mk: IMoniker): HResult; stdcall; Функция MkParseDisplayName предназначена для разбора строки на моникеры (моникер – это такой com-объект, который реализует интерфейс IMoniker и позволяющий клиенту получить указатель на объект).

Page 25: VR-Online (April 2010)

Из параметров, эта функция требует: bc – указатель на интерфейс IBindCtx, реализованный у связывающего объекта. szUserName [in] – указатель на отображаемое имя для разбора. pchEaten [out] – указатель на число символов szUserName, которые были использованы. Если функция выполнится успешно, то здесь будет содержаться длина szUserName, иначе здесь будет число успешно распарсенных символов. ppmk [out] – адрес указателя на интерфейс IMoniker. Переменная по этому адресу получит указатель на интерфейс построенный из szUserName. Из возвращаемых значений функция может вернуть: E_OUTOFMEMORY (см. выше), S_OK (см. выше), MK_E_SYNTAX (ошибка в синтаксисе имени файла или ошибка синтаксиса моникера-результата). Кроме того, данная функция может также вернуть любую из ошибок, возвращаемых IMoniker::BindToObject, IOleItemContainer::GetObject или IParseDisplayName::ParseDisplayName. На этом с теорией покончено и можно, переходить к разбору реального примера. Если ты что-то не понял из теории, то не отчаивайся. При рассмотрении реального примера все должно будет встать на свои места. На крайний случай, не поленись заглянуть в MSDN. Там все подробненько описано. Правда на английском и все примеры приведены на C++. Но тебя, же не остановит этот маленький барьер? Делаем пример Настало время самого интересного – рассмотрение практического примера. Запускай Delphi и создавай новый проект типа Application. Не забудь все это дело сохранить. Как сохранишь, набросай примерно такой же дизайн как и в моем примере.

Page 26: VR-Online (April 2010)

Компонент много не понадобится. Я всего лишь бросил на форму один компонент TListView, в котором создал несколько колонок (имена колонок равны свойствам рассматриваемого выше класса SystemRestore) и одну кнопку, по нажатию которой и будет выполняться код для получения всех точек останова. Для удобства, я расположил кнопку на предварительно созданной панели инструментов. На этом с дизайном все. Когда я начинал писать эту статью, то решил, что будет весьма неплохо сделать код получения точек восстановления многоразовым. Сказано сделано. Создай новый Unit и сохрани его под именем RestoreViewer. Сейчас мы в нем опишем новый класс. Перейди в редактор кода. В нем у тебя должен быть открыт пустой, только что созданный Unit – RestoreViewer. Написание универсального класса мы начнем с подключения необходимых модулей. В секцию Uses допиши имена следующих модулей: SysUtils, Variants, ComObj, ActiveX.

Для нашего класса их более, чем достаточно. Теперь займемся описанием констант. Ты помнишь, что когда я рассказывал теорию из MSDN, то мне приходилось оперировать символьными названием констант. Если ты просто так начнешь ссылаться на них в коде, то ничего хорошего у тебя не выйдет. Компилятор начнет материться как сапожник, т.к. ни в одном из дельфячих модулей эти константы не описаны. В общем не теряй времени, а скорей объявляй секцию const и опиши в ней константы: //Константы, характеризующие тип события BEGIN_NESTED_SYSTEM_CHANGE = 102; BEGIN_SYSTEM_CHANGE = 100; END_NESTED_SYSTEM_CHANGE = 103; END_SYSTEM_CHANGE = 101; //Константы, характеризующие тип точки восстановления APPLICATION_INSTALL = 0; APPLICATION_UNINSTALL = 1; CANCELLED_OPERATION = 13; DEVICE_DRIVER_INSTALL = 10; MODIFY_SETTINGS = 12;

В качестве имен констант я брал те же самые, которые и указаны в MSDN. Значения константы взяты там же. Ok, двинемся к следующему шагу – описанию структуры, для

Page 27: VR-Online (April 2010)

хранения информации о точке восстановления. Можно было конечно для этой цели завести отдельный класс, но зачем забивать гвозди плоскогубцами? Структуру я описал следующим образом: TRestorePoint = record Description:string; EventType:string; SequenceNumber:string; CreationTime:string; RestorePointType:string; end;

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

Константы объявлены, структура описана – самое время заняться изобретением простенького класса. Свой класс я обозвал как TRestoreViewer. В целом он выглядит так: TRestoreViewer = class private function RestorePointTypeToStr(RestorePointType:Integer):string; function EventTypeToStr(EventType:Integer):string; function WMITimeToStr(WMITime:string): string; function GetWMIObject (const ObjectName:string):IDispatch; public function GetRestorePoints():TRestorePoints; end;

Из public методов я объявил лишь GetRestirePoint(). Именно он будет возвращать все имеющиеся точки восстановления. Сами точки будут возвращаться в виде массива элементов из структур типа TRestorePoint. Чтобы функция возвращала массива, нужно определить новый тип: TRestorePoints = array of TRestorePoint;

С внешним видом класса все должно быть понятно. Разберем метод GetRestorePoints():

Page 28: VR-Online (April 2010)

function TRestoreViewer.GetRestorePoints: TRestorePoints; var ObjWMIService : OLEVariant; ColItems : OLEVariant; ColItem : OLEVariant; OEnum : IEnumvariant; IValue : LongWord; CountOfRestorePoint : Integer; I: Integer; RestorePoint : TRestorePoint; begin ObjWMIService := GetWMIObject('winmgmts:\\localhost\root\default'); ColItems := objWMIService.ExecQuery('SELECT * FROM SystemRestore','WQL',0); OEnum := IUnknown(colItems._NewEnum) as IEnumVariant; if (VarIsOrdinal(ColItems.Count)) then CountOfRestorePoint := StrToInt(VarToStr(ColItems.Count)) else CountOfRestorePoint := 0; if (CountOfRestorePoint = 0) then Exit; SetLength(Result, CountOfRestorePoint); I := 0; while OEnum.Next(1, colItem, IValue) = 0 do begin RestorePoint.Description := ColItem.Description; RestorePoint.EventType := EventTypeToStr(ColItem.EventType); RestorePoint.SequenceNumber := ColItem.SequenceNumber; RestorePoint.CreationTime := WMITimeToStr(ColItem.CreationTime); RestorePoint.RestorePointType := RestorePointTypeToStr(ColItem.RestorePointType); Result[i] := RestorePoint; Inc(I); end; end;

Самое интересное здесь – получение WMI объекта (winmgmts:\\localhost\root\default) и выборка всех точек восстановления с помощью запроса: SELECT * FROM SystemRestore. Выполнив запрос, необходимо проверить результат выборки на наличие элементов. Если их нет, то дальше нет смысла что-то делать. В противоположной ситуации (если запрос вернул, хоть один элемент), мы будем руководствоваться следующей стратегией: Устанавливаем размер массива. Размерность массива определяем количеством элементов, вернувших запросом. Для этого используем метод SetLength(). В первом параметре передаем Result (массив, результат выполнения функции) и переменную CountOfRestorePoint, содержащую количество имеющихся точек восстановления. Перебираем все точки с помощью метода Next объекта OEnum и сохраняем всю полученную информацию в объявленную ранее нами структуру. Получив свойства очередной точки восстановления, добавляем заполненную структуру в массив.

Page 29: VR-Online (April 2010)

Приложение в действии

Дальше, проще С остальными методами ты разберешься сам. Описание всех используемых API функций я привел, поэтому проблем возникнуть не должно. На крайний случай можешь написать мне письмо с вопросом. Отвечу с удовольствием J. Вот на этой славной ноте я и хочу с тобой попрощаться. Удачи к кодинге!

Page 30: VR-Online (April 2010)

Игорь Антонов aka Spider_NET [email protected]

C#. Как отправить email из Flash Отправить email из Flash при помощи .NET действительно просто. Все что вам требуется – настроить Flash приложение на отправку запроса в ASPX страницу. О том, как все это настроить, и пойдет речь в этой небольшой статье. Что нам нужно 1. ASPX страница, которая будет принимать запрос (в нашем примере она будет называться EmailSender.aspx). 2. Внешний интерфейс (или по-простому – форма) на flash, который будет принимать от пользователей их сообщения для отправки (в нашем примере дадим ему имя EmailForm.fla). 3. Сценарий ActionScript, содержащий класс для обработки полученных от пользователей сообщений (назовем его EmailForm.as). Шаг 1: Создаем файл EmailForm и добавляем следующие объекты и изменяем их свойства. Name : Type = Input Text, Name = txtName Email Address : Type = Input Text, Name =txtEmailAddress Subject : Type = Input Text, Name =txtSubject Message : Type = Input Text, Name =txtMessage Error : Type = Dynamic Text, Name =txtError Send Email Button : Type = Button, Name =btnSendEmail

Шаг 2: Создаем сценарий ActionScript. Сохраняем его под именем EmailForm.as в любую директорию и добавляем нижеприведенный код.

Page 31: VR-Online (April 2010)

package { import flash.display.MovieClip; import flash.display.SimpleButton; import flash.events.MouseEvent; import flash.utils.Timer; import flash.events.*; import flash.net.URLLoader; import flash.net.URLVariables; import flash.net.URLRequest; import flash.net.URLRequestMethod; import flash.net.URLLoaderDataFormat; import flash.ui.ContextMenu; import flash.ui.ContextMenuItem; import flash.net.navigateToURL; public class EmailForm extends MovieClip { private var oTimer:Timer; private var bCheckStatus:Boolean=false; public function EmailForm() { init(); initListener(); } private function init():void { } private function initListener():void { btnSendEmail.addEventListener(MouseEvent.MOUSE_DOWN,controlFields); } private function controlFields(m:MouseEvent):void { if(txtName.text!=''&&txtEmailAddress.text!=''&&txtSubject.text!=''&&txtMessage.text!='') { if(CheckEmail(txtEmailAddress.text)) { bCheckStatus=true; sendEmail(); } else

Page 32: VR-Online (April 2010)

{ bCheckStatus=false; txtError.text='Email Address is Invalid'; toggleAlert(); } } else { bCheckStatus=false; txtError.text='You need to fill in required fields'; toggleAlert(); } } private function toggleAlert():void { oTimer=new Timer(2000,1); oTimer.addEventListener('timer',cancel); oTimer.start(); } private function cancel(t:TimerEvent):void { txtError.text=''; if(bCheckStatus) { txtName.text=''; txtEmailAddress.text=''; txtSubject.text=''; txtMessage.text=''; } bCheckStatus=false; } private function sendEmail():void { var oEmailFields:URLVariables=new URLVariables(); oEmailFields.sEmail=txtEmailAddress.text; oEmailFields.sMessage=txtMessage.text; oEmailFields.sSubject=txtSubject.text; oEmailFields.sName=txtName.text; var oRequest:URLRequest=new URLRequest(); oRequest.url='EmailSender.aspx'; oRequest.method=URLRequestMethod.POST; oRequest.data=oEmailFields; var oLoader:URLLoader=new URLLoader(); oLoader.dataFormat=URLLoaderDataFormat.VARIABLES; addListeners(oLoader); try { loader.load(oRequest); } catch (error:Error) { trace('Page Not Found'); } } private function addListeners(d:IEventDispatcher):void { d.addEventListener(Event.OPEN,Initialize); d.addEventListener(ProgressEvent.PROGRESS,inProgress); d.addEventListener(Event.COMPLETE,Completed); d.addEventListener(HTTPStatusEvent.HTTP_STATUS,HTTPStatus); d.addEventListener(SecurityErrorEvent.SECURITY_ERROR,SecurityError); d.addEventListener(IOErrorEvent.IO_ERROR,IOError); } private function Initialize(e:Event):void { txtError.text='Sending ...'; } private function inProgress(e:ProgressEvent):void

Page 33: VR-Online (April 2010)

{ txtError.text='Sending ...'; } private function Completed(e:Event):void { var loader:URLLoader=URLLoader(e.target); var vars:URLVariables=new URLVariables(loader.data); if(vars.answer=='ok') txtError.text='Message Sent'; else txtError.text='Error (Message not Sent)!!!'; toggleAlert(); } private function SecurityError(e:SecurityErrorEvent):void { txtError.text='Error (Security)!!!'; } private function HTTPStatus(e:HTTPStatusEvent):void {} private function IOError(e:IOErrorEvent):void { txtError.text='Error (IO)!!!'; } public function CheckEmail(s:String):Boolean { var x:Number; var y:Number=0; var boolTest:Boolean=new Boolean(); for(var i:Number=0;i<s.length;i++) { if(s.charAt(i)==' ') { boolTest=false; break; } if(s.charAt(i)=='@') { x=i; y++; } else if(i>x&&s.charAt(i)=='.'&&s.charAt(s.length-1)!='.') { y++ boolTest=true break; } else { if(i==s.length-1) { boolTest=false; break; } } } return boolTest; } } }

Шаг 3: Подключаем этот класс к нашему EmailForm.fla

Page 34: VR-Online (April 2010)

Шаг 4: Создаем файл EmailSender.aspx и копируем в него следующий код using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Net.Mail; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Request.Form["sEmail"] != null) { string sPOSTEmail = Request.Form["sEmail"].ToString(); string sPOSTMessage = Request.Form["sMessage"].ToString(); string sPOSTSubject = Request.Form["sSubject"].ToString(); string sPOSTName = Request.Form["sName"].ToString(); MailMessage oMailMessage = new MailMessage(); SmtpClient oSMTPClient = new SmtpClient(); MailAddress oFromAddress = new MailAddress(sPOSTEmail, sPOSTName); string sEmailUser = "XXXXXXXXXXXXXX"; string sEmailPassword = "XXXXXXXXXXXXXXXXX"; string sEmailServer = "XXXXXXXXXXXXXXXXX"; int iEmailServerSMTPPort = 25; oSMTPClient.Host = sEmailServer; oSMTPClient.Port = iEmailServerSMTPPort; System.Net.NetworkCredential oCredentials = new System.Net.NetworkCredential(sEmailUser, sEmailPassword); oSMTPClient.Credentials = oCredentials; oMailMessage.From = oFromAddress; oMailMessage.To.Add("XXXXXXXXXXXXXXXXXXXXXXX"); oMailMessage.Subject = sPOSTSubject; oMailMessage.IsBodyHtml = true; oMailMessage.Body = sPOSTMessage; oSMTPClient.Send(oMailMessage); } } }

Шаг 5: Поздравляю, ты готов к рок-н-роллу, можешь публиковать форму на

Page 35: VR-Online (April 2010)

свой сайт. Удачи!

Page 36: VR-Online (April 2010)

Антонов Игорь aka Spider_NET [email protected]

RECORD или CLASS? Когда выгодно использовать record вместо class

Совсем недавно я открыл для себя блог http://compaspascal.blogspot.com. Автор блога – Delphi-разработчик из Дании. В своих заметках, он частенько рассматривает вопросы так или иначе связанные с программированием на Delphi. Некоторые из заметок вызвали у меня интерес, и я решил сделать их переводы. Цикл переводов хочу начать с заметки When to use record instead of classes (http://compaspascal.blogspot.com/2009/12/when-to-use-record-instead-of-c...). Поехали!

Изначально, структуры/записи (record) было принято использовать для группировки различных значений. Затем, эти группы применяли в массивах, параметрах и т.д. С развитием ООП, классы взяли эту работу на себя. Однако иногда, все же лучше применять структуры/записи.

Рассмотрим пример:

type TTest= class a,b,c:integer; end; var arrT:array[1..1000000] of TTest; begin for i:=low(arrT) to high(arrT) do begin arrT[i]:=TTest.Create; arrT[i].a:=2; arrT[i].b:=3; arrT[i].c:=4; end; end;

На моем компьютере этот код (первый раз) выполнился за 161ms. При последующих запусках, время выполнения сократилось до 91ms. А вот это код у меня выполнился за 9ms:

begin c:=0; for i:=low(arrT) to high(arrT) do begin c:=c+arrT[i].a+arrT[i].b-arrT[i].c; end; end;

Если переписать этот код с использованием массива, состоящего из записей, то у вас получится что-то вроде этого:

type RTest= record a,b,c:integer; end; var

Page 37: VR-Online (April 2010)

arrR:array[1..1000000] of RTest; begin for i:=low(arrR) to high(arrR) do begin arrR[i].a:=2; arrR[i].b:=3; arrR[i].c:=5; end; end;

Вроде бы ничего особенного не изменилось, но замер производительности показывает, что на выполнение этого кода уже требуется 17ms (первый раз) и 9ms в последующих запусках. Сам перебор и заполнение массива занимает 6ms:

begin for i:=low(arrR) to high(arrR) do begin arrR[i].a:=2; arrR[i].b:=3; arrR[i].c:=5; end; end;

Другими словами, в данном случае, код с записями (структурами) выполняется в 10 раз быстрее, по сравнению с кодом, построенным на классах (замеры производительности выполнялись в Delphi 2009). Добавление строки, которая не принимает значение, ситуацию сильно не меняет. Вместо 17ms, выполнение кода заняло 23ms, но размер записи возрос, поэтому имеет смысл действовать следующим образом:

type RTest= record a,b,c:integer; s:string; end;

Однако, если вы присвоите строке значение, то производительность упадет: begin for i:=low(arrR) to high(arrR) do begin arrR[i].a:=2; arrR[i].b:=3; arrR[i].c:=5; arrR[i].s:='234'; end; end;

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

Page 38: VR-Online (April 2010)

Антонов Игорь aka Spider_NET CSS. НАЛОЖЕНИЕ ИЗОБРАЖЕНИЙ

В этой небольшой заметке я хочу рассказать вам, о том, как можно сделать наложения изображений. Урок будет достаточно простым, но я уверен, новичкам он непременно пригодится. Итак, приступим. Шаг 1: Создаем файл CSS #OverlayImage1 { position: absolute; left: 20px; top: 20px; width: 56px; height: 45px; background:url(Angel.png) no-repeat top left; opacity:.80; filter: alpha(opacity=80); -moz-opacity: 0.8; } #OverlayImage2 { position: absolute; left: 40px; top: 20px; width: 56px; height: 45px; background:url(Devil.png) no-repeat top left; opacity:.80; filter: alpha(opacity=80); -moz-opacity: 0.8; }

Дополнение от переводчика Здесь мы объявляем два идентификатора: OverlayImage1 и OverlayImage2. Не трудно догадаться, что первый будем использовать для картинки №1, а второй для изображения №2. Для каждого идентификатора я выставляю следующие свойства: position: способ позиционирование элемента. Для нашего примера выставляем absolute, что подразумевает абсолютное позиционирование. При этом типе позиционирования, положение элемента будет определяться свойствами left, top, right и bottom. Left, top: координаты элемента (X, Y). Width, Height: Ширина, высота Background: определяет стиль фона. В нашем случае, фоном будет картинка. В первом случае это angel.png, а во втором devil.png. Свойство no-repeat говорит о том, что фоновое изображение не должно повторяться. Opacity: свойство позволяет задать уровень прозрачности для элемента. filter: определяет набор фильтров, применяемых к элементу. В нашем примере мы

Page 39: VR-Online (April 2010)

используем: alpha (прозрачность) и –moz-opacity (прозрачность). Шаг 2: Подключаем наши стили Стили мы описали, теперь попробуем проверить их в работе. Создайте html страницу, подключите наш CSS-файл и в теле страницы напишите: <div></div> <div></div> Сохраните страницу и попробуйте ее посмотреть. Если вы не забыли создать картинки angel.png и devil.png, то вы увидите, что картинка № 2 (дьявол) наложилась на картинку №1 (ангела). Результат работы моего примера доступен на рисунке ниже.

Page 40: VR-Online (April 2010)

Антонов Игорь aka Spider_NET [email protected]

Delphi. Стеклянный эффект (glass) Делаем стеклянный эффект для консольного приложения В Windows 7/Vista появились прикольные визуальные эффекты. Один из таких – эффект стекла (glass effect). Я не знаю как правильно следует переводить его название на наш великий и могучий, поэтому попробую объяснить на пальцах. Суть эффекта glass в том, что он позволяет сделать окно полупрозрачным. Нет, это не знакомый нам еще с Windows 2000 эффект прозрачности. Glass эффект выглядит по-другому. Применив его к любому окну, ты сможешь видеть все, что расположено позади, но как бы через не очень чистое (пардон) стекло. Приведу небольшой пример. Если мы создадим в каком-нибудь редакторе текстовый документ, запишем в него немного текста, а поверх окна с редактором текста расположим окно с glass эффектом, то получим примерно следующую картинку:

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

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

Page 41: VR-Online (April 2010)

Итак, функция DwmEnableBlurBehindWindow() предназначена для включения эффекта «размытие» для определенного окна. В MSDN функция описана следующим образом: HRESULT DwmEnableBlurBehindWindow( HWND hWnd, __in const DWM_BLURBEHIND *pBlurBehind );

Как и видно, из описания, для работы функции требуется передать всего лишь два параметра: hWND – handle окна к которому мы хотим применить эффект размытия. pBlurBehind [in] – указатель на структуру DWM_BLURBEHIND. Если звезды правильно выстроются в ряд, то функция вернет S_OK, иначе код ошибки в виде HRESULT. С функцией разобрались, теперь посмотрим на то как выглядит упомянутая выше структура DWM_BLURBEHIND. В священных свитках MS она описана так: typedef struct _DWM_BLURBEHIND { DWORD dwFlags; BOOL fEnable; HRGN hRgnBlur; BOOL fTransitionOnMaximized; } DWM_BLURBEHIND, *PDWM_BLURBEHIND;

Для пущего понимания рассмотрим все ее свойства. dwFlags – комбинация флагов DWM Blur Behind Constants. fEnable – Значение «TRUE» в данном свойстве выполняет регистрацию эффекта размытия для окна, а «FALSE» наоборот, снимает. hRgnBlur – отдельный регион окна к которуму должен примениться эффект размытия. Если на регион тебе по фигу, то нужно поставить NIL. fTransitionOnMaximized – TRUE, если раскрашиваемое окно должно переходить в состояние развернутого окна. Иначе FALSE. В структуре нет ничего ужасающего, поэтому я думаю, что трудностей с ее пониманием у тебя не возникло. Раз так, то посмотрим на последний элемент теоретической части – константы DWM Blur Behind Constants. Всего их три: DWM_BB_ENABLE (0x00000001) – указывает значение для fEnable. DWM_BB_BLURREGION (0x00000002) – указывает значение для hRgnBlur DWM_BB_TRANSITIONONMAXIMIZED (0x00000004) – указывает значение для fTransionOnMaximized. Закрепим все примером Скорей запускай Delphi и создавай новый проект типа Console Application (консольное приложение). Сохрани созданный проект и возвращайся к тексту статьи. Первым делом нам предстоит описать в нем рассмотренную выше структуру. Сделать это совсем несложно: type DWM_BLURBEHIND = record

Page 42: VR-Online (April 2010)

dwFlags : DWORD; fEnable : BOOL; hRgnBlur : HRGN; fTransitionOnMaximized : BOOL; end;

Теперь нам точно также опишем функцию DwmEnableBlurBehindWindow. Я уже говорил, что Delphi о ней ни черта не знает. Делается это так: function DwmEnableBlurBehindWindow(hWnd : HWND; const pBlurBehind : DWM_BLURBEHIND) : HRESULT; stdcall; external 'dwmapi.dll' name 'DwmEnableBlurBehindWindow';

function GetConsoleWindow: HWND; stdcall; external kernel32 name 'GetConsoleWindow';

Помимо рассмотренной DwmEnableBlurBehindWindow я еще описал функцию GetConsoleWindow. Мы воспользуемся ей для получения handle нашего окна. Теперь посмотрим на тело функции DWM_EnableBlurBehind, с помощью которой мы и будем активировать glass эффект: function DWM_EnableBlurBehind(hwnd : HWND; AEnable: Boolean; hRgnBlur : HRGN = 0; ATransitionOnMaximized: Boolean = False; AFlags: Cardinal = 1): HRESULT; var pBlurBehind : DWM_BLURBEHIND; begin pBlurBehind.dwFlags:=AFlags; pBlurBehind.fEnable:=AEnable; pBlurBehind.hRgnBlur:=hRgnBlur; pBlurBehind.fTransitionOnMaximized:=ATransitionOnMaximized; Result:=DwmEnableBlurBehindWindow(hwnd, pBlurBehind); end;

Как видишь, в теле функции мы лишь заполняем описанную выше структуру. Описание всех свойств я приводил выше, поэтому повторяться не стану. Результатом функции будет результат функции DwmEnableBlurBehindWindow(). На этом можно считать, что все готово. Юзаем данный код следующим образом: begin try DWM_EnableBlurBehind(GetConsoleWindow(), True); Writeln('See my glass effect'); Writeln('Go Delphi Go'); Readln; except on E:Exception do Writeln(E.Classname, ': ', E.Message); end;

Попробуй протестировать наше небольшое приложение. Мой результат на рисунке ниже.

Page 43: VR-Online (April 2010)

The End. Статья получилось маленькой, но забавной. Думаю, ты придумаешь, как применить вышеизложенные знания в своих проектах. Если ты совсем новичок в Delphi, то знай, что все вышеописанное актуально не только для консольных приложений, но и для приложений с визуальным интерфейсом. Удачных экспериментов! Все возникшие вопросы шли мне на мыло.

Page 44: VR-Online (April 2010)

Антонов Игорь aka Spider_NET [email protected]

Хакерский кодинг на 1С:Предприятии Платформа 1С:Предприятие сегодня установлена в каждой второй организации. Админы влюбились в эту систему за простоту администрирования и легкость развертывания. Программисты пищат от возможности доработки/разработки конфигураций под конкретные нужды. Пользователи в восторге от продуманного и стандартизированного (среди продуктов 1С) интерфейса. А что представляет эта платформа для ][-совместимого чела? Очередной проприетарный продукт или полигон для испытаний? Попробуем в этом разобраться и взглянуть на эту систему глазами Хакера. 1С'ок много всяких есть Я не знаю, имел ли ты опыт работы с платформами 1С:Предприятие, но чтобы мы говорили с тобой на одном языке, рассмотрим вкратце основные понятия. Итак, для начала стоит усвоить, что все платформы 1С:Предприятие условно можно разделить на две большие группы: 7.7, 8.x. Как ты мог догадаться, название групп характеризуют номер версии. Версия 7.7 на сегодняшней день считается самой старой из тех, что стоят на поддержке. Несмотря на старость и отстойность, платформа этой версии не теряет свою популярность и до сих пор многие предприятия юзают именно ее. Причин на это много. Одна из главных — трудность миграции на новые версии. Все особенно усложняется, если в компании используется не типовая конфигурация, а самописное решение. В таких случаях, без отряда программистов не обойтись. Ну да ладно, нас эта проблема мало волнует, нам интересна обратная сторона медали. В платформе 1С:Предприятие есть встроенный язык, посредством которого и выполняется доработка/разработка конфигурации (т.е. программного решения). Так вот, в версии 7.7 этот язык убог и сотворить на нем что-то действительно хакерское - практически нереально. Заметь, я сказал практически. В реале, лазейка все же есть — использовать различные внешние компоненты. Внешняя компонента — это специально разработанная динамическая библиотека, которая может быть подгружена в адресное пространство платформы, а затем, ее функции можно вызывать на встроенном языке. Разработка таких компонент — процесс не шибко сложный и подробненько описан в многочисленных мануалах, которых в инете пруд пруди. В качестве среды разработки таких компонент реально заюзать либо Delphi, либо тот же Visual C++. Рассматривать написание такой компоненты выходит за рамки этой статьи. Почему? Увы, данный способ слишком тяжел в эксплуатации с практической точки зрения. Если в системе твои права обрезаны по самые не хочу, то подсунуть левую DLL вряд ли удастся. К тому же, если в своей библиотеки ты заюзаешь «полезные» WinAPI функции, то 99%, проактивная защита установленного антивируса будет вопить как потерпевшая. В итоге, ничего помаять тебе с этого не удастся, а вот получить по шапке от админов шансы велики. С линейкой платформ версий 8х все совсем иначе. Они обладают богатыми

Page 45: VR-Online (April 2010)

возможностями, а встроенный язык годится не только манипулирования данными и построения отчетов. Не стоит раньше времени облизываться и думать, на платформе 1С:Предприятие 8х можно написать абсолютно любую программу и уж тем более вызывать полезные WinAPI функции. Увы, пока этого сделать нельзя. «Так что же тогда в нем хорошего» - спросишь ты? А я отвечу: большая коллекция готовых к работе объектов. Тут тебе и «классы» для работы с такими вещами как: FTP, HTTP, XML, SMTP, POP3 и т. д. Представляешься, что с их помощью возможно написать? Зачем юзать именно 1С:Предприятие Я понимаю тебя мой друг. Ты кодер и хацкер со стажем. Тебе ничего не стоит взять и написать вирус, троян, сканер портов и другие полезные в хакерском деле программы. Зачем же тебе заморачиваться с каким-то 1С? Отчасти это так, но рано или поздно может возникнуть ситуация, когда кроме 1С:Предприятия, заюзать ничего будет нельзя. Вот тебе типичный пример. Ты устроился на работу админом БД и доблесные системщики урезали твои права по максимуму: ни тебе полноценного инета, ни возможности запуска «не доверенных» приложений и т. д. Зато, в отношении баз и платформы 1С:Предприятие — никаких ограничений. Выполнять бэкапы и по возможности пересылать их на удаленные сервера, управление списком пользователей — типичные задачи администратора баз данных. А вот теперь представь, что большинство недостающих и привычных в жизни вещей, ты сможешь закодить прямо на встроенном в 1С:Предприятие языке! Таким образом, ни что не помешает тебе загробастать бэкап ценной базы данных и благополучно залить его на какой-нибудь сервервак в инете. С чего начинается кодинг под 1С Встроенный язык 1С:Предприятия на внешний вид очень сильно отличается от привычных нам С#, Python, Delphi и т. д. Главное отличие в том, что приходится использовать русский синтаксис. Проблема на первый взгляд не сильно большая, но по первости мозг рвет капитально. К счастью это недоразумение победить возможно. Разработчики платформы 1С:Предприятие не зря получают свои деньги. Они продумали все наперед и снабдили свое детище еще и английским вариантом синтаксиса. Ты можешь юзать любой понравившийся вариант. Мне привычней писать «по-русски», поэтому все листинги в статье будут приведены на великом и могучем. Если тебе по душе традиционный английский вариант — то милости прошу к встроенной документации. В ней описаны все функции/операторы как в английской, так и в русской интерпретации. Основы синтаксиса На сколько мне не изменяет память, в нашем журнале еще ни разу не рассматривали кодинг под 1С:Предприятие, поэтому перед тем как перейти к рассмотрению вопросов разработки реальных приложений нужно обязательно познакомиться с базовым синтаксисом. Изучив основы, ты будешь чувствовать себя среди 1С'ков как рыба в воде. Итак, приступим. Регистр Встроенный язык в 1С:Предприятие не чувствителен к регистру. Ты можешь писать название операторов/переменных хоть большими, хоть малыми буквами. Все будет работать одинаково хорошо.

Page 46: VR-Online (April 2010)

Переменные Как и во многих языках программирования, все переменные ты можешь объявлять по ходу пьесы. Никаких областей типа дельфийского var нет (если не считать ключевого слова «Перем» для объявления глобальных переменных). С типами переменных ситуация аналогичная. Указывать для переменной конкретный тип в момент ее определения — не требуется. Он выбирается на основе содержимого переменной. Рассмотрим пример: СтроковаяПеременная = «Hello, world!»; //Это строковая переменная ЧисловаяПеременная = 0; //А вот это числовая переменная Массив = Новый Массив(); //Ну а это массив

Процедуры, функции В 1С:Предприятии принято делить весь код на процедуры и функции. Определяются они в принципе стандартным образом: //Процедура без параметров Процедура ПримерПроцедуры() КонецПроцедуры

//Процедура с параметрами Процедура ПримерПроцедуры(Параметр1, Параметр2) КонецПроцедуры //Пример функции Функция ПолучитьДиректорию(Параметр1, Параметр2) Возврат Параметр1 + Параметр2; КонецФункции

Циклы Во встроенном языке реализовано несколько видов циклов. По синтаксису они не особо отличаются от оформления аналогичных циклов в других языках программирования. Взгляни на примеры: //Цикл «Пока». Аналогичен циклу while..do в других языках //Пример выведет цифры от 1 до 9 в окно служебных сообщений Счетчик = 1; Пока Счетчик <> 10 Цикл Сообщить(Счетчик); Счетчик = Счетчик +1; КонецЦикла; //Цикл «Для». Аналогичен циклу for..to..do в других языках //Пример выведет цифры от 1 до 10 в окно служебных сообщений Для Счетчик = 1 По 10 Цикл Сообщить(Счетчик); КонецЦикла; //Цикл «Для Каждого». Аналогичен циклу foreach в других языках //Пример демонстрирует перебор массива Массив = Новый Массив(2); Массив[0] = 1; Массив[1] = 2; Для Каждого Запись Из Массив Цикл Сообщить(Запись); КонецЦикла;

Page 47: VR-Online (April 2010)

Условия Без условных операторов далеко не уедешь, внимательно посмотри на то, как они описываются в 1С:Предприятии: //Пример использования конструкции «Если..Тогда..Иначе|ИначеЕсли. //Конструкция аналогична «IF..THEN..ELSE» в других языках. Значение = 5; Если (Значение = 1) Тогда Сообщить("Первое условие"); ИначеЕсли (Значение = 2) Тогда Сообщить("Второе условие"); Иначе Сообщить("Третье условие"); КонецЕсли;

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

FTP-клиент FTP-клиент — софтина очень полезная. Довольствуешься ограниченным доступом к инету, а из приложений лишь MS Office, да оснастки для работы с СУБД? Что же делать, если требуется вывести с рабочего компа полезные файлы (например, бэкапчик корпоративной базы)? Как вариант, можно залить все файлы на свой личный FTP-сервер. Во многих организация, админы серьезно ограничивают доступ к WWW, а такие протоколы как FTP, POP3, SMTP остаются полностью открытыми. На этом и попробуем сыграть. Дело остается за малым — написать FTP-клиент. Да не просто написать, а закодить на языке, совершенно не предназначенном для этой цели. Итак, запускай 1С:Предприятие в режиме «Конфигуратор» и создавай новую обработку. Я не буду тебе расписывать, как работать с самой IDE, т. к. это выходит за рамки статьи.

Page 48: VR-Online (April 2010)

Всю необходимую инфу ты сможешь посмотреть в хелпе. Лучше сразу перейдем к коду. В 1С:Предприятии, для работы с протоколом FTP есть встроенный и полностью готовый к работе класс: FTPСоединение. Класс достаточно хорош и в нем реализованы все необходимые свойства и методы. Тут тебе и поддержка работы через PROXY сервер, и закачка/передача файлов и т. д. Не буду ходить вокруг да около, а сразу перейду к рассмотрению рабочего примера. Код, отвечающий за соединение и отправку произвольного файла приведен в листинге 1. Листинг 1 (FTP-клиент средствами 1С:Предприятия) ИмяПользователя = "Логин”; Пароль = ""; Сервер = "Имя сервера”; КаталогДляЗаписи = "папка для записи”; Попытка FTPСоединение = Новый FTPСоединение(Сервер, , ИмяПользователя, Пароль); FTPСоединение.УстановитьТекущийКаталог( КаталогДляЗаписи); Исключение Сообщить("При попытки соединения с FTP | сервером возникла ошибка!", СтатусСообщения.Важное); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Попытка FTPСоединение.Записать( ЭлементыФормы.пвПутьКФайлу.Значение, ЭлементыФормы.ПолеВвода1.Значение); Исключение Сообщить("Во время передачи файла возникла ошибка!", СтатусСообщения.Важное); Сообщить(ОписаниеОшибки()); КонецПопытки;

Установка соединения по FTP начинается с инициализации класса «FTPСоединение». В качестве параметров, конструктору необходимо передать следующие параметры: - Сервер — адрес FTP-сервера (Обязательный) - Порт — номер порта FTP-сервера (Необязательный) - ИмяПользователя — пользователь на FTP сервере - Пароль - Прокси — объект, содержащий настройки PROXY сервера (Необязательный) - ПассивноеСоединение — Тип соединения (Необязательный) Если все инициализация пройдет успешно, то FTP соединение будет установлено. Ну а после его установки, ты можешь воспользоваться одним из методов класса. Например, в своем примере я вызвал УстановитьТекущийКаталог(). Для демонстрации работоспособности примера, я заюзал метод Записать(). Он выполняет передачу локального файла на FTP сервер. Обрати внимание, вызов каждого метода я взял в блок «Попытка..исключение..КонецПопытки». Если ты знаком с таким понятием как «Иключительные ситуации», то ты должен понять для чего эта конструкция предназначена.

Page 49: VR-Online (April 2010)

Отправляем почту FTP-клиент средствами 1С:Предприятие – это супер, но им одним сыт не будешь. Что не говори, а обойтись без электронной почты крайне трудно. Не отправить никакие важные данные, не по переписываться с герлой-симпотяшкой… Тоска зеленая! Что ж, если возможности юзать полноценный клиент у тебя нет, а из имеющего софта лишь 1С:Предприятие, то считай, что тебе крупно повезло. Закодить на встроенном языке обработку для отправки/приема почты – проще пареной репы. Сейчас ты в этом убедишься.

Листинг 2 (Почтовый клиент) Письмецо = Новый ИнтернетПочтовоеСообщение; Письмецо.Тема = ЭлементыФормы.пвТемаПисьма.Значение; Письмецо.ИмяОтправителя = ЭлементыФормы.пвИмяОтправителя.Значение; Письмецо.Отправитель.Адрес = ЭлементыФормы.пвАдресОтправителя.Значение; Получатель = Письмецо.Получатели.Добавить(); Получатель.Адрес = ЭлементыФормы.пвАдресПолучателя.Значение; ТекстПисьма = Письмецо.Тексты.Добавить(); ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст; ТекстПисьма.Текст = пвТекстСообщения; Если (ЗначениеЗаполнено(ЭлементыФормы.пвАттач.Значение)) Тогда Письмецо.Вложения.Добавить( ЭлементыФормы.пвАттач.Значение); КонецЕсли; //Настраиваем параметры отправки ПрофайлНастроек = Новый ИнтернетПочтовыйПрофиль; ПрофайлНастроек.АдресСервераSMTP = ЭлементыФормы.пвПочтовыйСервер.Значение; ПрофайлНастроек.ПортSMTP = ЭлементыФормы.пвПортПочтовогоСервера.Значение; ПрофайлНастроек.АутентификацияSMTP= СпособSMTPАутентификации.ПоУмолчанию; ПрофайлНастроек.ПользовательSMTP =

Page 50: VR-Online (April 2010)

ЭлементыФормы.пвАдресОтправителя.Значение; Почтовик = Новый ИнтернетПочта; Попытка Почтовик.Подключиться(ПрофайлНастроек); Исключение Сообщить("Во время отправки возникла ошибка! Текст ошибка: " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; //Пробуем отослать Попытка Почтовик.Послать(Письмецо); Сообщить("Ваше сообщение было успешно отправлено!", СтатусСообщения.ОченьВажное); Исключение Сообщить("Сообщение не было отправлено!" + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); КонецПопытки; Почтовик.Отключиться();

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

Page 51: VR-Online (April 2010)

Сформировав письмо, нам остается лишь прилепить на него почтовую марку и отправить по месту назначения. Для выполнения этого действия, я использую второй класс – ИнтернетПочтовыйПрофиль. Если ты внимательно ознакомился со вторым листингом, то должен был уже догадаться, что этот класс, нечто иное, как обертка для хранения настроек соединения с почтовыми серверами. В листинге я привел вариант заполнения свойств для соединения с smtp сервером своего почтового провайдера (через которого будет выполняться отправка). Класс ИнтернетПочтовыйПрофиль лишь хранит настройки для подключения. Ничего отправлять/получать он не может. За саму передачу отвечает третий класс – «ИнтернетПочта». Во время инициализации, ему необходимо передать экземпляр класса «ИнернетПочтовыйПрофиль». После этого, можно выполнять подключение и отправку. Тут тебе методы «Подключиться» и «Послать». Не забывай подобные методы заключать в эксепшины, иначе замучаешься ловить вылеты? Курим трубку, читаем новости Я очень люблю читать RSS ленты различных блоггеров. То и дело в них появляются интересные топики. Обычно для таких целей, я юзаю Google Reader, но на старой работе, мне приходилось пользоваться тулзой своего собственного изготовления. Ну а поскольку, моя прошлая работа была связана с программированием под платформу 1С:Предприятие, то эту самую тулзу мне пришлось сваять на «рабочем» языке. Сама RSS-лента – это ни что иное, как обычный XML файл. Соответственно, работать с ним нужно как с любой XML – т.е. парсить. В одном из номеров нашего журнала, я приводил пример RSS-граббера. Тогда мой пример был на Delphi. Для разбора XML я использовал объект COM-объект Microsoft.XMLHTTP. Ты не поверишь, но в 1С:Предприятии, мы можем воспользоваться этим же объектом. Взгляни на листинг 3 и убедись сам.

Page 52: VR-Online (April 2010)

Листинг 3 (RSS агрегатор)

НазваниеКанала = RSSЛента.selectSingleNode(" //channel/description").Text; Элементы = RSSЛента.selectNodes("//item"); Для сч = 0 по Элементы.length-1 Цикл СчитАтриб = Элементы.item(сч).childNodes; СтруктураАтрибутов = Новый Структура(); Для сч2 = 0 по СчитАтриб.length-1 цикл СтруктураАтрибутов.Вставить (СчитАтриб.item(сч2).nodeName, СчитАтриб.item(сч2).text); КонецЦикла; ЗаголовокНовости = "Заголовок: "; Если (СтруктураАтрибутов.Свойство("title")) Тогда ЗаголовокНовости = ЗаголовокНовости + СтруктураАтрибутов.title; КонецЕсли; ДатаПубликации = "Дата публикации: "; Если (СтруктураАтрибутов.Свойство("pubDate")) Тогда ДатаПубликации = ДатаПубликации + ДатаRFC822(СтруктураАтрибутов.pubDate); КонецЕсли; Линк = "Адрес публикации: "; Если (СтруктураАтрибутов.Свойство("link")) Тогда Линк = Линк + СтруктураАтрибутов.link; КонецЕсли; ТекстНовости = "Текст новости: "; Если (СтруктураАтрибутов.Свойство("description")) Тогда ТекстНовости = ТекстНовости + СтруктураАтрибутов.description; КонецЕсли; Сообщить("--------------------------"); Сообщить(ЗаголовокНовости);

Page 53: VR-Online (April 2010)

Сообщить(ДатаПубликации); Сообщить(Линк); Сообщить(ТекстНовости); Сообщить("--------------------------"); КонецЦикла;

Outro При особом желании и настойчивости, нужные тулзы реально закодить даже на таком, казалось бы не предназначенном для подобных целей, языке как встроенный язык платформы 1С:Предприятие. Главное, не поленись, потратить немного времени и попробуй подойти к решению проблемы творчески. Вполне возможно, что пришедшее на ум спонтанное решение, будет намного лучше, чем, то, которое прорабатывалось долгое время. Пробуй, экспериментируй и все будет ok! Другие полезные примеры http://infostart.ru/public/20144 — ICQ клиент, выполненный в виде внешней компоненты. Внутренности контролла состоят из C# кода и известной в .NET кругах либы – IcqSharp 0.4.0.0. Хочешь чатиться в аське прямо из 1С? Тогда этот пример специально для тебя! http://infostart.ru/public/14457/ - смесь тети Аси и дяди Джаббера. Еще один внешний контрол и пример использования, при помощи которого ты сможешь закодить клиентские части для популярных протоколов передачи сообщений. http://infostart.ru/public/20223/ - здесь тусуется пример реализации «продвинутого» медиа плеера для платформы 1С:Предприятие 8.x. Умеет воспроизводить как видео, так и аудио файлы. Да-да. На 1С’ке реально и такие вещи написать ;-) http://infostart.ru/public/16332/ - это не просто обработка, а настоящая кладезь примеров. Тут тебе и файловый менеджер, и FTP-клиент, и встроенный браузер, и диспетчер задач, и менеджер программ, и куча всякой полезной всячины. Заюзал такую обработку в 1С:Предприятии и забыл про многочисленные тулзы. Разве это не здорово?

Page 54: VR-Online (April 2010)

Антонов Игорь aka Spider_NET 15 РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ ДЛЯ WEB-

РАЗРАБОТЧИКОВ Новичкам в области WEB-разработки применение регулярных выражений может показаться достаточно сложным занятием. Действительно, с «регулярками» не все так просто и на первый взгляд они выглядят абсолютно непонятно. Когда я их увидел в первый раз, то подумал, что составлять их самостоятельно – задача, посильная истинным гуру. Затем, я все же набрался смелости и принялся за их изучение. Оказалось, что в реале регулярные выражения не такие уж страшные.

Как-то раз, бродил я по инету и наткнулся на заметку «15 PHP regular expression for web-developers». В той заметки автор приводил 15 наиболее часто применяемых на практике регулярных выражений. Я подумал, а почему бы не сделать небольшой перевод? Вдруг кому-то и из наших читателей эта информация пригодится. Подумал - и через три месяца сделал J. Результат моего труда ниже.

Синтаксис регулярных выражений

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

1. foo – строка “foo”. Т.е. если у нас есть текст: This is foo, то выражение сработает на foo.

2. ^foo – Строка должна начинаться с “foo”. Например: foo is text. Такая строка удовлетворит регулярному выражению.

3. foo$ – то же самое, что и предыдущее, но применяется для конца строки. Например: what is the foo

4. ^foo$ – когда foo встречается один раз на строку. 5. [abc] – в скобках перечисляются литералы, которые будут соответствовать

выражению. В этом случае a, b, c. 6. [a-z] – любая буква от a-z в нижнем регистре. 7. [^A-Z] – любой символ, который не является заглавной буквой. 8. (gif|jpg) – или gif или jpg. 9. [a-z]+ – одна или больше букв в нижнем регистре. 10. [0-9.-] – любое число, знак тока и знак минус. 11. ̂ [a-zA-Z0-9_]{1,}$ – Любое слово, содержащее минимум одну букву, цифру или

символ нижнего подчеркивания. 12. ([wx])([yz]) – wy, wz, xy или xz. 13. [^A-Za-z0-9] – любой символ (кроме чисел и букв) 14. ([A-Z]{3}|[0-9]{4}) – содержит три буквы или четыре цифры.

PHP функции для работы с регулярными выражениями preg_match() – Функция preg_match() ищет строку соответствующую шаблону. Если соответствие найдено, то результатом будет true, иначе false. preg_match_all() – Функция ищет все вхождения в строку.

Page 55: VR-Online (April 2010)

preg_split() - функция разбивает строку по регулярному выражению. preg_grep() – функция возвращает массив вхождений, которые соответствуют шаблону. preg_ quote() – функция экранирует символы в регулярном выражении. Полезные примерчики 1. Валидность доменного имени

Представленный ниже пример проверяет доменное имя на валидность.

$url = “http://komunitasweb.com/”; if (preg_match(‘/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i’, $url)) { echo “Your url is ok.”; } else { echo “Wrong url.”; }

2. Подсветить слово из текста

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

$text = “Sample sentence from KomunitasWeb, regex has become popular in web programming. Now we learn regex. According to wikipedia, Regular expressions (abbreviated as regex or regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by a regular expression processor”; $text = preg_replace(“/b(regex)b/i”, ‘<span style=”background:#5fc9f6″>1</span>’, $text); echo $text;

3. Подсветка результатов поиска в вашем блоге, построенном на WordPress

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

Откройте файл search.php и найдите в нем функцию the_title(). Замените ее код:

echo $title;

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

<?php $title = get_the_title(); $keys= explode(” “,$s); $title = preg_replace(‘/(‘.implode(‘|’, $keys) .’)/iu’, ‘<strong class=”search-excerpt”></strong>’, $title); ?>

Сохрани внесенные изменения и открой файл style.css и допишите в него следующую строчку:

strong.search-excerpt { background: yellow; }

4. Получить все изображения из HTML документа

Page 56: VR-Online (April 2010)

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

$images = array(); preg_match_all(‘/(img|src)=(“|’)[^"'>]+/i’, $data, $media); unset($data); $data=preg_replace(‘/(img|src)(“|’|=”|=’)(.*)/i’,”$3”’,$media[0]); foreach($data as $url) { $info = pathinfo($url); if (isset($info['extension'])) { if (($info['extension'] == ‘jpg’) || ($info['extension'] == ‘jpeg’) || ($info['extension'] == ‘gif’) || ($info['extension'] == ‘png’)) array_push($images, $url); } }

5. Удалить повторяющиеся слова (не обращая внимания на регистр)

Если часто требуется удалять из текста повторяющиеся слова, то тебе непременно стоит воспользоваться этим способом:

$text = preg_replace(“/s(w+s)1/i”, “$1″, $text);

6. Удалить повторяющиеся знаки пунктуации

Пример выглядит точно так же как и предыдущий (Удаление повторяющихся слов), единственное что меняется – шаблон регепса:

$text = preg_replace(“/.+/i”, “.”, $text);

7. Получить все вхождения XML/HTML тэгов

Приведенная ниже функция принимает два параметра. Первый – желаемый html тэг. Второй – переменная содержащая XML/HTML. Этот пример будет очень полезно использовать в связке с cURL.

function get_tag( $tag, $xml ) { $tag = preg_quote($tag); preg_match_all(‘{<’.$tag.’[^>]*>(.*?)</’.$tag.”>.’}”, $xml, $matches, PREG_PATTERN_ORDER); return $matches[1]; }

8. Получить все вхождения XHTML/XML тэгов, содержащих определенное значение в атрибутах.

Данная функция очень похожа на ту, что я описал в предыдущем примере. Главное отличие в том, что она позволяет получить вхождения тегов, содержащих определенный атрибут. Например: <div id=”header”>.

function get_tag( $attr, $value, $xml, $tag=null ) { if( is_null($tag) ) $tag = ‘\w+’;

Page 57: VR-Online (April 2010)

else $tag = preg_quote($tag); $attr = preg_quote($attr); $value = preg_quote($value); $tag_regex = “/<(“.$tag.”)[^>]*$attr\s*=\s*”. “(['\"])$value\\2[^>]*>(.*?)<\/\\1>/” preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); return $matches[3]; }

9. Шестнадцатеричные значения цветов Приведенный ниже пример демонстрирует поиск вхождений, содержащих цвет в шестнадцатеричном формате.

$string = “#555555″; if (preg_match(‘/^#(?:(?:[a-fd]{3}){1,2})$/i’, $string)) { echo “example 6 successful.”; }

10. Чтение заголовка страницы

В следующем сниппите реализована такая полезная возможность как получение заголовка страницы (содержимое тегов <title></title>).

$fp = fopen(“http://www.catswhocode.com/blog”,”r”); while (!feof($fp) ){ $page .= fgets($fp, 4096); } $titre = eregi(“<title>(.*)</title>”,$page,$regs); echo $regs[1]; fclose($fp);

11. Парсинг логов Apache

Большинство web-сайтов работают под Apache. Ты можешь использовать регулярные выражения для разбора логов этого замечательного web-сервера.

//Logs: Apache web server //Successful hits to HTML files only. Useful for counting the number of page views. ‘^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+”(?:GET|POST|HEAD) ((?#file)/[^ ?"]+?.html?)??((?#parameters)[^ ?"]+)? HTTP/[0-9.]+”s+(?#status code)200s+((?#bytes transferred)[-0-9]+)s+”((?#referrer)[^"]*)”s+”((?#user agent)[^"]*)”$’ //Logs: Apache web server //404 errors only ‘^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+”(?:GET|POST|HEAD) ((?#file)[^ ?"]+)??((?#parameters)[^ ?"]+)? HTTP/[0-9.]+”s+(?#status code)404s+((?#bytes transferred)[-0-9]+)s+”((?#referrer)[^"]*)”s+”((?#user agent)[^"]*)”$’

12. Замена двойных кавычек продвинутыми.

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

preg_replace(‘!B”b([^"x84x93x94rn]+)b”B!’, ‘?1?’, $text);

Page 58: VR-Online (April 2010)

13. Проверка пароля на сложность

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

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

‘A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])[-_a-zA-Z0-9]{6,}z’

14. WordPress: Использование регулярных выражений для получения изображений из поста.

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

<?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <?php $szPostContent = $post->post_content; $szSearchPattern = ‘~<img [^>]* />~’; // Run preg_match_all to grab all the images and save the results in $aPics preg_match_all( $szSearchPattern, $szPostContent, $aPics ); // Check to see if we have at least 1 image $iNumberOfPics = count($aPics[0]); if ( $iNumberOfPics > 0 ) { // Now here you would do whatever you need to do with the images // For this example the images are just displayed for ( $i=0; $i < $iNumberOfPics ; $i++ ) { echo $aPics[0][$i]; }; }; endwhile; endif; ?>

15. Автоматическое генерирование смайлов

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

$texte=’A text with a smiley :-)’; echo str_replace(‘:-)’,'<img src=”smileys/souriant.png”>’,$texte);

Вот и все Надеюсь, информация, приведенная в статье, окажется тебе полезной. Удачи!

Page 59: VR-Online (April 2010)

Антонов Игорь aka Spider_NET Delphi. Tips and Tricks

С сегодняшнего дня я решил начать делать серию постов в стиле «Tips and Tricks». Ключевая тема – программирование в Delphi. По мере возможности, я буду делать небольшие подборки трюков (советов), которые могут помочь тебе в процессе разработки своих проектов. Итак, сегодня у нас пилотный выпуск.

Trick #1: Конвертируем Enum (перечисление) в строку

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

type MyFavoriteColors = (red, blue, green, black, brown);

Теперь представим, что перед нами встала задача получить символьное представление цвета red. Непонятно? Ok, попробую объяснить. Каждый элемент перечисления имеет цифровой индекс. Исходя из этого примера, цвету red будет соответствовать 0 (индексы элементов перечисления начинаются с 0). Зная, что 0 – это красный цвет, как нам вывести слово red? На первый взгляд проще всего сделать это так:

var StrColor:string; IntColor:Integer; begin IntColor := 0; if (IntColor = Integer(MyFavoriteColor.red)) then ShowMessage(‘red’);

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

var StrColor:string; IntColor:Integer; begin IntColor := 2; StrColor := GetEnumName(TypeInfo(MyFavoriteColor), IntColor); ShowMessage(StrColor );

Результатом выполнения этого кода будет диалоговое окно с текстом green. Все просто и быстро.

Page 60: VR-Online (April 2010)

Trick #2: Конвертировать строку в значение элемента перечисления (enum)

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

var StrColor:string; MyColor : MyFavoriteColor; begin StrColor := ‘green’; MyColor := MyFavoriteColor(GetEnumValue(TypeInfo(MyFavoriteColor), StrColor)); if (MyColor = MyFavoriteColor.green) then ShowMessage(‘Yes’);

Page 61: VR-Online (April 2010)

Никита Булай aka Bulka [email protected]

Delphi. KOL’ная диета для дельфийца. Часть 3 Ну что ж, в предыдущих статьях мы рассмотрели основы работы с библиотекой KOL, написали первое функциональное приложение, рассмотрели основы создания обработчиков событий и прочее. Конечно стандартный GUI – это хорошо, но все- же приукрасить его не помешало бы. Например, создать панель инструментов, наделив кнопочки на ней соответствующими пиктограммами. А может и приукрасить форму какими-нибудь изображениями, сделать какой-нибудь задний фон ну или что-нибудь в этом роде. Именно поэтому тема сегодняшней моей статьи – работа с графикой и графическими файлами средствами KOL. Начнем, как всегда с теории, а закончим прикольным примером реализации полученных знаний на практике. Теоретическая часть Поскольку мы пишем наше приложение с помощью KOL в целях уменьшения размера программы, то и наши графические ресурсы так же должны быть маленькими и компактными. Для этого будем использовать формат GIF, но никак не Bitmap. Следовательно, советую обзавестись Photoshop или подобной программой, чтобы в дальнейшем быстро и удобно конвертировать ваши картинки в нужный формат. Теперь разберемся с объектами, предназначенными для обработки изображений. Основным объектом, который используется для работы с графикой в KOL, является PBitmap. Все остальные, позволяющие работать с другими форматами изображений, так или иначе основываются на нем. Конструктор объекта PBitmap можно вызвать с помощью функции: function NewBitmap( W, H: Integer ): PBitmap;

W и H, как вы наверное уже догадались, задают размеры нового изображения. Все свойства PBitmap аналогичны своему аналогу из VCL – TBimap. Тут так же поддерживается канва (Canvas), базовые функции рисования, загрузка и сохранение изображений из файлов и потоков. Вообще любой контрол из библиотеки KOL, имеющий свойство Canvas, поддерживает базовые графические операции. Еще в PBitmap присутствуют дополнительные крайне полезные функции вроде поворота изображений или отражения по вертикали/горизонтали. Для поддержки других графических форматов, например JPEG или GIF, потребуется подключить дополнительные модули (JpegObj и KolGif соответственно). Если же и этого мало, то советую скачать «пакет» KOLGraphic. С его помощью можно оперировать с форматами вроде *.pcx; *.dcx, *.pcc; *.scr, *.png, *.bw, *.rgb, *.rgba, *.sgi, *.tif, *.tiff и кучей других. Но поскольку я рассматриваю основы работы с графикой, то касаться данного пакета я не буду – вы всегда можете это сделать сами, скачав его с официально сайта (http://kolmck.net/Components/graphics/KOLGraphic.zip). Хорошо, допустим, картинку мы загрузили. Теперь надо бы ее где-то отрисовать. Для

Page 62: VR-Online (April 2010)

этого я использую компонент PaintBox, конструктор которого выглядит следующим образом: function NewPaintbox( AParent: PControl ): PControl;

В принципе, рисовать можно на любом контроле, имеющим свойство «Canvas». Для того, чтобы изображение появилось на PaintBox, нужно указать процедуру, обрабатывающую событие OnPaint. Заголовок процедуры должен быть следующим: procedure Proc_Name (Dummy: Pointer; Sender: PControl; DC: HDC );

Рисование происходит с помощью функции Draw (или ей схожих- вроде StretchDraw, DrawTransparent или StretchDrawTransparent). Рассмотрим все это дело на примере. Создадим новый проект, очистим его от форм и лишнего кода в .dpr файле проекта. Опишем несколько переменных: var MainForm, PBox: PControl; ImgContainer: pBitmap; mainMenu: PMenu; OpenDialog : POpenSaveDialog;

MainForm – наша главная форма, PBox – PaintBox, где будет выводится изображение, ImgContainer – контейнер для изображения, обычный TBitmap. mainMenu – меню программы, OpenDialog – диалог для выбора графического файла. Теперь закодим создание формы: MainForm:=NewForm(Applet,'Simple test').SetSize(650,600); MainForm.CenterOnParent; MainForm.Font.FontName := 'MS Sans Serif'; MainForm.Font.FontHeight := 9; Функция CenterOnParent размещает нашу форму в середине экрана. Заодно сразу настроим шрифт приложения, чтобы он не был стандартным. Все компоненты, которые будут созданы на форму, по дефолту примут шрифт формы-родителя (только если вы вручную не поменяете его). Теперь инициализируем контейнер для изображения и создадим меню и его обработчик: ImgContainer:= NewBitmap(0,0); // Создадим меню mainMenu := NewMenu(MainForm,0, // Заполним пункты [ '&Файл', '(', '&Открыть картинку', '-', '&Выход', ')'], // Обработчик нажатия пунктов меню TOnMenuItem( MakeMethod(nil, @ProcessMenu )));

В нашем простом примере в меню будет только два пункта: «Открыть картинку» и «Выход». Обработчиком нажатий пунктов меню будет процедура ProcessMenu. Код ее выглядит следующим образом: procedure ProcessMenu(P: Pointer; Sender:PMenu; Item:Integer); begin case Item of 1: OpenPicture; 3: Applet.Close;

Page 63: VR-Online (April 2010)

end; end;

В принципе ничего сложного. Весь код почти идентичен тому, что я писал в предыдущих статьях. Как видите, пункт 1 вызывает выполнение процедуры OpenPicture, которая открывает изображение. Опишем тело это процедуры: procedure OpenPicture; begin if OpenDialog = nil then OpenDialog := NewOpenSaveDialog('Открыть рисунок','',[]); OpenDialog.Filter:='Bitmap Pictures|*.bmp'; if OpenDialog.Execute then begin LoadPicture(OpenDialog.Filename); end; end;

Изначально проверяем, не был ли создан объект OpenDialog ранее. Если нет, то вызываем его конструктор, и настраиваем фильтры. В нашем случае будем загружать только картинки BITMAP формата. После если диалог выбора файла был запущен, произведен вызов процедуры LoadPicture, передав ей имя выбранного файла. Код функции выглядит так: procedure LoadPicture(const FName: String); begin if FileExists(FName) then begin ImgContainer.LoadFromFile(FName); PBox.Width := ImgContainer.Width; PBox.Height:= ImgContainer.Height; Applet.ClientWidth:=Bitmap.Width + Applet.Border * 2; Applet.ClientHeight:=Bitmap.Height + Applet.Border * 2;end; ImgContainer.Draw(PBox.Canvas.Handle, 0, 0); end; end;

Поясню немного код. Как и обычный TBimap, PBitmap может загружать изображения из файлов, потоков и ресурсов. Мы воспользуемся первым способом. Далее настроим размеры PaintBox и главной формы под размеры загруженной в ImgContainer картинки. И функцией Draw отрисуем изображение в PaintBox. Теперь вернемся к основному телу программы. После создания меню, надо бы и сам PaintBox создать, на который выводятся изображения. Как его создавать ты уже должен знать, если не пропустил теоретическую часть моей статьи: // Объект, на котором будут рисоваться изображения PBox := NewPaintBox(MainForm); PBox.SetSize(1,1); PBox.OnPaint := TOnPaint( MakeMethod( nil, @ProcessImage ) );

Обработчиком OnPaint я назначил процедуру ProcessImage. Она производит перерисовку картинки на компоненте, а код ее выглядит следующим образом: procedure ProcessImage(Sender: PControl; DC: HDC ); begin ImgContainer.Draw(PBox.Canvas.Handle,0,0); end;

Ну вот основной код написан, осталось произвести запуск нашего приложения, для чего напишем последней строчкой в основном теле приложения Run(MainForm). Компилируем проект и запускаем. У меня получилось вот так:

Page 64: VR-Online (April 2010)

Что ж, вполне неплохо. Ради интереса посмотрим на размер компилированного проекта: 35 Кб! Отлично, теперь можно попробовать обработать GIF изображения. Не Bitmap-ом едины! Кстати говоря, KOL поддерживает как обычные, так и анимированные GIF изображения. Для их поддержки требуется скачать модуль KOLGif (http://kolmck.net/Components/graphics/kolgif.zip). Распаковываем архив куда-нибудь и подключаем KOLGif.pas к нашему проекту, который мы рассмотрели и написали чуть выше. Конструктор GIF изображения выглядит следующим образом: function NewGif: PGif;

В данном случае PGif – это и есть объект, который хранит GIF изображение. Именно такой тип задается переменной, из которой в последствии будем загружать картинку. Так же есть еще один способ хранения GIF – это использовать PGifDecoder. Данный тип используется основным PGif как контейнер для данных. Однако мы можем им воспользоваться в целях экономии размера готовой программы, не нагружая ее дополнительными функциями из PGif. Разница получается не особо весомая – 5 Кб, но для тех, кому размер крайне важен, и такой размер может сыграть значительную роль. Тем более, что цель программирования в Delphi с использованием KOL – это уменьшение размера бинарника. Конструктор PGifDecoder выглядит, как и все конструкторы, в KOL так:

Page 65: VR-Online (April 2010)

function NewGifDecoder: PGifDecoder;

Он также поддерживает загрузку изображений из файлов, потоков и ресурсов. Однако вызвать функцию Draw в нем так просто не получится. Для этого надо обратиться к свойству Bitmap, а от него к процедуре Draw. То есть у нас получится следующий код, рисующий на канве контрола (у нас это PaintBox): G:= NewGifDecoder; G.LoadFromFile(‘Test.gif’); G.Bitmap.Draw(PaintBox.Canvas.Handle, 0, 0);

Все в принципе просто и не должно вызывать трудностей. Попробуем немного изменить текст нашей прошлой программы, добавив в нее поддержку GIF изображений. Для этого требуется: 1. Добавить переменную GIF типа PGif и Ext типа String 2. Вызвать конструктор для данной переменной в основном теле программы 3. Добавить код рисования GIF изображения на PaintBox

Итак, следуя нашему плану, добавляем переменную: var … GIF: PGif; Ext: String; …

Затем вызовем конструктор NewGif для переменной GIF после такого же конструктора, но только для Bitmap: ... GIF:= NewGif; ...

Конечно, надо не забыть добавить в фильтры OpenDialog расширение *.gif, иначе весь наш труд коту под хвост. Далее надо подкорректировать код процедуры LoadPicture, добавив туда обработку GIF изображений. В связи с тем, что у нас для картинок две разные переменные, то и определять, какого формата изображение выбрал пользователь, придется нам самим. Для этого само просто – это сравнивать расширение открытого файла. Если это “.gif” – вызываем функцию Draw для переменной Gif, если “.bmp” – то для переменной Bitmap. Выглядит это следующим образом: procedure LoadPicture(const FName: String); begin Ext:=ExtractFileExt(FName); if FileExists(FName) then begin if AnsiUpperCase(Ext)='.GIF' then begin GIF.LoadFromFile(FName); PBox.Width := GIF.Width; PBox.Height:= GIF.Height; GIF.Draw(PBox.Canvas.Handle, 0, 0); end else begin Bitmap.LoadFromFile(FName); PBox.Width := Bitmap.Width; PBox.Height:= Bitmap.Height; Bitmap.Draw(PBox.Canvas.Handle, 0, 0); end; Applet.ClientWidth:=PBox.Width + Applet.Border * 2; Applet.ClientHeight:=PBox.Height + Applet.Border * 2; end; end;

Page 66: VR-Online (April 2010)

Если Вы заметили, что переменная Ext – глобальная. И она постоянно хранит расширение последнего выбранного в OpenDialog файла. Данная переменная так же помогает в отрисовке изображения на контроле, так как в процедуре ProcessImage – обработчике OnPaint для PaintBox – вызывается функция Draw для определенной переменной. Идея корректировки данной процедуры такая же, как и у LoadPicture: procedure ProcessImage(Sender: PControl; DC: HDC ); begin if AnsiUpperCase(Ext)='.GIF' then GIF.Draw(PBox.Canvas.Handle,0,0) else Bitmap.Draw(PBox.Canvas.Handle,0,0) end;

Ну вот и все, немного «моддинга» и наше приложение поддерживает GIF изображения! Компилируем проект и получаем программку размером 50 Кб. Окно ее выглядит так же, как и в прошлом примере, потому я не буду делать его скриншот – поменялась только «начинка» нашего приложения. Добавить поддержку других форматов вам и самим не составит труда, тем более что мы изучили основы работы с двумя графическими файлами. Работа с остальными организуется точно таким же образом, поэтому в освоении данного материала моя помощь не потребуется. А сейчас можно приступить к обещанному мною ранее: теперь займемся написание нормального, функционального приложения. А по ходу изучим еще и несколько отличных, полезных функций, которые могут пригодиться при разработке глобального проекта. А писать мы будем замену ACDSee =). Да-да, именно программу для просмотра и манипуляции с графическими файлами – ведь это напрямую касается темы моей сегодняшней статьи. Что зря время терять, приступим! VR Image Viewer Наша программа будем обладать многими полезными фишками, которыми наделены большинство программ для просмотра изображений. Это: 1. Открытие изображений и вывод на экран 2. Сохранение изображений 3. Копирование/вырезание/удаление графических файлов 4. Навигация по папке с изображениями 5. Функции поворота изображения 6. Вывод информации об изображении 7. Я не стал нагружать приложение поддержкой кучи разных графических форматов - это будет ваше домашнее задание. Поэтому все манипуляции будут проходить над Bitmap картинками. Создадим новый проект. Удалим все ненужные формы, оставим лишь .dpr файл проекта. Уберем весь код между begin и end. Из подключенных модулей оставим лишь Windows и KOL. Более нам ничего не потребуется. Теперь объявим нужные переменные: var MainForm, PBox, TB, SBox: PControl; ParamString :string;

Page 67: VR-Online (April 2010)

i: integer; Num: Integer = 0; ImgContainer: PBitmap; mainMenu: PMenu; OpenDialog : POpenSaveDialog; OpenDirDialog : POpenDirDialog; ImageList: PStrList;

Немного пробежимся по ним. Ну, MainForm понятно – главная форма приложения. PBox – это компонент PaintBox, на нем будет отрисовываться открытое изображение. TB – это ToolBar, наша панель инструментов. SBox – ScrollBox, используется для полноценного просмотра изображений, больших по размеру, чем форма. ParamString будет хранить полное имя переданного в командной строке файла. I выступает за счетчик. Num – хранит номер открытого в данный момент изображения. ImgContainer – картинка формата Bitmap, сюда будет загружаться изображение. mainMenu – это меню нашей программы. OpenDialog – обычный диалог открытия/сохранения файла. OpenDirDialog – это диалог выбора папки. И, наконец, ImageList – аналог TStringList из VCL. В данном списке будет храниться список изображений определенной папки. Почему я решил делать именно так, а не через динамический массив? Целью было показать некоторые другие возможности библиотеки KOL, которые могут в будущем пригодиться при разработке программы. Следующим шагов будет объявление констант, которые пригодятся по ходу программирования: const B_FIRST = 0; B_PREVIOUS = 1; B_NEXT = 2; B_LAST = 3; const ABOUT_INFO = 'VR Image Viewer 0.1'#13#13'Coded by BULKA, 2010'+ #13#13'-= Delphi with KOL =-'#13#13'http://vr-online.ru'+ #13'http://bulaj.ru';

Константы из первого блока отвечают за навигацию по списку изображений (ImageList). B_FIRST дает понять, что программа должна открыть первое в списке изображение, B_PREVIOUS – предыдущее по списку изображение (определяется через значение переменной Num), B_NEXT – следующее, а B_LAST – последнее в списке. Константа ABOUT_INFO пригодится при вызове пункта меню «О программе». Более манипулировать с различными переменными и константами мы не будем. Далее пойдет код функций и процедур, выполняющих все описанные выше задачи. Но к ним будем обращаться по ходу, а начнем, как обычно, с основного кода программы. Прежде всего, создадим форму приложения: begin MainForm:=NewForm(Applet,'VR Image Viewer 0.1 by Bulka').SetSize(650,600); MainForm.CenterOnParent; MainForm.Font.FontName := 'MS Sans Serif'; MainForm.Font.FontHeight := 9; Ок, создали, теперь настроим панель статуса. В ней будет отображаться различная информация об открытом изображении: MainForm.StatusText[0]:='No images loaded'; MainForm.StatusText[1]:='0 kb'; MainForm.StatusText[2]:='0x0'; MainForm.StatusText[3]:='0/0';

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

Page 68: VR-Online (April 2010)

mainMenu := NewMenu(MainForm,0, // Заполним пункты [ '&Файл', '(', '&Очистить экран', 'Открыть'#9'Ctrl+O', 'Сохранить как..'#9'Ctrl+S', '-', '&Выход', ')', 'Правка', '(', 'Повернуть по часовой'#9'Ctrl+R', 'Повернуть против часовой'#9'Ctrl+L', '-', 'Вырезать файл...'#9'Ctrl+X', 'Копировать файл...'#9'Ctrl+C', 'Удалить файл'#9'Del', ')', 'Просмотр', '(', 'Вперед'#9'Right', 'Назад'#9'Left', ')', '&Помощь', '(', 'О проге', ')' ], // Обработчик нажатия пунктов меню TOnMenuItem( MakeMethod(nil, @ProcessMenu )));

Все эти функции Вы уже должны знать из предыдущих моих статей, тут ничего нового. Инициализировали меню, заполнили его, присвоили обработчик пунктов меню. Однако в этот раз, если вы заметили, возле некоторых пунктов меню присутствует дополнение вроде #9'Ctrl+C' и подобного. Все верно, в этой статье я покажу, как добавить горячую клавишу к определенному пункту меню. Это делается функцией MakeAccelerator: function MakeAccelerator( fVirt: Byte; Key: Word ): TMenuAccelerator;

Первым параметром передается код виртуальной клавиши, вторым – код обычной клавиши на клавиатуре. В результате функция возвращает запись (record) TmenuAccelerator, где хранится все эта информация. Относительно меню, мы будем применять вызов данной функции для задания параметра ItemAccelerator у любого пункта меню. Делается это следующим образом: MainMenu.ItemAccelerator[2]:= MakeAccelerator(FCONTROL or FVIRTKEY, Word('O')); MainMenu.ItemAccelerator[3]:= MakeAccelerator(FCONTROL or FVIRTKEY, Word('S')); MainMenu.ItemAccelerator[7]:= MakeAccelerator(FCONTROL or FVIRTKEY, Word('R')); MainMenu.ItemAccelerator[8]:= MakeAccelerator(FCONTROL or FVIRTKEY, Word('L')); MainMenu.ItemAccelerator[10]:= MakeAccelerator(FCONTROL or FVIRTKEY, Word('X')); MainMenu.ItemAccelerator[11]:= MakeAccelerator(FCONTROL or FVIRTKEY, Word('C')); MainMenu.ItemAccelerator[12]:= MakeAccelerator(FVIRTKEY, VK_DELETE); MainMenu.ItemAccelerator[14]:= MakeAccelerator(FVIRTKEY, VK_RIGHT); MainMenu.ItemAccelerator[15]:= MakeAccelerator(FVIRTKEY, VK_LEFT);

В квадратных скобочках мы указываем номер пункта меню, которому задаем горячую клавишу. Если посмотреть на код создания меню, можно увидеть, что пункту «Открыть» присвоено сочетание Ctrl (FCONTROL) + O (Word('O')). Таким же образом задаются горячие клавиши и для других пунктов меню. Далее в коде создадим «контейнер» для картинок и список, где будут храниться их полные имена: ImgContainer := NewBitmap(0, 0); // Создадим список файлов определенного каталога ImageList:= NewStrList;

Page 69: VR-Online (April 2010)

Затем следует создать панель инструментов. Если Вы помните, то это переменная TB. Конструктор панели инструментов выглядит следующим образом: function NewToolbar( AParent: PControl; Align: TControlAlign; Options: TToolbarOptions; Bitmap: HBitmap; const Buttons: array of PKOLChar; const BtnImgIdxArray: array of Integer ) : PControl;

Пройдемся по параметрам по порядку. Aparent – это контрол-родитель, на котором будет размещена панель. Align – расположение панели, например по верху (caTop), по правой части контрола (caRight) или по нему всему (caClient). Параметр Options задает дополнительные параметры настройки панели. Это может быть прозрачность (tboTransparent), расположение текста на кнопках (tboTextRight или tboTextBottom), вид панели (tboFlat) и прочее. Bitmap – это изображение, из которого будут браться картинки для кнопок на панели инструментов. Константа Buttons создает кнопки и разделители. В зависимости от текста, будет создана просто кнопка (‘’), кнопка с текстом (‘xxx’)или разделитель (‘-‘). Константа BtnImgIdxArray задает для созданных ранее через Buttons кнопок номера изображений, которые берутся из параметра Bitmap, если он указан. Если на панели присутствуют разделители, то для них стоит указывать параметр -1. Ну вот и все. Теперь посмотрим на код создания нашей панели инструментов: TB := NewToolbar(MainForm, caNone, [tboFlat], CreateMappedBitmap( hInstance, 111, 0, nil, 0 ), [ '', '-', '', '', '-', '','','', '-', '', '', '', '', '-', '', '', '-', ''], [ 0, -1, 1, 2, -1, 3,4,5,-1, 6,7, 8, 9, -1, 10, 11, -1, 12] ).SetAlign(caTop); TB.DoubleBuffered := True; // Присовим пунктам подсказки TB.TBSetTooltips( TB.TBIndex2Item(0), [ 'Clear','', 'Open', 'Save', '', 'Cut', 'Copy','Delete', '', 'To first', 'Previous','Next', 'To last', '', 'Rotate left', 'Rotate right', '', 'About' ] ); TB.OnClick := TOnEvent(MakeMethod(nil, @TBClick));

Функцией CreateMappedBitmap мы загрузили из ресурсов программы (hInstance) изображение под именем 111. В нем нарисованы изображения для кнопочек. Оно взято из файла Toolbar.bmp, который лежит в папке "VR Image Viewer". Для того, чтобы добавить картинку в ресурсы программы, я создал .RC файл, прописал в нем имя ресурса (111), тип ресурса (BITMAP) и путь к файлу с изображением. Затем подключил данный файл к проекту. Функция TBSetTooltips задает подсказки для кнопок на панели. В качестве первого параметра я указал TB.TBIndex2Item(0), чем показал функции, с какого номера начинать вставлять подсказки (в моем случае это первая кнопка, индекс равен 0). Обработчиком нажатий кнопок на панели является функция TBClick. Ее код я опишу позже, когда завершим основное тело программы. Итак, следующим нашим шагом будет создание ScrollBox и «холста» для рисования изображения (PaintBox). Сделаем это, вызвав конструкторы NewScrollBoxEx и NewPaintBox: SBox := NewScrollBoxEx(MainForm,esRaised).SetAlign(caClient); // Объект, на котором будут рисоваться изображения PBox := NewPaintBox(SBox); PBox.SetSize(1,1);

Page 70: VR-Online (April 2010)

PBox.OnPaint := TOnPaint( MakeMethod( nil, @ProcessImage ) ); PBox.Transparent:= True;

Почему я вызвал для переменной SBox конструктор NewScrollBoxEx, а не NewScrollBox, как это делаю обычно? Смысл данного действия прост – в обычном конструкторе надо задавать полосы прокрутки, а в Extended (отсюда и приставка Ex) они создается автоматически, если требуется. Обработчика переменной SBox нам не надо присваивать, а вот для PaintBox мы укажем процедуру ProcessImage, которая будет рисовать на контроле изображение из ImgContainer. И последний штрих – обработка параметров командной строки при запуске программы: // Если программе передано изображение, загрузим if (ParamCount > 0) then begin ParamString:=ParamStr(1); for i:=2 to ParamCount do begin ParamString:=ParamString+' '+ParamStr(i); end; if ParamString<>'' then begin ScanForFiles(ExtractFilePath(ParamString)); DrawPicture (ParamString); Num:=ImageList.IndexOf(ParamString); ShowCurrentImageNumber; end; end; Run(MainForm);

Ну вот и все, основное тело приложения полностью готово. Немного поясню последние действия. При запуске программы проверяется, есть ли переданные параметры (ParamCount). Если есть, то начинаем собирать полный путь к файлу в цикле, так как пробел разделяет строку на несколько частей. В итоге полный путь к файлу записан в переменной ParamString. Далее происходит сканирование каталога на наличие изображений при помощи процедуры ScanForFiles. После вызываем процедуру DrawPicture, которая рисует на PaintBox картинку. При этом в переменную Num записывается номер данного изображения по счету из списка ImageList. И, вызывая процедуру ShowCurrentImageNumber, указываем в панели статуса номер открытой картинки. Что ж, теперь приступим к написанию основных процедур и функций программы. Вот их список: 1) Slash 2) ProcessImage 3) ShowCurrentImageNumber 4) Rotate 5) DrawPicture 6) ScanForFiles 7) OpenPicture 8) SavePicture 9) ClearPicture 10) DeletePicture 11) CopyMovePicture 12) ProcessNavigation 13) ProcessMenu 14) TBClick

Page 71: VR-Online (April 2010)

Не много, не мало :). Напишем код для каждой из вышеуказанных функций и процедур, и походу разберемся, что они делают. Первой в нашем списке идет функция Slash, которая проверяет путь на наличие в конце «слеша». Если его нет, то он дописывается. Код функции выглядит следующим образом: function Slash(const Path: String): String; begin if Path[Length(Path)-1] <> '\' then Result := Path + '\' else Result := Path; end;

Далее опишем процедуру ProcessImage. Она, как я ранее отмечал, является обработчиком события OnPaint контрола PaintBox. В коде процедуры происходит отрисовка изображения на компоненте: procedure ProcessImage(Sender: PControl; DC: HDC ); begin ImgContainer.Draw(PBox.Canvas.Handle,0,0) end;

Теперь идет черед процедуры ShowCurrentImageNumber. Ее назначение я так же описывал выше – она выводит на панели статуса номер отображаемого на данный момент изображения в PaintBox. Код процедуры крайне компактный и выглядит так: procedure ShowCurrentImageNumber; begin MainForm.StatusText[3]:=PChar(Int2Str(Num+1)+'/'+Int2Str(ImageList.Count)); end;

Следующая процедура – Rotate. Согласно функционалу нашего приложения, оно должно уметь поворачивать изображение. Именно этим занимается эта процедура. Для поворота картинки формата Bitmap в библиотеке KOL специально предусмотрены несколько функций: 1. RotateRight / RotateLeft 2. RotateRightMono / RotateLeftMono 3. RotateRight4bit / RotateLeft4bit (8, 16 bit) 4. RotateLeftTrueColor / RotateRightTrueColor Думаю, пояснять их не стоит, сами названия говорят за себя. Мы воспользуемся универсальными, то есть RotateRight и RotateLeft. Код процедуры выглядит так: procedure Rotate(Left: Boolean); var Tmp: Integer; begin if Left then begin Tmp:= PBox.Width; PBox.Width:= PBox.Height; PBox.Height:= Tmp; ImgContainer.RotateRight; ImgContainer.Draw(PBox.Canvas.Handle,0,0); end else begin Tmp:= PBox.Width; PBox.Width:= PBox.Height; PBox.Height:= Tmp; ImgContainer.RotateLeft; ImgContainer.Draw(PBox.Canvas.Handle,0,0); end; end;

Page 72: VR-Online (April 2010)

Думаю, вы заметили, что процедуре передается параметр Left типа Boolean. Из кода видно, что если он установлен как true, то картинка поворачивается против часовой стрелки, а если false – по часовой. Для того чтобы изображение не обрезалось по краям при повороте, я меняю размеры PaintBox. Следующая процедура – DrawImage. Она встречается довольно часто. Назначение – отрисовывать изображение на PaintBox и выводить в панели статуса информацию о нем. Код процедуры выглядит следующим образом: procedure DrawPicture(const FName: String); var InfoStr: String; begin if FileExists(FName) then begin ImgContainer.LoadFromFile(FName); PBox.Width := ImgContainer.Width; PBox.Height:= ImgContainer.Height; InfoStr:= Int2Str(PBox.Width)+'x'+Int2Str(PBox.Height); InfoStr:= InfoStr + ' (' + Int2Str(ImgContainer.BitsPerPixel) + ' bit)'; MainForm.StatusText[0]:=PChar(ExtractFileName(FName)); MainForm.StatusText[1]:= PChar(Int2Str(FileSize(FName)) + ' bytes'); MainForm.StatusText[2]:=PChar(InfoStr); ImgContainer.Draw(PBox.Canvas.Handle, 0, 0); end; end;

Итак, для начала проверяем, не был ли удален файл и вообще существует ли он. Если все окей, то загружаем его в ImgContainer. Далее настраиваем размеры PaintBox под размеры открытой картинки. Формируем информацию о размере изображения и кол-ва битов на пиксель, записывая ее в переменную InfoStr. Функция Int2Str позволяет (аналогично функции IntToStr из SysUtils.pas) конвертировать число в строку. Далее выводим всю информацию на панель статуса (имя файла, его размер, информацию по размеру картинки). И, наконец, рисуем само изображение. Теперь рассмотрим код процедуры ScanForFiles. Из названия должно быть понятно, что она занимается поиском файлов. Причем в определенном каталоге, который передается параметром Path. Для этого воспользуемся функциями FindFirstFile, FindNextFile и FindClose, которые являются аналогами функций FindFirst, FindNext и FindClose из SysUtils.pas. Информация о найденном файле будет храниться в переменной FindData типа TWin32FindData. Если файл найден, то добавляем его полное имя (FindData.cFileName) в наш список изображений (ImageList). Поиск файлов будет осуществляться до тех пор, пока переменная FileEx типа Boolean, в результате выполнения функции FindNextFile, не станет равна False. На деле все выглядит таким образом: procedure ScanForFiles(Path: String); var S: String; FileEx: Boolean; FindHandle : THandle; FindData : TWin32FindData; begin FileEx:=True; FindData.dwFileAttributes := FILE_ATTRIBUTE_NORMAL; FindHandle := FindFirstFile(PChar(Slash(Path)+'*.bmp'), FindData); if FindHandle <> INVALID_HANDLE_VALUE then begin while FileEx do begin S:=FindData.cFileName; ImageList.Add(Path+S); FileEx:=FindNextFile(FindHandle,FindData); end;

Page 73: VR-Online (April 2010)

end; FindClose(FindHandle); Num:=0; end;

Как я и говорил, наша программа будет искать только картинки с расширением .bmp. Но вы сами всегда можете расширить эту опцию. Теперь опишем процедуру OpenPicture. Она производит отображение диалога открытия файлов, вызов процедур ScanForFiles, DrawPicture и ShowCurrentImageNumber. Код ее приведен ниже: procedure OpenPicture; begin if OpenDialog = nil then OpenDialog := NewOpenSaveDialog('Открыть рисунок','',[]); OpenDialog.Filter:='Bitmap Pictures|*.bmp'; if OpenDialog.Execute then begin ImageList.Clear; ScanForFiles(ExtractFilePath(OpenDialog.Filename)); Num:= ImageList.IndexOf(OpenDialog.Filename); DrawPicture(OpenDialog.Filename); ShowCurrentImageNumber; end; Free_And_Nil(OpenDialog); end;

Изначально проверяем, был ли ранее создан наш «диалог». Если нет, то вызываем конструктор NewOpenSaveDialog. В качестве фильтра задаем Bitmap картинки. Далее вызываем отображение диалога. Если пользователь не нажал кнопку «Отмена», то производим очистку списка картинок (ImageList), сканирование каталога с выбранным файлом на наличие еще картинок (ScanForFiles(ExtractFilePath(OpenDialog.Filename))), после чего рисуем картинку на PaintBox (DrawPicture). По завершению всех действий освобождаем объект и подчищаем за ним память процедурой Free_And_Nil. Она может быть использована с этими же целями для любого объекта библиотеки KOL. Код процедуры SavePicture почти идентичен вышеописанной процедуре. Только вместо сканирования каталога и загрузки изображения мы производим сохранение картинки из ImgContainer в файл, указанный в SaveDialog. Код данный процедуры выглядит следующим образом: procedure SavePicture; begin if OpenDialog = nil then OpenDialog := NewOpenSaveDialog('Сохранить рисунок', '', [OSOverwritePrompt]); OpenDialog.Filter:='Bitmap Pictures|*.bmp'; OpenDialog.OpenDialog:= False; if OpenDialog.Execute then begin ImgContainer.SaveToFile(OpenDialog.Filename); end; Free_And_Nil(OpenDialog); end;

Следующая процедура – ClearPicture. Она производит очистку экрана от картинки. Для этого вызываем процедуру Clear объекта PBitmap (в нашем случае это переменная ImgContainer), после чего производим перерисовку изображения на PaintBox изменение его размера: procedure ClearPicture; begin ImgContainer.Clear;

Page 74: VR-Online (April 2010)

ImgContainer.Draw(PBox.Canvas.Handle,0,0); PBox.SetSize(1,1) end;

Следующей в нашем списке идет процедура DeletePicture. Она производит удаление файла открытой в данный момент картинки в корзину. Вообще, для этой цели в KOL присутствует функция DeleteFile2Recycle. Но я не стал ее использовать ввиду того, что она не делает запроса на подтверждение об удалении, что не хорошо. Потому я решил воспользоваться функцией DoFileOp: function DoFileOp( const FromList, ToList: KOLString; FileOp: UINT; Flags: Word; Title: PKOLChar): Boolean;

Данная функция универсальна: она позволяет копировать (FileOp = FO_COPY), перемещать (FileOp = FO_MOVE), переименовывать (FileOp = FO_RENAME) или удалять (FileOp = FO_DELETE) файлы (FromList и ToList). Поскольку я удаляю файл в корзину, то вторым параметром (ToList) будет пустая строка, а параметр FileOp будет равен FO_DELETE. В качестве флагов я укажу FOF_ALLOWUNDO (чтобы можно было отменить операцию) и FOF_SIMPLEPROGRESS (не показывать имена удаляемых файлов). После удаления файла следует убрать его и из нашего списка, так как он более не присутствует в каталоге. Выполним это процедурой Delete объекта PstrList, указав номер открытого изображения, который всегда хранится в переменной Num. И, наконец, чтобы на экране не оставалось удаленное изображение, откроем первую картинку из списка, выполним процедуру ProcessNavigation с параметром B_FIRST. Код процедуры DeletePicture выглядит следующим образом: procedure DeletePicture; begin if ImageList.Count < 1 then Exit; if DoFileOp(ImageList.Items[Num], '', $0003, $0040 or $0100, 'Deleting...' ) then begin ImageList.Delete(Num); ProcessNavigation(B_FIRST); end; end;

Далее опишем процедуру CopyMovePicture. Она предназначена для копирования или перемещения открытой картинки. Для того, чтобы понять, какое действие надо выполнить, процедуре передается параметр Copy типа Boolean. Если он равен true, то копируем изображение в указанную папку, если false – перемещаем. Чтобы выбрать папку, в которую будет копироваться или перемешаться изображение, создадим и вызовем диалог выбора папки – PopenDirDialog. Конструктор данного объекта выглядит так: function NewOpenDirDialog( const Title: KOLString; Options: TOpenDirOptions ): POpenDirDialog;

Первым параметром задаем заголовок диалога, вторым – набор настроек. Стоит учесть, что если файл мы перемещаем, то он более не присутствует в той папке, из которой было загружено изображение. Поэтому при перемещении файла обязательно надо удалять его из списка (ImageList) и открывать любой другой, я, например, открываю самый первый. Ниже написан код процедуры CopyMovePicture: procedure CopyMovePicture(Copy: Boolean); begin if ImageList.Count < 1 then Exit; if OpenDirDialog = nil then OpenDirDialog := NewOpenDirDialog('Куда копировать/перенести рисунок:', []); if OpenDirDialog.Execute then begin

Page 75: VR-Online (April 2010)

if not Copy then begin MoveFile(PChar(ImageList.Items[Num]), PChar(Slash(OpenDirDialog.Path) + ExtractFileName(ImageList.Items[Num]) )); ImageList.Delete(Num); ProcessNavigation(B_FIRST); end else CopyFile(PChar(ImageList.Items[Num]), PChar(Slash(OpenDirDialog.Path) + ExtractFileName(ImageList.Items[Num]) ), true); end; end;

Окей, продолжим. Следующий «пациент» - процедура ProcessNavigation. Она производит навигацию по изображениям: открытие первого и последнего по списку, следующего или предыдущего от открытого в данный момент. Как определить, какую именно картинку открывать? Для этого процедуре передается параметр ID типа Byte, где указывается одна из констант, описанных мною в начале статьи. В любом случае, какая бы кнопка не была нажата (или пункт меню), мы так же меняем и значение переменной Num. Если вы забыли, то напомню, что она хранит в себе номер изображения по списку. Вот код данной процедуры: procedure ProcessNavigation(ID: Byte); begin case Id of B_FIRST: begin Num:=0; DrawPicture(ImageList.Items[Num]); ShowCurrentImageNumber end; B_PREVIOUS: if (Num > 0)then begin Dec(Num); DrawPicture(ImageList.Items[Num]); ShowCurrentImageNumber end; B_NEXT: if Num < ImageList.Count - 1 then begin Inc(Num); DrawPicture(ImageList.Items[Num]); ShowCurrentImageNumber end; B_LAST: begin Num:= ImageList.Count - 1; DrawPicture(ImageList.Items[Num]); ShowCurrentImageNumber end; end; end;

Теперь напишем процедуру ProcessMenu – обработчик нажатия пунктов меню. В нем используются все вышеописанные процедуры, поэтому тут нечего пояснять. Код предельно прост: procedure ProcessMenu(P: Pointer; Sender:PMenu; Item:Integer); begin case Item of 1: ClearPicture; 2: OpenPicture; 3: SavePicture; 5: Applet.Close; 7: Rotate(true); 8: Rotate(false); 10: CopyMovePicture(false); 11: CopyMovePicture(true); 12: DeletePicture; 14: ProcessNavigation(B_NEXT); 15: ProcessNavigation(B_PREVIOUS);

Page 76: VR-Online (April 2010)

17: MessageBox(MainForm.Handle, ABOUT_INFO, 'Info', MB_OK + $000040); end; end;

И последняя процедура – TBClick. Это обработчик нажатия кнопочек на нашей панели инструментов. Каждая кнопка имеет свой Id или, проще говоря, номер по счету. Учтите, что разделитель – эта та же кнопка, только не функциональная. Поэтому при подсчете номер учитывайте и его. С помощью параметра Sender типа Pcontrol мы узнаем Id нажатой кнопки, вызывая функцию CurIndex. И в зависимости от полученного значения вызываем нужную процедуру. Код процедуры выглядит так: procedure TBClick(P: Pointer; Sender: PControl ); var Idx: Integer; begin Idx := Sender.CurIndex; if idx < 0 then Exit; if idx = 0 then ClearPicture; if Idx = 2 then OpenPicture; if Idx = 3 then SavePicture; if Idx = 5 then CopyMovePicture(false); if Idx = 6 then CopyMovePicture(true); if Idx = 7 then DeletePicture; if idx = 9 then ProcessNavigation(B_FIRST); if idx = 10 then ProcessNavigation(B_PREVIOUS); if idx = 11 then ProcessNavigation(B_NEXT); if Idx = 12 then ProcessNavigation(B_LAST); if Idx = 14 then Rotate(false); if Idx = 15 then Rotate(true); if Idx = 17 then MessageBox(MainForm.Handle, ABOUT_INFO, 'Info', MB_OK + $000040); end;

Вот и все. Все основные процедуры и функции написаны, константы и переменные объявлены, тело программы присутствует. Производим компиляцию проекта, запускаем его и радуемся :). Заключение В результате запуска готовой программы и открытия первого попавшегося изображения у меня получилось такое окошко, приведенное на скриншоте ниже. Размер готовой программы – 56 Кб, что для программы подобного рода и с таким функционалом крайне мало! И если использовать для работы с картинками модуль Graphics.pas, то размер бинарника увеличивается до 128 Кб, что уже существенно, не говоря о том, что некоторые функции, использованные в нашей программе (я говорю про вращение изображения) там вовсе отсутствуют. Все исходные коды рассмотренных мною сегодня программ прилагаются к статье. Хотелось бы пожелать Вам удачи в кодинге. Если возникнут какие либо вопросы – обращайтесь! Ну а в следующей статье мы научимся работать с реестром и прочими радостями KOL. На этом все, чао.

Page 77: VR-Online (April 2010)
Page 78: VR-Online (April 2010)

Vlad [email protected]

http://webdelphi.ru

GOOGLE API В DELPHI. АУТЕНТИФИКАЦИЯ ПОЛЬЗОВАТЕЛЯ. На сегодняшний день Google обладает мощнейшим API, используя который можно организовать практически что угодно не только в Сети, но и на своем любимом домашнем компьютере – от простого справочника контактов до системам построения социальных графов, отражающих взаимосвязи между пользователями. В общих чертах API Google, требующие предварительную аутентификацию пользователя можно представить следующим образом:

API аутентификации пользователя предоставляет в наше распоряжение несколько различных интерфейсов, позволяющих пользователю получить доступ к управлению данными. Для аутентификации пользователей, использующих настольные приложения, предназначен интерфейс ClientLogin. Получив доступ, мы уже можем приступать к работе с конкретным API, обмениваться данными сервером, удалять и модифицировать данные и т.д. При этом практически все API, требующие аутентификацию, используют протокол передачи данных, базирующийся на Google Data Protocol, но об этом в следующий раз. А сегодня сосредоточимся на первой части работы с Google API – реализации интерфейса ClientLogin в Delphi. Какова конечная цель использования ClientLogin? Самое главное – это получение маркера Auth, который будет действовать в течение некоторого промежутка времени (в зависимости от используемой службы) и на который будет ссылаться наше будущее приложение, чтобы получить доступ к управлению данными. Интерфейс использует стандартную систему защиты – Captcha, поэтому при разработке

Page 79: VR-Online (April 2010)

нам необходимо будет предусмотреть случай, когда сервер вернет нам в ответе ссылку на контрольное изображение, а также обеспечить отправку ответа обратно на сервер. Теперь о том, как получить маркер Auth. Здесь всё достаточно просто. Для этого необходимо отправить запрос методом POST на адрес https://www.google.com/accounts/ClientLogin и проанализировать ответ сервера. Параметры запроса следующие: accountType - тип аккаунта, для которого выполняется аутентификация. Может принимать значения: GOOGLE (выполнить аутентификацию аккаунта Google) HOSTED (выполнить аутентификацию размещенного аккаунта) HOSTED_OR_GOOGLE (выполнить аутентификацию размещенного аккаунта; в случае неудачи выполнить аутентификацию аккаунта Google) Если мы изначально не знаем, с каким типом аккаунта будем иметь дело – то лучше использовать HOSTED_OR_GOOGLE. Email - адрес электронной почты пользователя. Passwd - пароль пользователя. service - имя службы Google, к которой вы запрашиваете доступ. Каждой из служб, использующих службу аутентификации, присвоено имя. Например, с Календарем Google связано имя “cl“, с Google Analytics – “analytics” и т.д. Если изначально неизвестно имя службы, то можно использовать универсальное имя “xapi“. При использовании универсального имени могут не выполняться запросы к некоторым API. В частности было замечено, что с xapi не удается получить данные о Контактах Google. Поэтому при аутентификации старайтесь всегда указывать точное имя службы. source - Короткая строка, идентифицирующая ваше приложение и применяемая для ведения журнала. Эта строка должна иметь следующий формат: “companyName-applicationName-versionID”. logintoken – необязательный параметр. Маркер, представляющий конкретное значение CAPTCHA. Google присылает этот маркер и URL изображения CAPTCHA в ответе о неудачном входе с кодом ошибки “CaptchaRequired”. logincaptcha – необязательный параметр. Строка, указанная пользователем в качестве ответа на тест CAPTCHA. После отправки запроса нам придёт ответ, который может содержать: В случае успешной аутентификации – код ответа сервера 200 и 3 строки: SID, LSID и Auth. Первые два маркера в настоящее время зарезервированы и не используются. В случае ошибки нам возвращается код ответа 403 и короткое сообщение об ошибке. Возможные варианты сообщений об ошибке приведены в официальной документации Google по протоколу ClientLogin. В случае необходимости ввода Captcha в ответе возвращается ошибка “CaptchaRequired”, URL для загрузки изображения Captcha и параметр logintoken. Начнем кодить. Создадим простенький компонент, позволяющий подключаться к

Page 80: VR-Online (April 2010)

аккаунту Google. В разработке будем использовать следующие модули: uses WinInet, SysUtils, Classes, TypInfo;

Определим вспомогательные типы данных. Тип аккаунта: type TAccountType = (GOOGLE, HOSTED, HOSTED_OR_GOOGLE);

Возможные результаты аутентификации: type TErrorCodes = (Ok,BadAuthentication,NotVerified,TermsNotAgreed, CaptchaRequired,Unknown,AccountDeleted,AccountDisabled, ServiceDisabled,ServiceUnavailable);

Имена сервисов, использующих предварительную аутентификацию пользователя: type TServices = (xapi,analytics,apps,gbase,jotspot,blogger,print,cl,codesearch, cp,writely,finance,mail,health,local,lh2,annotateweb,wise,sitemaps, youtube);

Теперь создадим класс, реализующий ClientLogin. Впоследствии этот класс можно будет использовать для работы, например, с Goole Analytics API, Календарем и т.д. type TGoogleLogin = class(TComponent) private //регистрационные данные FAccountType : TAccountType; FLastResult : TErrorCodes; FEmail : string; FPassword : string; //данные ответа/запроса FSID : string;//в настоящее время не используется FLSID : string;//в настоящее время не используется FAuth : string; FService : TServices;//сервис к которому необходимо получить доступ FSource : string;//имя вызывающего приложения FLogintoken : string; FLogincaptcha : string; //параметры Captcha FCaptchaURL : string; FAfterLogin : TAfterLogin; FDisconnect : TDisconnect; function GetParamStr:string; function SendRequest(const ParamStr: string):AnsiString; function ExpertLoginResult(const LoginResult:string):TErrorCodes; function GetLoginError(const str: string):TErrorCodes; function GetCaptchaToken(const cList:TStringList):String; function GetCaptchaURL(const cList:TStringList):string; function GetResultText:string; procedure SetEmail(cEmail:string); procedure SetPassword(cPassword:string); procedure SetService(cService:TServices); procedure SetSource(cSource: string); procedure SetCaptcha(cCaptcha:string); public constructor Create(AOwner: TComponent);override; function Login(aLoginToken:string='';aLoginCaptcha:string=''):TErrorCodes;overload; procedure Disconnect;//удаляет все данные по авторизации property LastResult: TErrorCodes read FLastResult; property LastResultText:string read GetResultText; property Auth: string read FAuth; property SID: string read FSID; property LSID: string read FLSID; property CaptchaURL: string read FCaptchaURL;

Page 81: VR-Online (April 2010)

property LoginToken: string read FLogintoken; property LoginCaptcha: string read FLogincaptcha write FLogincaptcha; published property AccountType: TAccountType read FAccountType write FAccountType; property Email: string read FEmail write SetEmail; property Password:string read FPassword write SetPassword; property Service: TServices read FService write SetService; property Source: string read FSource write FSource; property OnAfterLogin :TAfterLogin read FAfterLogin write FAfterLogin; property OnDisconnect: TDisconnect read FDisconnect write FDisconnect; end; При работе с классом следует учитывать, что изменение в процессе работы свойств Email, Password и Source должно вести к обнулению всех данных об аутентификации. Все поля и методы описывать смысла нет, поэтому рассмотрим только основные методы, используемые классом. Формирование строки запроса. При формировании строки, содержащей параметры запроса необходимо учитывать, что в параметрах могу присутствовать необязательные параметры для проверки кода Captcha. Поэтому метод GetParamStr определен следующим образом: function TGoogleLogin.GetParamStr: string; begin if Length(Trim(FLogintoken))>0 then //в результате прошлого запроса получена каптча begin Result:=Format(ParamStrCaptcha, [GetEnumName(TypeInfo(TAccountType),Ord(FAccountType)), FEmail, FPassword, GetEnumName(TypeInfo(TServices),Ord(FService)), FSource, FLoginToken, LoginCaptcha]); end else Result:=Format(ParamString,[GetEnumName(TypeInfo(TAccountType),Ord(FAccountType)), FEmail, FPassword, GetEnumName(TypeInfo(TServices),Ord(FService)), FSource]); end;

То есть, если в результате предыдущего запроса было получено значение logintoken, то строка запроса формируется по шаблону: accountType=%s&Email=%s&Passwd=%s&service=%s&source=%s&logintoken=%s&logincaptcha=%s

Иначе, шаблон строки будет: accountType=%s&Email=%s&Passwd=%s&service=%s&source=%s

Отправка запроса на сервер Второй метод – отправка сообщения на сервер. В модуле я использовал WinInet, хотя никто не запрещает Вам переписать метод SendRequest на использование Indy, Synapse и т.д. Метод SendRequest выглядит следующим образом: function TGoogleLogin.SendRequest(const ParamStr: string): AnsiString;

Page 82: VR-Online (April 2010)

function DataAvailable(hRequest: pointer; out Size : cardinal): boolean; begin result := wininet.InternetQueryDataAvailable(hRequest, Size, 0, 0); end; var hInternet,hConnect,hRequest : Pointer; dwBytesRead,I,L : Cardinal; begin try hInternet := InternetOpen(PChar('GoogleLogin'),INTERNET_OPEN_TYPE_PRECONFIG,Nil,Nil,0); if Assigned(hInternet) then begin //Открываем сессию hConnect := InternetConnect(hInternet,PChar(Host), INTERNET_DEFAULT_HTTPS_PORT,nil,nil,INTERNET_SERVICE_HTTP,0,1); if Assigned(hConnect) then begin //Формируем запрос hRequest := HttpOpenRequest(hConnect,PChar('POST'),PChar(ParamStr),HTTP_VERSION,nil,Nil,Flags_Request,1); if Assigned(hRequest) then begin //Отправляем запрос I := 1; if HttpSendRequest(hRequest,nil,0,nil,0) then begin repeat DataAvailable(hRequest, L);//Получаем кол-во принимаемых данных if L = 0 then break; SetLength(Result,L + I); if InternetReadFile(hRequest,@Result[I],sizeof(L),dwBytesRead) then//Получаем данные с сервера else break; inc(I,dwBytesRead); until dwBytesRead = 0; Result[I] := #0; end; end; end; end; finally InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); end; end;

Константа Flags_Request определена в модуле следующим образом: Flags_Request = INTERNET_FLAG_RELOAD or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_SECURE or INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_KEEP_CONNECTION;

Если Вас не устраивает использование WinInet в работе компонента, и Вы хотите использовать, например Indy, то не забывайте обязательно включать в заголовок сообщения: Content-type: application/x-www-form-urlencoded

Анализ результата аутентификации Метод LastResultText вернет вам сообщение об успешной аутентификации, либо текст, содержащий описание ошибки. function TGoogleLogin.GetResultText: string; begin case FLastResult of

Page 83: VR-Online (April 2010)

Ok: Result:=rcOk; BadAuthentication: Result:=rcBadAuthentication; NotVerified: Result:=rcNotVerified; TermsNotAgreed: Result:=rcTermsNotAgreed; CaptchaRequired: Result:=rcCaptchaRequired; Unknown: Result:=rcUnknown; AccountDeleted: Result:=rcAccountDeleted; AccountDisabled: Result:=rcAccountDisabled; ServiceDisabled: Result:=rcServiceDisabled; ServiceUnavailable: Result:=rcServiceUnavailable; end; end;

Где rsХХХ – строки с описанием результата последней попутки аутентификации. Если в результате аутентификации возвращается CaptchaRequired, то поле FCaptchaURL будет содержать URL для загрузки изображения Captcha, а FLogintoken строку, которую необходимо будет включить в запрос для повторной авторизации. Теперь рассмотрим небольшой пример работы с компонентом. Пример использования компонента GoogleLogin Расположим на главной форме нашего приложения следующие компоненты: 2 Edit’a, 3 Label, 1 Button и наш TGoogleLogin. Вид приложения представлен на рисунке:

Теперь допустим, что нам необходимо получить доступ к Google Contacts API. Обработчик onClick будет выглядеть следующим образом: […] GoogleLogin1.Email:=Edit1.Text; GoogleLogin1.AccountType:=HOSTED_OR_GOOGLE; GoogleLogin1.Password:=Edit2.Text; GoogleLogin1.Service:=cp;//сервис Контакты Google GoogleLogin1.Login();//аутентифицируемся ResultLabel.Caption:=GoogleLogin1.LastResultText;//водим результат аутентификации ShowMessage(GoogleLogin1.Auth);//показываем ключ Auth […]

В запущенной программе результат выглядит следующим образом:

Page 84: VR-Online (April 2010)

Вот и все. Мы получили то, что хотели – аутентифицировались в Google и теперь можем приступать к работе с API, но это уже совсем другая история. Полезные ссылки к статье: Документация Google по ClientLogin http://code.google.com/intl/ru/apis/accounts/docs/AuthForInstalledApps.html Ссылка на последнюю версию компонента GoogleLogin: см. приложенный к архиву файл

Page 85: VR-Online (April 2010)
Page 86: VR-Online (April 2010)

Игорь Антонов aka Spider_NET ГОТОВОЕ ИЛИ СВОЁ?

С чего начинается создание классного web-портала/блога? Конечно же, с гениальной идеи и верстки дизайна. Я знаю немало творческих людей, у которых полно классных идей, но, к сожалению, нет должного опыта в программировании/дизайне/верстке и во всем том, что нужно для поднятия ресурса. Как им быть? Браться за изучение новых технологий, читая толстенные книги? Может быть и так. Правда скорей всего, после прочтения кучи литературы и появлению первых же трудностей желание творить напрочь отпадет. Особенно это касается тех, кто поднимает свой проект в одиночку. Что же таким людям делать? Мой ответ под катом. 1. Не нужно стесняться. В первую очередь, я бы посоветовал не стесняться использовать готовые решения. На мой взгляд, нет ничего позорного юзать для своих проектов различные готовые движки (CMS). Реально, что здесь плохого? Их ведь для этого и создают! Я много раз натыкался на интересные блоги, построенные на WordPress. Тематика некоторых из них была ориентирована на обучение web-программированию. Да, может показаться странным, что человек, который пытается научить кого-то программированию, использует готовое решение, а не свои наработки. Но можно, же на это взглянуть и с другой стороны. Вполне возможно, что у автора просто нет времени (желания) поддерживать свой движок или писать какой-то определенный функционал. Знаю по себе. На работе приходится программировать много и по возвращению домой, что-то писать для себя уже нет никого желания. Зато есть огромное желание что-нибудь закреативить: заметку, статью и т.д. Вот и получается, что проще написать мысли и сразу же их опубликовать, чем что-то программировать. VR-Online – не исключение. Если бы мы разрабатывали движок собственными силами (попытки были), то сайт бы еще год находился в подвешенном состоянии. То нет времени, то нет желания. А так, есть Drupal и мы можем постепенно улучшать базовый функционал и заниматься контентом. Я больше чем уверен, что 80% наших посетителей не важно, как наш сайт работает изнутри. Им куда важней содержание. Если ты создаешь проект, направленный на обмен опытом в приготовлении вкусной и здоровой еды, то твоим посетителям будет абсолютно все равно, на WordPress’е у тебя работает сайт или на Drupal. Они будут приходить за контентом. Не нужно стесняться юзать то, что уже готово. Помни золотое правило – если мы все будем изобретать колесо, то мы никогда не сделаем машину. 2. Вспомогательные средства Если все же готовые движки не для тебя, и ты четко уверен в своих программерских способностях, но у тебя есть проблемы с версткой макета, то этот совет для тебя. На дворе 21-й век и коллеги по цеху всячески стараются помочь друг другу и особенно тем, кто только встает на путь разработчика. Взять хотя бы сервис «Генератор HTML и CSS шаблонов» (http://csstemplater.com/). Разработчики этого полезного проекта явно знают о трудностях, которые возникают перед новичками-верстальщиками. Чтобы как-то

Page 87: VR-Online (April 2010)

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

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

предварительный результат сгенерированной страницы и в случае одобрения загрузить ее себе на компьютер. Ну а после все в твоих руках! Украшай, совершенствуй, экспериментируй и создавай неповторимый проект. 3. Готовые CSS шаблоны. Сгенерировать основу для страницы сайта – это, несомненно, хорошо, но для многих новичков этого может быть явно мало. Не стоит отчаиваться и уж тем более отказываться от реализации своей идеи. Если ты очень плохо разбираешь в CSS/HTML, то воспользуйся бесплатными шаблонами. На просторах всемирной паутины есть куча сайтов с бесплатными готовыми макетами. Заходишь, качаешь и используешь в своем прожекте. Когда твой проект станет мега-популярным, обязательно найдется человек, который захочет помочь тебе с дизайном. Ну а пока таких людей нет, нужно довольствовать малым и бесплатный шаблон будет кстати. Начать поиски шаблона для своего проекта можешь начать отсюда: http://www.templateworld.com.

Page 88: VR-Online (April 2010)

Антонов Игорь aka Spider_NET 10 ПОИСКОВЫХ ТРЮКОВ.

ЮЗАЕМ GOOGLE НА 100 %

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

1. Используйте оператор «site» для поиска на определенном сайте.

Я всегда использую этот оператор, когда мне требуется найти информацию на каком-нибудь конкретном сайте. Например, если меня интересуют все страницы, на которых есть слово Delphi на сайте vr-online.ru, то в строке поиска я напишу Delphi site:vr-online.ru.

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

Если вы сомневаетесь в написании какого-нибудь слова, и у вас под рукой нет орфографического словаря, то проверьте написание слова с помощью Google. Напишите проверяемое слово в строке поиска и отправьте поисковый запрос. Если в слове допущена ошибка, то google запросит от вас уточнение: «Может быть, вы имели в виду…».

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

3. Google = калькулятор.

Не многие знают, что в поисковике от Google есть встроенный калькулятор. Вы наверняка зададите мне вопрос: «Зачем мне он нужен, ведь в составе ОС уже имеется хороший калькулятор?». Это так, но иногда бывает удобней что-нибудь посчитать прямо в окне браузера. Вот вам пример использования этой возможности. Вам требуется получить результат выполнения: 2+2*2. Вбиваем эту строку в гугл и сразу же получаем результат – 6.

Page 89: VR-Online (April 2010)

4. А сколько времени в городе X?

Хотите позвонить друзьям/коллегам в другой город и сомневаетесь во временной разнице? Нет проблем! Не нужно испытывать судьбу и волноваться, что вы, какого-нибудь разбудите посреди ночи. Просто вбейте в качестве поискового запроса «Время название_города» и узнайте точное время в интересующем вас городе. Например, вы живете в Хабаровске, а вам требуется узнать, сколько же сейчас времени в Челябинске. В этом случае ваш запрос будет таким: «время Челябинск» (без кавычек).

5. Конвертирование валют.

Требуется быстро перевести сумму из одной валюты в другую? Стоп! Оставьте свой калькулятор в покое. Просто спросите об этом гугл. Например, чтобы получить сумму в рублях от 543 долларов США, нужно набить такой запрос: «543 доллара в рублях» (без кавычек). Кликаем «Найти» и получаем результат.

6. Применяй оператор OR.

Page 90: VR-Online (April 2010)

Оператор OR полезен в тех случаях, когда вам требуется найти страницы, на которых присутствует либо ключевое слово1, либо ключевое слово2. Часто OR используют в связке с оператором site. Например: «”Костенко Роман” OR “Игорь Антонов” site:vr-online.ru».

7. Исключайте определенные слова при помощи оператора – (минус).

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

8. Поиск информации в документах определенного формата.

Если вы хотите, чтобы что указанные вами ключевые слова искались сугубо в офисных документах (doc, xml), то в этом случае, вам необходимо воспользоваться оператором filetype. Пример: Spider_NET filetype:pdf.

9. Поиск в пределах числовых диапазонов.

Для осуществления этой задачи в Google предусмотрен оператор .. (две точки). Пользоваться им достаточно просто: «ключевые_слова числовой диапазон». Сразу смотрим пример. Допустим нас, интересуют войны, случившиеся в интервале с 1900 по 1945 года. Делаем такой запрос: «Война 1900..1945». И моментально получаем содержательные результаты.

10. Поиск в заголовках страниц.

Page 91: VR-Online (April 2010)

Я уже устал восхищаться возможностями гугла, но все же, сделаю это еще раз. Зачастую возникают ситуация, когда очень требуется найти страницы, в заголовках которых (то, что расположено между html тегами <title></title>) присутствует определенный текст. В таких случаях, вам не нужно ломать голову и мудрить с поисковым запросом, а стоит просто заюзать оператор intitle. По традиции, продемонстрирую пример: intitle:”VR-Online”.

На этом у меня все. Разрешите откланяться и пожелать вам удачи!

P.S. А какие трюки поисковиков используете Вы?

За основу статьи была взятка заметка: 10 simple google search tricks (http://webworkerdaily.com/2010/04/01/10-simple-google-search-tricks/)

Page 92: VR-Online (April 2010)

Дмитрий Редькин aka zahod5277 [email protected]

Обзор мобильных ОС Что выбрать и на чем писать? За последние пару лет рынок смартфонов и коммуникаторов серьезно увеличился, и современный человек покупает уже не просто телефон, а полноценный карманный компьютер, с кучей наворотов на все случаи жизни. Количество операционных систем для карманных устройств так же с каждым годом увеличивается: Symbian, Windows Mobile, iPhone OS, Android, Maemo. Вот сиди и думай: под какой осью выбрать аппарат? Какая ОС круче? А если ты еще и программист, то это вообще задача не из легких: какую ОС выбрать, чтобы и себя порадовать, и приложения разрабатывать без лишнего геммора? Вот давайте и разберемся. Обзор мирового и российского рынка мобильных ОС Узнаем, какая ось популярнее, взглянув на статистику мирового рынка, предоставленную компанией AdMob:

С точки зрения мирового рынка, самой популярной ОС является iPhone OS. Это и ежу понятно: имиджевый, стильный, мощный, всем бы такой. Выпущенная недавно Google Android уже успела отхватить себе значительную долю и держится на втором месте. Symbian со своими 18% стоит на третьем, RIM ( на ней работают устройства BlackBerry), держится на четвертом. А Windows Mobile делит позорную пятую строчку с прочими, в основном основанными на Linux, осями. Но это мировой рынок. А как же Россия? На российском рынке ведущую позицию занимает Symbian (больше 50%), за ней идут устройства на Windows Mobile (10-15%), следом iPhone, Android, etc. Это объясняется популярностью Nokia, у которой практически каждый второй аппарат работает на Symbian, множеством относительно недорогих коммуникаторов на WM, дороговизной айфона (в США iPhone раза в три дешевле, чем у нас), и практически полным отсутствием устройств с Android и других платформ. А теперь давайте разберемся каждую ОС по отдельности и узнаем, какая круче и под

Page 93: VR-Online (April 2010)

какую из них проще программировать. Symbian В 1998 году Nokia, Ericsson, Motorola и Psion основали компанию Symbian Ltd. с целью создания единой операционной системы для мобильных устройств. С тех пор из этого консорциума вышли Motorola и Psion, продав свои акции Nokia. В 2006 году Sony Ericsson выкупила модификацию UIQ, которая являлась основой для смартфонов Motorola и Sony Ericsson, тем самым обособившись от Nokia. В 2008 году развитие UIQ было прекращено, и властелином Symbian стала Nokia. На данный момент самой распространенной является модификация Series 60, на которой работают многочисленные смартфоны от финнов. Чем же хороши устройства, работающие под Symbian? Во-первых, простой интерфейс и легкое управление. Некоторые люди даже и не догадываются о возможностях своего аппарата, считая его обычным мобильником, уж очень проста эта платформа. Вторым плюсом является огромное количество приложений, позволяющее настроить свой смартфон как душе угодно: классные pdf-читалки, проги для учебы, крутые видео-плееры, 3D игры, в некоторых смартах даже установлен интерпритатор Python! Третье преимущество это бесплатность и открытость платформы, буквально недавно, в феврале 2010 года Nokia официально заявила о том, что Symbian абсолютно открыта и бесплатна, даешь опен сорс! Четвертое, и порой играющее важную роль преимущество, это, конечно же, цена. Устройства на Симбиане намного дешевле устройств с похожим функционалом на других платформах. Программирование для Symbian Кодить для симбы можно и под окнами, и под Mac OS, и под Linux, достаточно скачать нужные SDK и IDE. Языками программирования являются Java, C++, Python. Наиболее известные IDE: CodeWarrior, Carbide, NetBeans (вместе с NetBeans Mobility Pack), QT. Ахтунг! Из-за несовместимости версий Симбиана, кодить нужно только под определенный Edition, иначе ваше приложение может попросту не запуститься. Ссылки: www.symbian.org - официальный сайт консорциума. http://www.forum.nokia.com/main/resources/tools_and_sdks/codewarrior/ - IDE CodeWarrior. http://www.forum.nokia.com/carbide_cpp -IDE Carbide. http://www.mobilab.ru/articles/index2.php?cat=1 - Статьи по программированию для Symbian. http://www.forum.nokia.com/info/sw.nokia.com/id/4a7149a5-95a5-4726-913a-3c6f21eb65a5/S60-SDK-0616-3.0-mr.html - Необходимые SDK. Windows Mobile

Page 94: VR-Online (April 2010)

Первая версия ОС вышла в 2000 году под названием Pocket PC 2000, которое впоследствии изменили на более звучное Windows Mobile. Первая версия страдала многими неопределенностями, такими как: не было собственной архитектуры процессора (она работала сразу под тремя типами процессоров), поддерживалось всего лишь одно разрешение 240*320 (QVGA), поддерживала два типа флэш-карт, работала в нескольких мобильниках, хотя Smartphone Edition еще не была выпущена, в общем, как всегда это бывает у Microsoft, сначала выпустили, а потом доделывали. Потом была Pocket PC 2002, тоже не шибко функциональная, и следом, наконец-то, появилась Windows Mobile 2003, которая поддерживала множество разрешений экрана, была возможность располагать экран и вертикально и горизонтально, появилась поддержка WPA шифрования. Потом вышла WM 5, а следом за ней вышли популярные сейчас WM 6 и WM 6.5. Чем же так хороша эта платформа? Большим количеством предустановленных приложений на многие случаи жизни, поддержка «мелкомягкого» офиса, можно читать и править документы в дороге, неплохая эргономика, достаточно удобный интерфейс (почти как на домашнем ПК), однако до версии 6.5 он был скудноват. По сути ничем не лучше да и не хуже других платформ, тем более в последней, 6.5.3 версии, появился мультитач, а это очень хорошо. Однако положение этой ОСи на рынке незавидно: за долгие десять лет существования она так и не смогла стать самой популярной, в США вместо нее выбирают BlackBerry и iPhone, в других странах за какие-то полтора года, ворвавшись, отхватил половину рынка Android. В России эта платформа пока еще пользуется хорошим авторитетом и устройства на WM хорошо покупают, однако это может поменяться, если Android будет так и дальше размножаться J. Microsoft терпят поражение, и на помощь должна прийти Windows Phone 7. Эта ОС будет кардинально отличатся от прошлых: новый интерфейс, новые фишки и возможности. Программирование для Windows Mobile. Программировать под платформу, выпущенной мировой корпорацией, естественно нужно на любимом языке корпорации и под IDE корпорации, то есть на .NET совместимых языках при помощи Visual Studio. Можно конечно попробовать другие IDE, но что может быть круче VS для кодинга под .NET? Ссылки: http://www.microsoft.com/windowsmobile/ru-ru/default.mspx - Официальный сайт http://www.gotdotnet.ru/Forums/Mobile/default.aspx - Сообщество разработчиков http://4pda.ru/ - Отличный сайт для владельцев смартов и коммуникаторов. iPhone OS

Page 95: VR-Online (April 2010)

Разработанная не менее великой и не менее ужасной, чем Microsoft, корпорацией Apple, эта операционная система вышла в 2007 году специально для инновационного смартфона iPhone. Основана на том же ядре, что и Mac OS X – ядре “Darwin”. Сейчас эту ОС используют плеер iPod, смартфон iPhone и планшетник iPad. Эта операционная система, как и сам смартфон, внесли некоторые революционные вещи на рынок смартфонов, например мультитач. Красивая, мощная, функциональная операционная система, многие берут продукты Apple из-за громадных возможностей платформы. За три года в онлайн магазине App Store накопилось более ста тысяч(!) приложений, и поэтому владельцам продуктов Apple не приходится скучать. Ходит множество слухов типа “Айфон легко взломать, он самый уязвимый!”. Не верьте. Почему ломают iPhone? Просто дикая популярность и некоторые ограничения (в США по умолчанию отключен мультитач, в отличие от Европы) не дают покоя многим шаловливым ручкам. А если обладатель этих ручек еще и с мозгами то джейлбрейк (термин, означающий взлом айфона) может состояться. С таким же успехом можно ломать Windows Mobile(а он наверняка менее защищен, это же Microsoft!), однако там нечего ломать, все открыто и доступно. А как доказать всем что ты крутой ][ацкер? Конечно же сломать что-нибудь мега-популярное и крутое! Кодинг под iPhone OS. Apple ведет еще более жесткую политику для разработчиков, чем Microsoft. Приложения для iPhone программируются только на Mac OS X, и только на ней. В комплект поставки МАКоси входит специальный пакет X-code, который включает одноименную IDE и множество языков программирования (C, C++, Objective-C, Objective-C++, Java, AppleScript, Python и Ruby), так же существуют сторонние плагины, позволяющие подключать другие языки (Free Pascal, Ada, C#, Perl, Haskell). Однако, если Макбука или просто Мака у вас нету, но кодить под айфон жутко хочется, то можно попробовать, устроив диско (именно диско, а не танец) с бубном, установить левую сборку Mac OS на свой PC, благо таких в сети навалом, и попытаться что-то сделать. Но не факт что это будет работать. Если и этот вариант вас не устраивает и хочется настоящих страданий, истинного мазохизма, то можно попробовать поизвращаться, установив что-то типа IDE (таких тоже есть немного) для айфона на Windows. На сей раз ссылок приводить не буду, хотите познать дао виндовс-программирования для айфона – гугл в помощь, а мне хватит, уже насмотрелся на эти извращения J. Android

Я не удивлюсь, если Google в скором времени начнут выпускать джинсы! Эта корпорация, кажется, хочет охватить как можно больше сфер интернета, а тут уже и собственные ОС выпускать начала (вспомним Chrome OS), такими темпами они скоро захватят весь интернет и IT-сферу и перейдут на захват других рынковJ. При всем при этом, Google-

политика почему-то не дает сбоев и практически все, что они не делают, получает огромный успех. Не прошло и трех лет с момента выхода OS Android, как она стала второй

Page 96: VR-Online (April 2010)

по популярности в мире после iPhone. Андроид основан на ядре Linux, версия ядра 2.6. Полностью открыт. Посмотреть код можно будет по приведенной ниже ссылке. Первые версии операционки были очень сырыми и не доработанными, но сейчас все меняется в лучшую сторону. В новой версии 2.1 даже появилась поддержка мультитача. Как и в любом Linux’e есть нескольких рабочих столов, что позволяет грамотно планировать рабочее пространство, раскидывая по каждому из десктопов определенные виджеты, поддержка которых так же существует. В коммуникаторах от HTC Android одет в еще более красивую оболочку и имеет кучу крутых виджетов помимо стандартных. Приложения устанавливаются в основном из онлайн-магазина Android Market. Существуют как и платные, так и бесплатные программы. Общее количество программ в магазине – около десяти тысяч (в AppStore порядка 100 тысяч). Прибыль от платных программ распределяется таким образом – 30% идут операторам сотовой связи и 70% - разработчикам. Однако, Android Market это не единственное средство для закачки приложений. Можно пользоваться сторонними сайтами да и просто скачивать с компа. Некоторые жалуются на плохое качество сторонних прог для Андроида. Возможно так оно и есть, но не стоит забывать что платформа еще очень молода и у нее все впереди. Программирование под Android Разрабатывать приложения для Android доступно и на Windows, и на Mas OC, и на Linux. Достаточно скачать SDK для нужной OS. Сначала для разработки был доступен только язык Java, в последствии, с версии 1.6, Google предоставили Native Development Kit, с помощью которого можно писать на C и C++. Существует плагин для Eclipse (это для тех, кто стандартными средствами разработки не любит пользоваться). Ссылки: http://www.android.com/ - Официальный сайт проекта. http://developer.android.com/index.html - Официальное сообщество разработчиков. http://developer.android.com/sdk/index.html - SDK. http://developer.android.com/sdk/ndk/index.html - Native Development Kit. Maemo Интерес к Linux увеличивается во многом благодаря разработкам для мобильных устройств. Не стала исключением и Nokia. Являясь основным спонсором консорциума Maemo, она всячески подогревает интерес к этой платформе. Maemo является наиболее продвинутой операционной системой для коммуникаторов, основанной на Linux. Некоторые части это ОС закрыты, например, модуль экранной клавиатуры, но по большей части эта ОС открыта, и для нее существуют множество приложений, в основном бесплатны. Разработкой, а точнее адаптацией приложений с Debian (а Maemo основана на Debian), занимается специальное комьюнити, и поэтому качество программ довольно

Page 97: VR-Online (April 2010)

приличное. Но сама платформа еще достаточно сыра. Например, наблюдается проблема с USSD-запросами. На данный момент на Maemo работают всего 4 девайса (и все от Nokia): планшетники N770, N800, N810 и коммуникатор N900. Программирование для Maemo. Основной средой разработки является кроссплатформенный инструментарий QT. Разработка ведется на языках C, C++, Ruby, Java. Можно, при помощи сторонних плагинов для Visual Studio, вести разработку на C#. Ссылки: http://maemo.org/ - Официальный сайт консорциума. http://maemo.org/development/ - Страничка разработчиков. Заключение. Рынок мобильных операционных систем достаточно разнообразен, и отхватить его долю стремятся крупнейшие мировые корпорации. А конкуренция, дорогие друзья, это двигатель прогресса. А значит, в скором будущем мы будем иметь в кармане не только телефон, браузер и фотокамеру, а еще и зажигалку, перочинный ножик и свистокJ.

Page 98: VR-Online (April 2010)

Антон Козлов aka JimmyJonezz [email protected]

Знакомьтесь, штриховой код

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

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

Преимущество кодирования информации заключается еще и в следующем – мы можем некоторые сведения, скажем, данные о конкретном виде товара, закодировать таким образом, чтобы произошла «упаковка» и «компоновка» данных для последующей ее идентификации второй стороны (например, покупателем), т.е. имея, некоторую последовательность чисел/либо букв (страна производитель, фирма расфасовщик, масса нетто, наименование, количество и т.д.) мы получаем новую последовательность, но уже меньшую по длине и совершенно другого вида. От вида представления кодированной информации, также зависит удобство распознавания кодированных данных. Свое запудренное разъяснение, я веду к тому, что предметы, товары или материалы можно маркировать особым образом, чтобы можно было быстро узнать всю информацию об этом объекте, не поднимая спецификацию или накладные. Для маркировки применяют особый штрих код. Обратившись к википедии, мы узнаем, что штриховой код или сокращенно штрихкод - это последовательность чёрных и белых полос, представляющая некоторую информацию в удобном для считывания техническими средствами виде. В больших супермаркетах или универмагах, мы набираем необходимый товар и идем в кассу, где продавец/ продавщица (выбрать по вкусу) проводит по товару специальным считывающим устройством и на экране ее монитора высвечивается цена данного товара. Так вот, она сканирует штрихкод, и преобразовавшаяся кодированная информация уже принимает понятный обывателю вид – в нашем случае, цена товара. История создания штрихкода и вообще, способа маркировки, относится к 1948 году. Некий Бернард Сильвер (1924—1962), аспирант Института Технологии Университета Дрекселя в

Page 99: VR-Online (April 2010)

Филадельфии, услышал, как президент местной продовольственной сети просил одного из деканов разработать систему, автоматически считывающую информацию о продукте при его контроле. С это события можно считать пошел отчет по процессу создания способа маркировки. Их первая работающая система использовала ультрафиолетовые чернила, но они были довольно дороги, а, кроме того, со временем они исчезали. Как это обычно бывает, новые разработки дорого стоят и перспектива в их дальнейшем использовании видится смутно, но убежденный в том, что система реализуема, Вудланд покинул Филадельфию и перебрался во Флориду в апартаменты своего отца для продолжения работы. Вдохновение пришло неожиданно, но это сделало огромный прорыв в дальнейшем продвижении - Азбука Морзе, явилась той системой, от которой ученый начал отталкиваться. 20 октября 1949 года Вудланд и Сильвер подали заявку на изобретение. В результате ими был получен патент США № 2 612 994 , изданный 7 октября 1952. Дальше пошло по нарастающей – заинтересовавшись, компания IBM взялась за развитие данной системы, но отказалась от ее реализации, т.к. посчитала, что обработка получающейся информации потребует сложного оборудования, и что его разработку она сможет провести при наличии свободного времени в будущем. Можно сказать, что фундамент был уже заложен и заложен он был основательно, хотя и присутствовали некоторые нюансы. В 1952 году Вудланд и Сильвер продали патент компании Philco — в дальнейшем известная как Helios Electric Company. В том же самом году Philco перепродает патент компании RCA. От истории создания плавно перейдем к способу кодирования информации. Оказалось, что их не так уж и много, скорее наоборот: 1. Линейный штрихкод. Линейными (обычными) называются штрихкоды, читаемые в одном направлении (по горизонтали). Наиболее распространённые линейные символики: EAN (EAN-8 состоит из 8 цифр, EAN-13 — используются 13 цифр),

UPC (UPC-A, UPC-E),

Code39,

Code128 (UPC/EAN-128),

Codabar,

Page 100: VR-Online (April 2010)

«Interleaved 2 of 5».

Линейные символики позволяют кодировать небольшой объём информации (до 20—30 символов, обычно цифр). Подробно останавливаться на этом виде кодирования не будем, если же вам необходимо более полная информация об этом виде штрихкода, то смотрите врезку к статье. Подобранные мной ссылки на , помогут вам самим быстро разобраться с логистикой штрихкода. Хочу лишь отметить, что EAN/UPC наиболее часто используется в торговле. 2. Двумерный штрихкод. Двумерными называются символики, разработанные для кодирования большого объёма информации. Расшифровка такого кода проводится в двух измерениях (по горизонтали и по вертикали). Двумерные коды подразделяются на многоуровневые (stacked) и матричные (matrix). Многоуровневые штрихкоды появились исторически ранее, и представляют собой поставленные друг на друга несколько обычных линейных кодов. Матричные же коды более плотно упаковывают информационные элементы по вертикали. В настоящее время разработано множество двумерных штрихкодов, применяемых с той или иной широтой распространения. Вот некоторые коды: Aztec Code,

Data Matrix,

Page 101: VR-Online (April 2010)

MaxiCode,

PDF417,

QR код,

Microsoft Tag,

Демонстрация этой технологии (двумерные штрихкоды) произошла в магазине сети Marsh, в городе Троя (штат Огайо, США) 26-го июня 1974 года. Наибольшее распространение в настоящее время получили стандарты Data Matrix, изобретённый в 1989 году, и QR-код («Quick Response», т.е. «Быстрый отклик»), разработанный в 1994 году Японской компанией Denso Wave Inc. Ключевое отличие QR над Data Matrix — умение работать с канна- символами японского языка. Штрихкод Data Matrix, в свою очередь, на 30-60% меньше по площади, чем QR, содержащий идентичные данные, но получивший в начале 2000 года широкое распространение в Японии и других азиатских странах. Сегодня двумерные штрихкоды, это не просто способ маркировки, а нечто большее – они могут являться частью вашего имиджа, использоваться в качестве ссылки на тот или иной ресурс, использоваться в качестве скрытых/тайных сообщений и т.д. Все чаще мы можем увидеть их на визитках, журналах, газетах, листовках, плакатах, досках объявлений, продуктах питания, сайтах и т. д. В Европе и Америке данный процесс популяции идет значительно меньше. С помощью встроенной фотокамеры вашего мобильного телефона или КПК, можно очень быстро распознать штрихкод. Достаточно небольшого приложения и связь с интернетом -

Page 102: VR-Online (April 2010)

вы сможете зашифровать ссылки на ваши сайты, блоги, фотографии, тексты, файлы, что угодно. Кроме того, зашифрованная информация не обязательно должна содержать гиперссылку, в ней может быть зашифрована готовая текстовая и цифровая информация: визитная карточка, шаблон СМС с номером адресата, просто секретное послание. Популяризация штрихкодов уже давно не зависит от технического прогресса. Телефоны с камерами уже давно есть у многих, так же, как и доступ в Интернет. Разработчики ShotCode, предлагают совершенно другой вид штрихкодов – их мобильные метки округлы и более симпатичны на вид. Другая японская технология - ColorCode способна оперировать цветными метками. Выгода от такого способа маркировки, как вы понимаете, просто огромна и не заменима. Достаточно простого штампа, который отображает различные характеристики и особенности товаров, место и время их производства, соответствие товаров стандартам качества, различную информацию о производителе и это значительно упрощает процесс всего товарооборота. Плюс ко всему, это технология отлично дополняет развлекательную индустрию. Полезные ссылки: Code 128: http://tradepilot.ru/goods-marks/code128.html EAN (European Article Number): http://tradepilot.ru/goods-marks/ean.html Code 39: http://tradepilot.ru/goods-marks/code39.html Codabar: http://www.mecsw.com/specs/codabar.html Interleaved 2 of 5: http://revolution.allbest.ru/programming/00098562_0.html Aztec Code: http://www.id-russia.ru/HHP/articles/Aztec.htm Data Matrix: http://ru.wikipedia.org/wiki/Data_Matrix MaxiCode: http://ru.wikipedia.org/wiki/MaxiCode PDF417: http://ru.wikipedia.org/wiki/PDF417 QR код: http://ru.wikipedia.org/wiki/QR-код Microsoft Tag: http://ru.wikipedia.org/wiki/Microsoft_Tag Мобильные приложения: www.reader.kaywa.com, www.i-nigma.com, www.imatrix.lt Semapedia: www.semapedia.org ShotCode: http://www.shotcode.org/ ColorCode: http://www.colorzip.co.jp/

Page 103: VR-Online (April 2010)

ZeroXor [email protected]

http://zeroxor.ru

Фриланс и Закон На первый взгляд можно подумать, что такой заголовок нужен исключително для “завлекаловки” - не секрет, что броские заголовки привлекают. Увы и ах – это не пиар-ход, суровая проза жизни именно такова. И, собственно, взглядом фрилансера я и решил посмотреть на эту проблему и возможные пути ее решения.

Позволю себе напомнить ситуацию с делами судебными против фрилансеров сначала в Белоруссии, а через непродолжительное время и в России. И, само собой, что все чисто, законно и правильно со стороны налоговиков. Впрочем, об этом чуть позже, сначала разберемся с более древним способом отъема денег у фрилансеров. Чистый комп? Будь наготове! Не раз уже бывали ситуации, когда впросак попадали люди, подрабатывающие (возможно, и зарабатывающие) установкой и настройкой программного обеспечения. Если честно, я был

уверен, что после первых тревожных свистков в виде штрафов и условных сроков многие перестанут этим заниматься, либо придумают какой-либо “обходной путь”. Так нет же – в последнее время подобные новости снова появляются с завидной периодичностью, меняется, как правило, лишь город, в котором случилась такая ситуация. Попробую вкратце обрисовать, как же происходит подобное, так что, уважаемый читатель, если занимаетесь подобным – читаем и запоминаем. Пришел. Поставил. В тюрьму!!! Как правило, для получения еще одного успешно раскрытого компьютерного преступления (читай “галочки”) берется девственно чистый компьютер (возможно, с просроченным триалом винды – вызывает меньше подозрений в том, зачем человек хочет “поставить” себе нелицензионную версию, мол, был триал, да весь вышел). Естественно, “компьютерная скорая помощь” приходит во всеоружии – то бишь с несколькими дисками (естественно, не блистающими чистотой софта, записанного на них). Дальше, собственно, работа – установка пиратской винды и/или MS Office, Photoshop и всяких прочих нехороших программ. В 99% случаев весь этот процесс фиксируется на видеокамеру. Работа закончена. Вот тут-то и появляются в поле зрения корочки, наручники, скрытые камеры и прочая атрибутика. И берут незадачливого “IT-доктора” под белы руки, и предъявляют ему обвинения, обвиняя во всех смертных грехах, точнее, в нарушении статьи 146 УК РФ “Нарушение авторских и смежных прав”, мол, ограбили Вы, молодой человек бедолагу Стива сотоварищи.

Page 104: VR-Online (April 2010)

Кстати, в случае, если структуры, “выводящие на чистую воду” людей, зарабатывающих таким вот нехитрым способом переймут некоторые методы у сотрудников налоговых служб, то картина для докторов мира АйТи может стать еще печальнее. Почему – читайте дальше. Пошли все на фиг, я умею лучше! Как правило с этого девиза и уходит человек во фриланс... именно тогда, когда тупость менеджеров проектов и прочих начальственных людей переходит границы всякого терпения будущего фрилансера. И вот увольняется от из пыльного офиса, идет домой и грезит будущей благодатью фриланса. Давайте даже предположим, что у него уже есть портфолио и он профи, каких еще поискать: вот он зарегистрировался на одном из многочисленных фриланс-биржах и приступил к работе. Все замечательно: удобное рабочее место, возможность самому выбирать заказчиков, как минимум, отсеивая явных неадекватов... сказка, а не работа! Но вот видит Золушка, как часовая стрелка приближается к 12... тьфу! Извините, уважаемый мой читатель – сегодня дочка историей о Золушке зачитывалась (а зачитывал, естественно, я). Впрочем, так оно и произошло с некоторыми фрилансерами – только вместо часов были люди в сером. Что такое? Что случилось? Почему так? “Братцы живодеры, за что же вы меня?” - как поют братья Самойловы. А за нарушение ст. 198 УК РФ и ст. 171 УК РФ: уклонение от уплаты налогов и незаконная предпринимательская деятельность. Точнее, за один из этих пунктов: тут уж зависит от того, какая статья больше приглянется следователю.

Теперь вернемся к сотрудникам “компьютерной помощи” - любая из этих статей вполне может быть приплюсована к уже имеющейся у них 146-й, что никоим образом, сами понимаете, не смягчит наказание. Учим феню, сушим сухари? Пожалуй, единственный выход, который видится из такой ситуации – это приобрести статус ИП или ООО – и спать спокойно. Только вот статус человека в этом случае изменится. Что же тогда получается: говоря “я – фрилансер”, человек тем

самым говорит “я – преступник”? Получается, что именно так. Само собой, если доходы от фриланса идут довольно хорошие, то можно и переквалифицироваться в ИП, например, и спать спокойно. А что же делать, когда фриланс не приносит такого дохода, ради которого можно бросить основную работу, а спать спокойно все же хочется? Вот сейчас и попробуем разобраться с этим. “Заметка на полях: Данный материал представлен исключительно для ознакомления. Уважайте закон, каким бы он ни был.”

Page 105: VR-Online (April 2010)

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

Если у Вас есть навыки по установке и настройке свободного ПО (в частности, какого-нибудь из популярных дистрибутивов Linux) – смело выставляйте эти навыки на продажу. Естественно, спрос поначалу будет меньше, чем если бы Вы продолжали ставить Windows. Можно также заниматься установкой и настройкой свободного или фриварного ПО для Windows, того же OpenOffice, например. Не стесняйтесь предлагать пользователям что-то новое, ведь подавляющему большинству пользователей хватит того же GIMP'а, так к чему рисковать, устанавливая нелегальный

Photoshop? Убедить всегда можно, тут уж все зависит от Вашего умения убеждать других – это уже совершенно другая тема, выходящая за рамки этой статьи. Но если клиент хочет именно привычный ему софт, пусть даже и нелицензионный – здесь тоже есть решение. Я – не я, дистриба – не моя. Способом уменьшить ответственность вполне может стать установка программного обеспечения с дисков самого заказчика. Хотите установку пиратских программ – дайте мне их дистрибутивы – поставлю. В этом случае уже не может идти никакой речи о распространении контрафактного ПО, максимум о его установке. Естественно, о том, что пиратских дистрибутивов у Вас нет и вся установка подобного софта – только с дисков заказчика – нужно договариваться заранее, либо отказываться от установки. В случае “контрольной закупки”, по сути, нечего будет Вам предъявить. Да и не состоится она – ведь людям в погонах важно, чтобы установка контрафакта проводилась именно с Ваших дисков. Естественно “незаконную предпринимательскую деятельность” никто не отменял, но пока, к счастью, прецедентов с предъявлением ст. 171 УК РФ не было (по крайней мере, у меня такой информации нет). В общем, можно спать (а также жить и работать) уже спокойнее. Фриланс – свобода? Теперь поговорим о фрилансерах, которые зарабатывают написанием стетей, дизайном, версткой, программированием etc. В последнее время принялись и за них, причем судебные прецеденты уже были созданы, и закончились они благоприятно отнюдь не для нашего брата. Так что не факт, что завтра и в Вашу дверь не постучится представитель налоговой инспекции.

Page 106: VR-Online (April 2010)

Риск – дело, конечно, благородное, но лично я предпочитаю порядок и возможность максимально контролировать свою дальнейшую жизнь. Потому и вывел для себя некоторые правила, о которых и хочу сейчас рассказать. В основном они касаются, конечно, работы с электронными валютами, “благодаря” которым и появляется возможность “прицепить” к фрилансеру неуплату налогов. Посредством webmoney... Надеюсь, для Вас уже не является секретом, что любой банк предоставит всю информацию по любому из своих клиентов по первому же запросу гос. структур. Отсюда следует простой и понятный вывод: несмотря на то, что именно банки предоставляют максимально низкий процент по обналу средств из электронных кошельков, это не наш метод. Что же касается обменников, то в случае обращения к ним – оставленный процент будет выше, зато и уровень анонимности – тоже. Правда, сейчас WebMoney ввели обнал по паспорту: то бишь, приходишь снимать деньги – приносишь свой паспорт, при всем при том нужно, чтобы ФИО и прописка в паспорте совпали с аналогичными данными регистратора кошелька. Впрочем, как говорится, на любое действие есть и противодействие – активизировались “черные” обменники, которым нет дела до Вашего имени-отчества, главное, чтобы код протекции совпал. Хотя никто не гарантирует, что за углом такого обменника Вас не будут поджидать несколько мордоворотов с битами, желающие во что бы то ни стало вернуть купюры в родную контору, есть и плюс – в случае любой проверки хоть со стороны webmoney, хоть со стороны наших доблестных гос. структур отдуваться будет тот, кто производил для Вас вывод средств, причем отдуваться будет целиком и по полной программе... если, конечно, Вас не прижмет в этот момент вывести очередную сумму. Лично мне хватает обычного не связанного с банком обменника (“серого”, так сказать). Конечно, до него добираться немного дольше, чем до банка и проценты в 5 раз выше – только вот и найти место (если уж заинтересуются), где проводился обнал, будет не так просто. Немного о фриланс-биржах. Многие, уходя во фриланс, регистрируются на одной из бирж фрилансеров (free-lance.ru и иже с ними), да так и остаются работать исключительно через эти самые биржи. А никого не смущает, что в один пасмурный день некие товарищи в костюмах могут прийти и, опечатав сервера, отправить жесткие диски на тотальный досмотр? Почему бы нет – не единожды в России проходили подобные опечатывательные мероприятия – почему бы не побороться с незаконными предпринимателями? Ведь те проценты, что снимаются с фрилансеров во время проведения сделок – снимаются вовсе не на уплату налогов, а на карман владельцев фриланс биржи (Кстати, платят ли они налоги с этого? :) ). Это так, небольшая пища для ума. Я клоню к тому, что фрилансер должен все-таки развиваться. А самый главный показатель развития человека как фрилансера – его постоянные клиенты: как “ближние”, так и “дальние”.

Page 107: VR-Online (April 2010)

Клиент ближний – на пропитание, дальний – на развитие. А вообще, скажу я Вам, стараюсь не выводить заработанные в Сети деньги в реал. Причина проста до банальности: мои заказчики делятся на две категории: “Ближние”. Люди из моего города/области, нашедшие меня по рекомендациям друзей/знакомых. Рассчитываются наличными. Этих людей я стараюсь изо всех сил сделать постоянными клиентами, например, помимо создания сайта предлагаю и его регулярные бэкапы, поддержку, обновления, доработку, наполнение и прочая, прочая, прочая. Зачастую подобное предложение, особенно для людей занятых, является просто находкой и они с большой радостью отдают несколько килорублей в месяц, чтобы только не касаться сайта, но быть уверенными, что этот самый сайт работает. Вполне понятно, что им тоже не нужны лишние головняки на тему договоров подряда и усложнения собственных налоговых схем – значит, “никто никому ничего не платил” - в этом можно быть практически уверенным.

“Дальние”. Понятно, что к этой категории причисляются те, кто переводит оплату за работу через электронные платежные системы. Как я упоминал выше, эти средства я по возможности стараюсь не обналичивать, а тратить прямо в Сети. На что? Да мало ли: домены, хостинги, покупка ссылок и прочее платное SEO/SMO. Если денег скапливается... более-менее нормальная сумма, то вполне можно купить в Интернет-магазине какой-нибудь подходящий и нужный гаджет... опять же книги – вовсе не обязательно толкаться в книжных магазинах между читателями Донцовой и почитателями Робски – вполне реально заказать себе свежую книгу серии “* глазами хакера”, оплатив ее электронными деньгами. Легальный бизне$$. Впрочим, если заказчик не против, то на каждую работу можно заключить и договор подряда. В таком случае Вы получите за свою работу несколько меньшую сумму, поскольку часть ее уйдет на налог с Вашей же работы. Помимо лишней волокиты и меньшего заработка есть и плюсы – в этом случае налоги с выполненной Вами работы оформляет Ваш наниматель (и платит, соответственно, тоже), значит, к Вам никаких претензий со стороны закона быть не может. Вы просто-напросто устроились на работу в качестве наемной силы, а вовсе даже не юр. лица, потому вся забота о налогах с Вас целиком и полностью лежит на работодателе. Если уж кого и взгреют в этом случае – то точно не Вас. P.S.

Page 108: VR-Online (April 2010)

Конечно, каждый человек имеет свободу выбора. Если не хочется держать в памяти или просто понимать все то, что тут было расписано – вперед на биржу вакансий, работы – два вагона и еще чуть-чуть. Ну а если уж фриланс-свобода, то лучше, IMO, подготовиться к возможным последствиям хотя бы немного, хотя бы с помощью этой статьи. “Хочешь мира – готовься к войне”, как говорится. Ну и на самую закуску приведу несколько высказываний о том, что наши законотворцы – [strike]хрено[/strike] не очень хорошие “программеры”, раз уж их творения работают таким вот образом. Впрочем, лучше уж так, чем совсем никак. P.P.S. Каждый виновен до тех пор, пока не доказана его невиновность и даже после этого. (Квинтессоны, “Трансформеры Кино”) Был бы человек, а статья найдется (прокурорская поговорка) То что вы на свободе - это не Ваша заслуга, а наша недоработка (Ф. Э. Дзержинский) Ignorantia juris nocet. — Незнание закона вредит (т.е. не может служить оправданием) (римский правовед Юлий Павел, III в.) Незнание закона не освобождает от ответственности. А вот знание нередко освобождает. (Станислав Ежи Лец, “Непричесанные мысли”) Закон что дышло: как повернул, так и вышло. (русская народная пословица) Думай, Форест. Думай. (Антон Творог, “Ядерный Титбит”)

Page 109: VR-Online (April 2010)
Page 110: VR-Online (April 2010)

Стараюсь относиться ко всему лояльно, но некоторые "житейские" моменты меня все же

напрягают, и при долгом их воздействии возникают приступы тошноты. Многие из нас, наверное, страдают СМС'очной болезнью, так вот, мои подруги видимо уже на последней стадии развития этой болезни, т.к. я уже, просто, не в силах стирать сообщения, но беспокоит даже не это. Содержание сообщений, которые я получаю в большом количестве, кроме как "привет", "как дела?", "что делаешь?", особо друг от друга не отличаются. Мне иной раз хочется, кричать: - "Читайте книги, #%@&!". Не скажу, что девушки глупые, но извините меня, каждый раз получать одно и тоже, не просто напрягает, а выворачивает наизнанку от такой тупости. Серьезно, читайте книги! Развивайтесь! Господа и дамы! :)

Антон Козлов aka Jimmy Jonezz

Ну ладно, с первым курсом еще все понятно. Начало обучения, все дела. Это объясняет наличие большого количества разносторонних предметов. Скажу, что учусь в государственном универе, который имеет педагогическую направленность (так уж вышло). Но моя специальность чисто инженерная и называется примерно так «Защита информации в компьютерных сетях». Но с каждым годом я все больше и больше вижу, что такими важными предметами, как программирование, компьютерные сети и подобными важными темами занимаются только некоторые преподаватели, которые их преподают, любят это дело и, несомненно, заслуживают уважения за свои знания. Вот только передать их своим ученикам особо возможностей нет. У нас, почему то считается, что социология это архиважный предмет. А по педагогике так завалят, что о программировании не очень то и думаешь. Что такое, парень? Хочешь стать программистом? Ха-ха, не смеши людей! Сначала подучи ОБЖ! Моя знакомая учиться почти на такую же специальность, как и я (в другом университете), только вместо педагогики у нее примеси экономики. Контрольным выстрелом в мое сердце стала новость, что она будет писать курсовую по компьютерным сетям, про безопасность беспроводных сетей. Сквозь слезы, в последнюю ночь перед сдачей, с часу ночи до пяти утра я ваял свой курсач. Но у меня он, почему то, по педагогике. Многие могут возразить, мол, зачем поступил в этот университет, или вообще хватит плакать и читай больше книг. Там про все написано. Так и делаю, народ. Но все равно меня эта глупость добивает. Получается такой себе конвейер, по производству учителей информатики, которые будут подготавливать таких же учителей информатики, что бы те, в свое время, смогли обучить еще одну партию себе подобных. Роман Волков aka Kastor Прочитав заметку в блоге Булай Никиты (bulaj.ru), я был не то, чтобы удивлен, я был убит тупостью "программистов". Ну как, как нельзя знать о том, что слова "асм" и "ассемблер" обозначают одно и тоже, а именно язык программирования? И такие ламоразмы очень часто приходится слышать и читать, и говорят это не гопники с соседнего двора, а люди,занимающиеся программированием! Вот именно с таких людей получаются быдло-кодеры. А в чем проблема? В лени и не желании учиться. Многим молодым людям хочется взять все и сразу, не прилагая никаких усилий. Они никогда самостоятельно не прочтут книги или статьи о той или иной технологии, никогда не будут пробовать что-то делать сами а тупо задатут вопрос на форуме и нагло спишут код, порой даже не поблагодарив.

Page 111: VR-Online (April 2010)

Вот именно от этого мне часто хочется блевать и материться. А отличие форума VR в том, что здесь за тебя не будут делать работу, тебе покажут статью, материал, познакомят с технологией, и учись, занимайся, развивайся. Ибо код копипастить все умеют, а реально учиться и познавать самостоятельно нет. Автор: Дмитрий Редькин aka zahod5277 Я долго не знал, что написать. Вроде месяц прошел в нормальном режиме. Никаких раздражителей и прочего негатива. Даже и писать-то не о чем, но потом я включил телик и сразу нашел тему для размышлений. Само собой меня в очередной раз затошнило от нашего любимого государства. Может случайность, а может мой желудок сильно реагирует на этот ингредиент. Рассказываю подробности. Близится День Победы и по традиции ребята сверху решили сделать подарок дорогим нашим ветеранам. Тем, кто рисковал своей жизнью и подарил нам свободу, счастье и возможность родиться. Тем, про кого потом неоднократно забывали, тем которые за свое благое дело вынуждены не жить, а существовать. Угадай, что им захотели подарить? По такому случаю подарок должен быть хорошим! +1 тебе в карму, если ты сказал слово "квартира". Да, героям решили сделать грандиозный подарок! Вроде все клево и справедливо, но без эксцессов как всегда не обошлось. Ну не могут в нашей Великой Стране ничего подарить просто так (со стороны власти). Во всяком случае, я в это не верю. Оказывается, что некоторые хитрожопые чиновники (в отдельных городах), на фоне всего этого решили замутить квартиры своей родне. Нормально? Само собой, некоторые ветераны остались с носом. Как такое вообще могло случиться? Где контроль со стороны высших органов? Где совесть тех, кто смог поднять руку на имущество беззащитных ветеранов? Я сейчас хочу начать ругаться громким матом, потому что других слов просто не могу подобрать. Разве подобные поступки нельзя сравнить с фашизмом и беспределом? Увы, у тех кто это совершал другая, правда. С этим все ясно. Попросту лить слова не охота. Лучше немного поговорю о самом подарке. Какой сегодня год? 1945, 1980? Нет, сегодня 2010!!!! Прошло уже долгих 65-лет, а героев до сих пор не смогли отблагодарить по достоинству. Не уже ли нельзя это было сделать намного раньше? Хотя бы лет 20 назад. Я думаю, что это более, чем реально. Затраты на покупку/строительство квартир не такие уж и большие. Особенно если учесть, что деньги постоянно трелюют направо и налево. Мне стыдно, что в такой Великой Стране многие из чиновников ведут себя так низко и мерзко. А может все дело не в чиновниках, а в нас с вами? Может, это мы допускаем такого отношения? Нас кидают, а мы злимся и просто забиваем. Может время что-то менять? Игорь Антонов aka Spider_NET Как же меня достал общественный транспорт! По разным причинам я не могу себе позволить сейчас покупку и содержание автомобиля. Поэтому приходится пользоваться услугами общественного транспорта. По утрам в автобусах ахтунг. Народу битком. Даже на работу из-за этого не хочется ехать. Но больше всего бесит толстая тётя-кондуктор, которая, как ледокол, перемещается среди народа с целью сбора финансов =) Как же меня раздражают пользователи твиттера, которые пишут всякий бред типа “Я почистил зубы”, “Сходил в туалет”, “Посмотрел телевизор” и т.д. Да мне насрать чем ты там занимался! Это – абсолютно ненужная для меня информация. Я этого человека даже в глаза ни разу то не видел. Именно поэтому, наверное, я зафоловил всего 37 человек за пол года =) Бесит читать бред! Пишите что-нить полезное и интересное :)

Page 112: VR-Online (April 2010)

Роман Костенко aka Lord_of_Fear

Page 113: VR-Online (April 2010)
Page 114: VR-Online (April 2010)

Никита Булай aka Bulka [email protected]

Исследование утечек за 2009 год. Виды, каналы распространения, защита

Мировой финансовый кризис все никак не завершится. Компании яростно сражаются за каждую копейку, чтобы не потерять свой стабильный доход. Их сотрудники так же стараются работать усердно и прилежно, чтобы сохранить свое рабочее место. Однако в любой более-менее большой и серьезной компании есть и недобросовестные работники, которые готовы продать любую важную информацию своему конкуренту за определенную сумму. Или же простые халатные сотрудники, забывающие, например, стереть конфиденциальную информацию со списанных носителей. Так вот к чему я это все веду. В рамках данной статьи я хочу рассмотреть отчет, сделанный компанией InfoWatch и касающийся исследования утечек за 2009 год. Как бы это ни было прискорбно, но количество случаев попадания важной информации в чужие руки увеличивается и по некоторым прогнозам не собирается уменьшаться. Я считаю, что врага надо знать в лицо, и именно поэтому обо всем этом сейчас расскажу подробнее. Статистика утечек Как я сказал выше, количество утечек постоянно растет. Об этом свидетельствует тот факт, что в первом полугодии 2009 количество утечек равнялось 2,3 утечки в сутки, по сравнению с аналогичным периодом 2008, где их число было 1,4 в сутки. Всего в 2008 году было зафиксировано 530 случаев «сливания» информации, а в 2009 – 735. Это стабильный прирост в 39%, что не очень-то и радует, ведь потери от подобных утечек иногда бывают колоссальными, но об этом чуть ниже. К борьбе против попадания секретной информации в чужие руки присоединяется все больше государств. Так, например, в Великобритании и России были введены некоторые нормативные акты, регулирующие сообщения об утечках. Благодаря этому в первой вышеуказанной стране было выявлено 125 подобных инцидентов (54 за 2008 год), во второй – 30 (6 за 2008). Как сообщают аналитики InfoWatch, другие страны не проявили должного интереса к данной проблеме. Что ж, тем хуже для них. Среднее число персональных данных (ПД) в расчёте на одну утечку — 754 тысячи, хотя присутствуют инциденты с количеством утекших записей в количестве 1, 2 или 5. По сравнению с предыдущими данными за период 2006-2008 год этот показатель неустанно и стабильно увеличивался, причем с 2008 на 2009 год чуть ли не в два раза: 2009 — около 754 000, 2008 — около 405 000, 2007 — около 608 000, 2006 — около 177 000. Причинами такого роста являются постоянное увеличение количества сайтов в сети, предоставляющих банковские услуги, фишинг, отсутствие желания или средств для обеспечения безопасности конфиденциальной информации и прочие факторы. Хотя стоит признать, что хоть рост количества фиксируемых утечек и продолжился, но он

Page 115: VR-Online (April 2010)

замедлился. Возможные на то причины: финансовый кризис, повышение латентности, массовые внедрения DLP-систем. Кстати последние все больше набирают обороты, поэтому стоит пояснить, что это такое. DLP-системы (Data Leak Prevention, DLP) — технологии (или технические устройства) предотвращения утечек конфиденциальной информации из информационной системы вовне. DLP-системы строятся на анализе потоков данных, пересекающих периметр защищаемой информационной системы. При детектировании в этом потоке конфиденциальной информации срабатывает активная компонента системы, и передача сообщения (пакета, потока, сессии) блокируется. Все тонкости подобных систем я пояснять не буду, при желании вы можете сами почитать о них на Википедии (http://ru.wikipedia.org/wiki/Предотвращение_утечек). А я продолжу наш обзор. Источники и разновидности утечек В начале статьи я писал, что информацию могут слить как специально (ради денег, нового рабочего места или просто так, из мести), так и случайно. На основе этого все утечки подразделяются на умышленные и неумышленные. В наше время, в период этого злосчастного финансово кризиса (чтоб его!) количество умышленных случаев слития информации преобладает над неумышленными, что видно из следующей таблицы:

2009 2008 2007 Вид утечек

Кол-во % Кол-во % Кол-во %

Умышленные 375 51,0% 241 45,5% 154 29%

Случайные 320 43,5% 223 42,1% 376 71%

Не установлено 40 5,4% 66 12,5% n/a n/a

По сравнению с 2008 годом количество умышленных утечек увеличилось в два раза, причем, как видно, оно продолжало расти с 2007 года. В отличие от умышленных, тенденции роста случайных утечек немного расходятся: изначально они уменьшаются с 376 до 223, затем вновь повышаются до 320. Данный факт можно объяснить внедрением вышеописанных DLP-систем и специальных подходов к организации структуры информационной безопасности на предприятия. В случае внедрения технологий предотвращения утечек неумышленное сливание информации сводится к критическому минимуму, а то и вовсе отсутствует. Но с другой стороны важная информация имеет свою цену. И в период денежной недостаточности стоимость конфиденциальных данных растет. Именно данный фактор повышает стимул к умышленной продажи информации для потенциальных инсайдеров, что и происходит в действительности, повышая доли инцидентов со злым умыслом. По прогнозам аналитиков из InfoWatch, доля умышленных утечек в ближайшее время будет неуклонно расти. Источниками публичных утечек, о которых мы могли слышать их разнообразных СМИ, делятся на три категории: государственные учреждения, коммерческие предприятия, а также учебные заведения и общественные, некоммерческие структуры. Таблица распределения источников утечек по видам организаций представлена ниже:

Вид организаций 2009 2008

Page 116: VR-Online (April 2010)

Кол-во % Кол-во %

Коммерческие 454 61,8% 296 55,8%

Государственные 154 21,0% 104 19,6%

Образовательные и некоммерческие 98 13,3% 127 24,0%

Не установлено 29 3,9% 3 0,6%

По сравнению в 2008 годом, доля утечек в коммерческих организациях серьезно увеличилась, и как отмечают специалисты, будет продолжаться. Объяснить такой поворот дел можно по-разному. В отличие от государственных организаций в коммерческих отсутствует формализация и упорядочивание процессов обработки информации. Второй причиной увеличения количества утечек может служить опять таки финансовый кризис. Думаю многим известно, что именно он повлек за собой массовое увольнение сотрудников даже в таких огромных и серьезных компания, как Google и Microsoft. За счет кризиса стимулируется конкуренция на рынке, что и повышает стоимость информации. Как было сказано мною выше, уволенные или недобросовестные сотрудники, имевшие доступ к какой либо конфиденциальной информации, запросто могут слить ее конкурирующей организации. Учебные учреждения на рост умышленных случаев слития информации никак не влияют. Ну это и понятно, кому нужны оценки Васи Пупкина и Васи Козлова? Персональные данные студентов не являются инструментом недобросовестной конкуренции и не представляют из себя коммерческую выгоду. А уменьшению числа утечек в данном секторе способствует введение упорядоченных процессов обработки информации. Распределение утечек по трем видам организаций для случайных и умышленных случаев представлено в таблице:

Умышленные Случайные Вид организаций

Кол-во % Кол-во %

Коммерческие 239 63,7% 192 60,0%

Государственные 77 20,5% 67 20,9%

Образовательные и некоммерческие 42 11,2% 51 15,9%

Не установлено 17 4,5% 10 3,1%

Из данной таблицы видно, что значения случайных и умышленных утечек информации примерно одинаковы. Отсюда можно сделать вывод, что степень оснащённости предприятий разных отраслей средствами защиты информации примерно одинакова. Поэтому производителям средств защиты нет смысла выпускать свою продукцию в разных вариантах для государственных и негосударственных информационных систем. Каналы и типы сливаемой информации Как и в 2008 году, персональные данные составляют подавляющее большинство всех зафиксированных утечек — 89,8%. После идет коммерческая тайна - 3,5%, затем Государственная и военная тайна – 1,8%. Доля разносторонней конфиденциальной информации равна 4,4%:

Page 117: VR-Online (April 2010)

По сравнению с 2008 годом каналы утечки информации несколько изменились:

2009 2008 Канал утечки

Кол-во % Кол-во %

Мобильный компьютер (ноутбук, КПК) 98 13,3 103 19,4

Мобильный носитель (флэш-накопитель, CD/ DVD, др.) 34 4,6 30 5,7

Настольный компьютер, сервер, НЖМД 107 14,6 40 7,5

Интернет 134 18,2 112 21,1

Бумажный документ 146 19,9 28 5,3

Архивный носитель 54 7,3 17 3,2

Электронная почта 39 5,3 12 2,3

Другой 53 7,2 15 2,8

Не установлено 70 9,5 173 32,6

Если в 2008 году в своем большинстве данные сливались в основном через Интернет (21,1%), то в 2009 году это происходило в основном через бумажные документы (19,9%). Видимо хакерский способ добычи полезной информации под названием «копание в помойке» стал набирать обороты :). DLP-системы не могут осуществлять надзор над бумажной информации, поэтому защитить ее могут только организационные моменты на предприятии. Вторым каналом распространения является Интернет. За 2009 году его доля в общей статистике равна 18,2%. В принципе это не вызывает удивления. Просто огромное количество разнообразного вредоносного программного обеспечения, бесплатные файловые хранилища, электронная почта со слабым паролем и ICQ переписка – далеко не все пути кражи информации. Немного удивила доля архивных носителей, которая с 3,2% за 2008 год поднялась до 7,3% в 2009 году. Как известно, архивные копии информации очень редко шифруются. Это может привести к плачевным последствиям при утрате носителя с архивной копии данных. И опять же, обычные DLP-системы не способны защитить компанию от подобного рода утечек. Здесь требуются более дорогие решения, на которые не хотят затрачиваться, полагаясь на удачу.

Page 118: VR-Online (April 2010)

Доля мобильных носителей в общем рейтинге уменьшилась. Сливание информации данным путем в основном подразумевает потерю или кражу носителя информации (КПК, мобильного телефона, ноутбука). Защититься от подобного в принципе крайне легко – достаточно «криптовать» данные. На сегодняшний день существует большое количество разнообразного ПО для шифрования информации, в том числе и бесплатного. По мнению аналитиков из InfoWatch, именно использование таких программ и послужило заметному снижению доли утечек через мобильные устройства. Вторым примером может послужить списанное или отправленное в ремонт оборудование (жесткие диски, флеш-носители, CD/DVD-R), содержащее конфиденциальную информацию. Зачастую сотрудники компании даже не удосуживаются затереть данные на них, или же ограничиваются простым удалением файлов. Но мы-то люди говорящие с компьютером на «ты» и прекрасно понимаем, что обычного удаления файлов стандартными средствами недостаточно, чтобы их не смогли восстановить. Поэтому на серьезных предприятиях в обязательном порядке должно присутствовать программное обеспечение, специально разработанное для таких целей. Как пример – Paragon Disk Wiper. Теперь рассмотрим, как распределены по видам носителей умышленные и случайные утечки по отдельности:

Умышленные утечки

Случайные утечки Тип носителя

Кол-во % Кол-во %

Мобильный компьютер (ноутбук, КПК) 59 15,7 31 9,7

Мобильный носитель (флэш-накопитель, CD, DVD и т.д.) 8 2,1 24 7,5

Настольный компьютер, сервер, НЖМД 78 20,8 26 8,1

Интернет 67 17,9 63 19,7

Бумажный документ 27 7,2 115 35,9

Архивный носитель 33 8,8 15 4,7

Электронная почта 11 2,9 27 8,4

Другой 41 10,9 6 1,9

Не установлено 51 13,6 13 4,1

Всего 375 100 320 100

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

Page 119: VR-Online (April 2010)

Страна Число утечек %

Великобритания 125 17,01%

США 481 65,44%

Ирландия 7 0,95%

Новая Зеландия 5 0,68%

Канада 20 2,72%

Австралия 11 1,50%

Чехия 3 0,41%

Швеция 2 0,27%

Россия 30 4,08%

Норвегия 1 0,14%

Сингапур 1 0,14%

Словакия 1 0,14%

Израиль 1 0,14%

Япония 13 1,77%

Куба 1 0,14%

Германия 5 0,68%

Нидерланды 1 0,14%

Испания 2 0,27%

Франция 2 0,27%

Корея 1 0,14%

Филиппины 1 0,14%

Китай 4 0,54%

Индия 2 0,27%

Утечки мирового масштаба 5 0,68%

Страна не установлена 9 1,22%

Лидирующее место в данной таблице занимает США с 481 зафиксированными утечками. Это просто огромное число, почему же Западные компании так халатны к данным своих компании? Второе место занимает Великобритания с цифрой 125, а третье – Россия (35). Примечательно, что нашей страны в данной таблице нет. Хотя этого стоило ожидать, лично я не могу представить себе информацию, которая являлась бы утечкой мирового масштаба от нашей Республики. Тем лучше для нас :). Методы защиты от утечек Ну что ж, пришло время рассказать о способах, призванных защитить компании от нежелательных утечек информации. Прежде всего, это оговоренные ранее DLP-системы, причем достаточно дорогие. Как я отмечал ренее, они помогут максимально защитить предприятие от случайной утечки данных, а так же от некоторых умышленных. DLP-система – «фундамент» для защиты конфиденциальных данных. Вторым эшелоном обороны послужит обязательные проведения организационных

Page 120: VR-Online (April 2010)

мероприятий, повышение осведомленности персонала о способах и каналах утечки информации. Вспомните социальных инженеров, которые профессионально воруют информацию, обманывая тех же операторов ПК или любых других сотрудников. Ежегодно приглашайте специалистов, проводите семинары, тесты, курсы, направленные на обучение персонала противостоять самым банальным каналам сливания информации. Отличным и действенным методом противодействия умышленным и неумышленным утечкам является разграничение прав доступа к информации. То есть менеджер по продажам, например, не должен иметь доступа к исходным кодам программы точно так же, как и программисты к данным по продажам. Насколько мне известно, такая строгая политика применяется в Лабораториях Касперского. Свою роль в борьбе с утечками играет так же и государство, которое вводит некоторые меры по защите информации: стандартизацию и сертификацию деятельности, направленной против слития информации, установление санкций за произошедшие инциденты, обязанность информировать граждан, персональные данные которых утеряны, утрачены или разглашены. Если вы все же являетесь собственником предприятия, потрудитесь придерживаться государственных стандартов. И последним, заключительным и действенным методом защиты данных, в особенности бумажных и хранящихся на электронных носителях, станет их шифрование и уничтожение специальными методами. Так, например, для документов, которые надо утилизировать, требуется приобрести специальное оборудование, которое будет уничтожать их безвозвратно. Все резервные копии, а так же информацию на жестких дисках, ноутбуках, КПК и прочем стоит строго шифровать, чтобы при потере или краже никто не смог получить к ним доступ. Это касается и носителей, хранящих архивные копии данных, ведь как показала статистика за 2009 год – их доля значительно увеличилась. Вышеперечисленные меры помогают достаточного хорошо защитить информацию от утечки, но не могут гарантировать этого на 100%. Все же злоумышленник может найти способ обхода, дать взятку или придумать что либо в этом роде. Главное вовремя это обнаружить и пресечь. Все в ваших руках! Заключение В завершение статьи хотелось бы сделать некоторые выводы. Из всего выше описанного мы имеем: 1. Стабильный, но замедленный рост общего количества фиксируемых утечек. Этому способствуют некоторые действия со стороны государств (нормативные акты об обязательном уведомлении об утечках) и СМИ. 2. Увеличение умышленных случаев слития информации и уменьшение случайных. Первое связанно с мировым финансовым кризисом, второе – с внедрением DLP-систем. 3. Рост количества утечек на коммерческих и государственных предприятиях, спад в учебных учреждениях. Первое объясняется все тем же кризисом, второе – введением упорядоченных процессов обработки информации. 4. Современные компании отдают предпочтение компьютерным средствам по защите от попадания конфиденциальных данных в чужие руки, не уделяя внимания повышению осведомленности персонала и организационным мерам. Это видно из повышения доли утечек через бумажные документы.

Page 121: VR-Online (April 2010)

5. Основную долю от всех зафиксированных утечек составляют персональные данные пользователей. Это связано с большим числом вредоносных программ, крадущих пароли и прочую личную информацию, увеличением числа сайтов с услугой онлайн банкинга, фишинга. 6. Сдвинулся с мёртвой точки процесс шифрования информации на мобильных носителях, о чем свидетельствуют данные за 2008 и2009 год. Это самый простой и дешёвый способ защититься от самого распространённого вида утечки. Аналитики из InfoWatch прогнозируют, что данный процесс будет прогрессировать в будущем. Вот такие вот пироги. Прочитав все это, советую вам пересмотреть политику своей компании, направленную на защиту всей конфиденциальной информации. Удачи! P.S. Спасибо Николаю Федотову, аналитику InfoWatch, за проведенное исследование.

Page 122: VR-Online (April 2010)

Волков Роман aka Kastor [email protected]

Вардрайвинг по-взрослому Картографирование местности

За написанную мной программу (которую препод ждет с прошлого семестра), за оставленный взамен мобильный телефон и просто за хорошее поведение я одолжил на эти выходные смартфон Nokia N95 у своего одногруппника. А причина этому одна – я заколебался держать в голове расположение всех точек доступа, которые мне удалось найти. Пора бы все это дело как то сохранить, скажем, нанести положение всех АР на карту. Будет очень удобно пользоваться такой фишкой. Глянул и сразу видно, на какой улице недалеко от тебя есть открытые Wi-Fi сети, через которые может быть получится выйти в инет или просто исследовать их. А возможно тебе, как и в моем случае, просто интересно насколько развито используются беспроводные сети в твоем городе. Если это так, то можешь уже начинать искать, хоть какой ни будь GPS приемник. Без него в нашем деле никуда. При нахождении очередной точки доступа мы будем считывать координаты, которые он нам выдаст, и записывать их вместе с информацией о найденной АР в лог файл. Если ты раздобыл, какой либо внешний GPS приемник, то подключай его к ноутбуку и попробуй использовать его вместе с программой NetStumbler. В пункте меню «View->Options» на вкладке «GPS» необходимо будет выставить соответствующие настройки для твоего приемника (протокол, порт и т. д.). Далее запускаешь сканирование и гуляешь по городу. При нахождении точки доступа, вся доступная информация о ней будет записываться в лог файл (с расширением *.ns1). Так же, в этот лог файл попадут координаты, в которых и была обнаружена АР. Я думаю понятно, что запишутся долгота и широта того места, где была найдена беспроводная сеть, а не именно ее место расположение. Учитывая, что в N95 Wi-Fi адаптер совсем хилый, это практически одно и тоже. Закончив прогулку, можешь при помощи программы StumbVerter импортировать логи стамблера в Microsoft MapPoint. Последняя программа как раз и визуализирует найденные АР на карте. Если ты хочешь использовать Google Earth, то можешь воспользоваться сервисом http://www.gpsvisualizer.com/map_input?form=wifi для конвертации логов в соответствующий формат. Мне же с GPS адаптером повезло меньше. Встроенный в N95 никак не хотел контактовать с NetStumbler, следовательно, придется ему работать на пару со своим же Wi-Fi адаптером, а не в связке с ноутбуком. Раз такое дело, то будем использовать одну классную программу, которая называется PyNetMony. Ее назначение и функционал очень богаты, но мы рассмотрим возможности, касающиеся только картографирования беспроводных сетей. Она может запускать GPS и Wi-Fi нашего N95 и при нахождении точки доступа, записывать всю необходимую информацию в лог. Данная программа написана с помощью языка Python. Поэтому, для ее работы необходимо скачать файл Python для S60 1.4.5 (например, здесь http://handheld.softpedia.com/get/Developer-Tools/Application-Builders/Python-for-S60-63457.shtml). Устанавливаем приложение не на флешку, а именно в память телефона, то есть на диск С. Далее качаем непосредственно PyNetMony (можно взять вот тут http://www.file-upload.net/download-1435770/PyNetMony_2_02_03.zip.html). Распаковываем архив и видим в нем кучу файлов с расширениями *.sis. А теперь я обрадую тебя – все эти файлы необходимо будет установить, а перед этим подписать их. Для их подписи заходим на сайт

Page 123: VR-Online (April 2010)

https://www.symbiansigned.com/app/page/public/openSignedOnline.do и вводим в определенные поля IMEI своего смартфона, адрес электронной почты, а так же выбираем приложение для подписи. Но перед этим, все файлы необходимо переименовать так, что бы в их названии не было лишних знаков (только буквы и цифры). Вводишь код, указанный на картинке и тебе на почту присылают письмо со ссылкой для подтверждения операции. Кликаешь по ней. Через 2-5 минут на почту придет уже другое письмо, где будет ссылка для скачивания подписанного файла. Эту операцию необходимо проделать для всех файлов *.sis из архива. Да, придется убить немного времени на это занятие. Но как по мне, оно того стоит. Соглашаясь со всеми выскакивающими сообщениями, устанавливаем файлы на телефон (так же на диск С) в следующем порядке: 1. locationrequestor_3rd_unsigned.sis (http://usa.dpeddi.com/locationrequestor_3rd_unsigned.sis) 2. wlantools-PyS60_1_4_4_3rdEdFP1-OMAP2420-unsigned.sis (http://chris.berger.cx/uploads/PyS60/wlantools/) 3. lightblue-0.3.3-s60-3rdEd_freedevcert.sis (http://lightblue.sourceforge.net) 4. blues_3rd_1_0_0_unsigned.SIS (http://sourceforge.net/project/showfiles.php?group_id=132176) 5. envy_3rd_1_0_4_unsigned.SIS (http://sourceforge.net/project/showfiles.php?group_id=132176) 6. elocation-PyS60_1_4_5_3rdEdFP1-unsigned.sis (http://chris.berger.cx/uploads/PyS60/elocation/) 7. miso-1.95-s60_31_dev.sis (http://www.hiit.fi/files/fi/da/miso/utils/web/) 8. PyNetMony_2_02_03_unsigned.sis (http://pynetmony.googlepages.com) После этих мучений приложение готово к использованию. Классная картинка, где изображены различные антенны, прикрепленные к какой-то вышке, ознаменует запуск программы. PyNetMony имеет множество вкладок, но нам реально понадобится только одна, под названием «WLAN». Здесь будет выводиться информация о найденных сетях, а так же количество всего найденных, занесенных в лог, и новых беспроводных сетей.

Page 124: VR-Online (April 2010)

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

Наконец-то все готово! Столько усилий, ожидания и теперь смартфон готов к бою. Складываю слайдер (программа продолжает работать в фоновом режиме) и иду в обход своего квартала для проверки. Я уже знаю, где и какие поблизости есть сети. Просто хочу убедиться в работоспособности этой программы перед поездкой. Вот он, магазин с открытыми всем глазам беспроводными камерами; а вот и незащищенная АР редакции газеты с выходом в Интернет. Прохожу еще парочку соседних дворов, гостиницу и я дома у компьютера, готовый скидывать полученные лог файлы в Google Earth. Да-да, программа умеет сохранять лог файлы в формате *.kml, которые можно будет открыть в «Планете Земля». Для этого заходи в Options->Database->WLAN to KML.

Page 125: VR-Online (April 2010)

Все данные будут сохранены в трех файлах: pynetmony_open_wlan.kml – содержит данные о всех найденных открытых сетях; pynetmony_wep_wlan.kml – в этом хранятся данные о сетях, которые зашифрованы WEP; pynetmony_wpa_wlan.kml – соответственно хранит сведения о сетях с WPA шифрованием. Они находятся в «C:\Others\PyNetMony». По очереди открываем эти файлы в Google Earth и наблюдаем, как на снимках с космоса твоего района появляются зеленые точки (открытые сети), желтые (с WEP шифрованием) и красные (с WPA шифрованием). В моем случае, среди десятка найденных в пределах двух кварталов сетей, красной была только одна точка. Можешь угадать, чья она =). Клацнув на любую из них, появится информация о выбранной сети: ее мак адрес, название и шифрование. Не густо конечно, но уже что то. Убедившись, что все работает как надо, я поспешил выкатывать свой скутер. Вечер воскресенья, машин, гаишников и пешеходов наверняка будет мало. Самое оно погонять по городу и наловить сетей. Завожу двигатель для прогрева и в последний раз убеждаюсь, что GPS и Wi-Fi работают как положено. Все отлично. Кладу смартфон в грудной карман кожанки, опускаю стекло шлема и, потихоньку, выкручивая ручку газа, выезжаю на дорогу. Потихоньку, потому что помню об интервале сканирования. Он равен целым 10 секундам. Если ехать слишком быстро, то можно пропустить львиную долю сетей. Первым делом заезжаю на заправку и заливаю полный бак. Топливо мне сегодня понадобится, я собираюсь прокатиться по тем районам, куда пешком ходить просто далеко . Ветер не дует, воздух достаточно теплый, потока машин почти нет. Еду свободно, не напрягаясь. Спешу в один из отдаленных районов города. Недавно видел рекламу, что там теперь доступен Интернет через Wi-Fi. Что ж, посмотрим. Сворачиваю с перекрестка, переезжаю железно дорожный переезд и начинаю колесить по улицам района. Если здесь кто-то по Wi-Fi раздает инет, то наверняка будет использоваться хорошая антенна, закрепленная на вышке или трубе (но ни как не точка доступа стоящая у кого-то на кухне). Вот она. Останавливаюсь рядом и достаю смартфон. Надо же, «12 WLANs in Databased». Сохраняю уже найденные точки, экспортируя данные в файл KML. Каждые 10 минут PyNetMony делает авто сохранение, но я предпочитаю делать это вручную. Что ж, сеть найдена, она открыта, а наличие инета проверю в другой раз. Через пару мину и перекрестков, пропуская грузовик, едущий мне на встречу, сворачиваю на дорогу, соединяющую этот и еще один далекий район моего города. Вспоминая отрывок одной

Page 126: VR-Online (April 2010)

песни «…делай все, что по душе, на своем стальном коне…» выкручиваю до конца ручку газа и наслаждаюсь нарастающей скоростью. Никаких домов и беспроводных сетей. Только дорога и закат впереди тебя. Черт, как слепит то. Хорошо, что стекло шлема затемненное. Пролетаю мимо двух скутеров, остановившихся на обочине. Да? Нет? Секунда размышления. Все-таки да, надо бы хоть предложить помощь. Включаю правый поворотник и останавливаюсь. Пока иду к ним эти двадцать метров снимая шлем по дороге, понимаю, что я выгляжу сейчас как шериф в американских фильмах. Но что поделать, уже решил. Один парень затягивает болты, сидя на корточках, второй подает ключи. Девушка стоит рядом со вторым скутером. - Привет! - Привет,- немного настороженно смотрят они на меня. - Помощь нужна? – замечаю, как после этой фразы они расплываются в улыбке. - Нет, спасибо. У нас небольшие проблемы с цепью. Мы почти исправили. - Славно. Тогда удачи, - напрашиваться помогать никто не собирался, еще много где надо побывать. - Тебе тоже. Спасибо еще раз. Солнце опускается все ниже, а это значит, что надо торопиться. Все-таки кататься вечерами еще холодно. Сворачиваю в район, который считаю одним из самых красивых в городе. Он находится на возвышенности. Проезжая по самой крайней его улице любуюсь открывшимся мне пейзажем. Центральный район города, укутанный зелеными деревьями, как на ладони. Видно морской штиль, порт и несколько кораблей. На какое-то время напрочь забыл про беспроводные сети. Это я уже потом узнал, что в некоторых пятиэтажных домах по другую сторону улицы была не одна открытая сеть. Здесь кажется все. Центр города я оставил на десерт и отправился на край города, где некоторые дома и переулки напоминают сцены из фильма «13 район» Люка Бессонна. Проезжаю по так называемому «Горбатому мосту». Отсюда видно здание завода, на крыше которого установлены антенны для беспроводных сетей от, кстати, моего провайдера. Оказалось, тянуть в этот район кабель выйдет напряжно, поэтому инет сюда кидают через Wi-Fi. Об этом мне поведал мой препод по компьютерным сетям, а то, что это антенны для WLAN сомнений нет. Я уже раньше проверял. Как ни странно среди этих старых многоэтажек тоже нашлась не одна открытая беспроводная сеть. В очередной раз, остановившись на обочине и достав из куртки смартфон, я увидел, что наловил уже под 50 сетей. Цифра достаточно маленькая, но этому есть объяснение. Я не ездил зигзагами по всем улицам районов, к тому же мощность Wi-Fi адаптера N95 достаточно мала, что бы улавливать многие сети. Здесь проявляется преимущество связки GPS приемника с ноутбуком, так как в последних, мощность беспроводного адаптера раза в два выше. Центр есть центр. Количество найденных сетей увеличилось почти вдвое. Позже, просматривая карту, я заметил, что зашифрованы преимущественно домашние (судя по названиям) сети. Остальные, принадлежащие гостиницам, редакциям газет, страховым отделениям и другим организациям полностью открыты. Причем очень часто в них есть выход в Интернет. Немного замерзший и очень проголодавшийся я притопил газу и вскоре оказался дома. Любопытство распирало меня. Законнектив N95 с компом через Bluetooth я скинул эти три заветные лог файла и открыл их по очереди в Google Earth. Результат моего сегодняшнего «боевого вождения» ты можешь увидеть на рисунке ниже (изображена небольшая часть города).

Page 127: VR-Online (April 2010)

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

Page 128: VR-Online (April 2010)
Page 129: VR-Online (April 2010)

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

Антон Козлов aka Jimmy Jonezz Признаюсь честно, я прусь от беспроводных технологий, их развития и распространения. В частности это касается Wi-Fi. Нет, я не зациклился на нем. Просто эта штука реально полезная и я очень часто ее использую. Даже в моем то, очень небольшом городе она получила неплохое распространение. Почти все прошлое лето в Интернете я бывал через одну из нескольких АР нашего провайдера. Выделенки еще не было, а платить «золотыми слитками» этим *цензура* за глючный инет через телефонную линию мне порядком надоело. Был еще случай. Как то нужно было срочно отправить один файл. Пока нашел его и заархивировал, просто отвалился Интернет (передаю привет своему провайдеру). Минутное это дело или что-то серьезное ждать, не было времени. Зашнуровал кроссовки, накинул куртку, нетбук в сумку и рванул на почту в паре кварталов к той самой точке доступа. Даже если бы я не успел к ее закрытию, в резерве была парочка открытых сетей, в соседнем квартале. Интересно, создатели Wi-Fi догадывались, что мобильность клиентов не будет ограничиваться радиусом действия только одной АР =). А еще у нас, совсем недавно, на некоторых домах и кафе центральной площади разместили целых 7 точек доступа для одной, общей беспроводной сети. Все, кто живет в этом районе, могут бесплатно подключаться к ней и работать с сетевыми ресурсами и в Интернете. В этой же сети я нашел их сайт, где было написано, что эта сеть создана для изучения востребованности беспроводных технологий, отработки оборудования и т.д. и т.п. Не знаю, насколько это правда и как долго эти блага будут бесплатными, но меня эта новость удивила. Сегодня звонил одному из руководителей проекта, он сказал, что после регистрации (надо только сказать MAC-своего адаптера, никаких документов) будет доступен канал в 3 Мбит/сек. Без регистрации, доступ к сети так же имеется, но будут доступны только 30Кбит/сек. Забавно, не так ли? Роман Волков aka Kastor

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

Page 130: VR-Online (April 2010)

Ведь их так много, а нужна только одна, самая перспективная и мощная. Ради этого я провел иследования и подвел итог (читай в статье неподалеку). И выбор мой пал на Android. Таким темпам, какими развивается эта ОС,остается только завидовать. Уже сейчас Android поддерживает все возможные навороты, присутствующие в других мобильных ОС, а что будет дальше? И буквально на ближайших выходных я поеду и куплю себе либо HTC Legend, либо Motorola Milestone. Они меня покорили.

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

В конце этого месяца я решил раскошелиться и прикупить сразу два девайса: мобильный кондиционер (см. наши коллективные блоги) и новый коммуникатор. Про кондишник рассказывать не стану (читай блоги), а вот про телефончик пару слов скажу. Я просто счастлив от покупки! Наконец-то я простился со своим старым и уже потрепанным жизнью девайсом от Тошибы с Windows Mobile на борту. Теперь буду гонять с Nokia E71. На нем в качестве ОС крутится Symbian. После тормознутого WM чувствую, что пересел на гоночную машину. Все просто летает! Думал, что не смогу привыкнуть к новой клаве. А нееет! Мне удалось покорить ее достаточно быстро, и теперь я получаю реальный кайф от набора очередной заметки в наши блоги :) Больше сказать нечего, одни эмоции =) Скоро поведаю о своем новом друге на наших блогах. Игорь Антонов aka Spider_NET Бесплатный софт. Я тащусь от качественного бесплатного софта. Начиная текстовыми редакторами и заканчивая операционными системами. В этом месяце я с лихвой намучился со зверьком по имени Ubuntu. Это – ужас какой то. Такое впечатление, что в репозитории попадают пакеты, прошедшие тестирование в течение каких-нить двух часов. Типа критических багов нет, значит пусть народ юзает. А ведь можно писать качественный софт. Notepad++, VirtualBox, FireFox, VLC и т.д. Всё качественно и, самое главное – free. Из ОС: просто прусь как удав от FreeBSD. Один раз настроил и забыл. На десктопе стоит сейчас Debian. Тоже классная ось. По сравнению с Убунтой это – полное отсутствие багов. Буквально только вчера зависла, но это не считается. Хехе =) Из CMS прусь по Drupal. Это – реально классно и по-гиковски. И будет подобен богу тот, кто познает дао Друпала :) Не так давно разузнал о сервисе DynDNS.com. Принцип работы достаточно прост. На своем динамическом хосте устанавливается dyndns-клиент, который периодически “сливает” адрес своего хоста на публичный dyndns-сервис, на котором зарегистрирован твой домен, а этот сервис каждый раз корректирует настройки DNS-зоны в соответствии с изменившимся адресом хоста. Благодаря ему можно в любое время обратиться к своему домашнему компу по DNS имени. Отличная вещь. Я даже флешку с собой перестал брать. Мелкие документы всегда лежат у меня дома на FTP. К ним в любое время можно получить доступ. Благо, стабильность работы интернет провайдера позволяет это делать. А для больших данных я себе купил внешний винт на 320 Гб. Удобно и хорошая скорость чтения и записи.

Роман Костенко aka Lord_of_Fear

Page 131: VR-Online (April 2010)
Page 132: VR-Online (April 2010)

Козлов Антон aka Jimmy Jonezz FIREBIRD. ЗНАКОМСТВО С ОГНЕННОЙ ПТИЦЕЙ

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

На данный момент, из специализированных программ, можно выделить следующие - DB2, Firebird, PostgreSQL, MS SQL Server, MySQL, Oracle, SQLite. Каждая из них довольно хорошо зарекомендовала себя в работе, и многим читателям выше названные программы, уж точно, не в диковину. По роду своей деятельности, мне приходилось сталкиваться с данными программами, но более плотно, работаю лишь с одной – Firebird. В этой статье мы подробно рассмотрим, принципы работы данной системы, функциональные возможности, настройку, а также многое другое. Хочу предупредить, что данная статья будет полезна лишь начинающим, более опытные пользователи для себя здесь ничего

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

Благодаря компании Borland, в августе 2000 года, состоялся релиз Firebird – это компактная, кроссплатформенная, свободная система управления базами данных (СУБД), работающая на GNU/Linux, Microsoft Windows и разнообразных Unix платформах. Данная система полностью бесплатна (Open Source) для использования и распространения, что уже придает ей некоторый интерес. Firebird являясь сервером баз данных (полностью основанный на исходном коде InterBase 6.0), может обрабатывать несколько независимых баз данных и каждую с множеством пользовательских соединений.

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

• Данная СУБД использует язык PSQL (процедурный SQL), с возможностью создавать сложные хранимые процедуры на стороне сервера.

• Одно клиентское приложение может выполнять множество одновременных транзакций.

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

до или после вставки, обновления или удаления записей. • Поддержка множества международных наборов символов (включая Unicode). • Возможность использовать библиотеки с UDF, расширяя возможности сервера. • Идея генераторов (последовательностей) делает возможной простую реализацию

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

Page 133: VR-Online (April 2010)

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

Если я заинтересовал тебя, то смотри во врезке ссылку на загрузку дистрибутива, а пока я расскажу основные моменты, которые стоит знать, при установке данной системы (для платформы Windows). На данный момент последней, доступной версией является: Firebird 2.5., стабильная версия Firebird 2.1.

Установка Firebird доступна в трех вариантах:

• Firebird Super Server • Firebird Classic Server • Firebird Embedded.

Если вы не уверены в выборе типа установки Firebird, то используйте Firebird Super Server; от Classic Server она выделяется своим быстродействием. Если вам нужна стабильная работа или вы хотите увидеть большую надежность в работе сервера, то смело выбирайте Classic Server. В дальнейшем, без труда сможете изменить архитектуру сервера на необходимую. Вариант Superserver:

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

• Разделяемое пространство кэша. Более эффективен (в плане потребления ресурсов) в случае роста числа одновременных соединений.

• Полноценный Services Manager, позволяющий программно осуществлять операции по управлению (резервирование/восстановление, останов базы данных, управление пользователями, получение статистики и т.д.). Вы можете подключиться к Services Manager по сети и, соответственно, выполнять эти операции удаленно.

• UDF выполняются в общем, адресном пространстве сервера.

Несколько слов о безопасности и пользователях:

• Хранение учетных записей пользователей производится в одной служебной базе данных security.fdb.

• Администраторы домена на уровне БД определяются как суперпользователи SYSDBA (для данного пользователя назначен пароль - masterkey). Данного пользователя и пароль, программа, при установке назначает самостоятельно. Поэтому рекомендуется изменить пароль или/и добавить нового пользователя (об этом чуть ниже – прим. автора).

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

В дистрибутив Firebird, не входит какой-либо инструмент администрирования, но разработчик не оставил этот момент без внимания, поэтому весь необходимый набор утилит командной строки (!), находятся в папке bin (смотрите директорию с установленной программой). Задействуем следующую предложенную программу: gsec. Она нам

Page 134: VR-Online (April 2010)

понадобится, если мы захотим, а мы захотим, добавить или изменить уже имеющуюся учетную запись пользователя. Сменим пароль пользователя SYSDBA:

C:\Program Files\Firebird\Firebird_2_1\bin>gsec GSEC> modify SYSDBA -pw NEW_PASS

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

В своей работе, я использую, IB/FB Development Studio - визуальный дизайнер баз данных, встроенный MERGE, scheduler, Code auto completion, анализатор запросов, монитор производительности. Достаточно мощный продукт, простой в освоении и, что немаловажно, с русифицированным интерфейсом.

Другой инструмент, который бы я хотел отметить, это FlameRobin. Простое и удобное графическое средство управления базами данных Firebird с открытым исходным кодом. На сегодняшний день доступны версии под Linux, MacOS X и Windows.

Проект: Официальный сайт: http://www.firebirdsql.org/ Проект Firebird: http://sourceforge.net/projects/firebird/files/ InterBase, Firebird и Yaffil: http://www.ibase.ru Документация: Википедия: http://ru.wikipedia.org/wiki/Firebird Документация на русском (неофициальная): http://www.firebirdsql.su/doku.php Документация на русском: http://www.ibprovider.com/rus/documentation/firebird.html Администрирование: Средства администрирования: http://www.ibphoenix.com (соответствующий раздел) IB/FB Development Studio : http://www.sqlly.com/ Проект FlameRobin: http://www.flamerobin.org Программирование:

Page 135: VR-Online (April 2010)

Firebird и Delphi: http://www.ibprovider.com/rus/documentation/firebird_interbase_delphi.html Firebird и С++: http://www.ibprovider.com/rus/documentation/examples.html

Page 136: VR-Online (April 2010)

Роман Костенко aka Lord_of_fear КАК ОПРЕДЕЛИТЬ СВОЙ IP.

ФУНДАМЕНТАЛЬНОЕ РУКОВОДСТВО Еще с полгода назад решил я у себя дома поднять шлюз, чтобы остальные 2 моих компьютера всегда имели доступ в инет. А заодно на шлюз можно было бы повесить торрент-клиент. Пускай себе круглосуточно качает и раздаёт. В плане ОС я выбрал Ubuntu Server 9.10. Иначе быть и не могло. :) Поставил я ось, настроил торрент-клиент, прикрутил к нему веб интерфейс, настроил маршрутизацию. Вроде всё и больше ничего мне не нужно… Но одной мелочи не хватает… Удалённое администрирование – вот чего не хватает. А если я захочу подключиться к компу с работы? Или с мобильного телефона, например, по ssh? Ведь даже на телефоне у меня стоит Putty. Как узнать ip домашнего шлюза, если провайдер выдает айпишник динамически? Ведь возможен сбой на линии, а в следствии переподключение и получение нового ip. Платить дополнительные 200 рубликов в месяц за статический ip? Небольшая сумма, но нет! Это не по-хацкерски! :) На эту мысль меня натолкнул Spider_NET : моему шлюзу нужно периодически выгружать инфу о его IP на какой-нить ресурс. И вот что я сделал: 1. На ресурс (Пусть это будет http://mysite.ru) с поддержкой php я положил php скриптик ipconf.php, сохраняющий в текстовый файлик вторую половину ip адреса (которая как раз и меняется) клиента, который к нему обращается. Код: <?php $fp = fopen(“ip.txt”, “a”); ftruncate( $fp , 0 ); // Очищаю содержимое текстового файла $g = substr($_SERVER['REMOTE_ADDR'], 5); //обрезаю начало ip адреса, которое не меняется fwrite($fp, $g); fclose($fp); ?>

2. Назначил файлу ip.txt права на запись. 3. У себя на шлюзе создал задание cron’a следующего содержания: 0 * * * * wget -O – -q -t 1 http://mysite.ru/ipconf.php

wget – консольная программа для загрузки файлов по сети. Поддерживает протоколы HTTP, FTP и HTTPS. Таким образом wget 1 раз в час обращается к скрипту, который в свою очередь сохраняет ip удалённого клиента, т.е. моего шлюза. 4. В robots.txt добавил 2 строки: Disallow: /ipconf.php Disallow: /ip.txt

Page 137: VR-Online (April 2010)

Это для того, чтобы поисковики не трогали это содержимое. :) После этого нужно лишь зайти по адресу http://mysite/ip.txt . И вот окончание ip адреса шлюза перед нашими глазами. Всё легко и просто :) Предыдущий подход к решению проблемы был креативным, но оказалось, что есть сервис, которым для таких целей пользоваться гораздо приятнее. Встречаем: DynDNS.com . Принцип работы достаточно прост. На своем динамическом хосте устанавливается dyndns-клиент, который периодически “сливает” адрес своего хоста на свой публичный dyndns-сервис, на котором зарегистрирован твой домен, а этот сервис каждый раз корректирует настройки DNS-зоны в соответствии с изменившимся адресом хоста. Что же нужно сделать: 1. Cоздать аккаунт на сайте https://www.dyndns.com. 2. Зайти в My Account -> My Hosts и создать себе host. Пусть это будет mypc.homelinux.com 3. Активировать этот хост – пимпа Checkout to Activate =) Теперь дело за установкой клиента. Если ты забыл, то ОС – Ubuntu Linux Server 9.10. Клиент я качнул с оф. сайта. На данный момент доступен DDCLIENT v3.6.7. Написал он на Perl, который в базовую установку Ubuntu Server уже включен. Нужно лишь засетапить пакеты для передачи пароля в шифрованном виде: sudo apt-get install ssh libio-socket-ssl-perl

Далее: 1. Копируем из архива файл ddclient в папку /usr/sbin/ 2. Конфигурационный файл sample-etc_ddclient.conf пишем сюда: /etc/ddclient/ddclient.conf 3. Правим конфиг. Вносим логин, пароль, хост: sudo nano /etc/ddclient/ddclient.conf

А если быть точным, то правим эти строки: login=your-login # default login password=test # default password mx=mx.for.your.host # default MX

4. Теперь пишем скрипт запуска в режиме демона sample-etc_rc.d_init.d_ddclient.ubuntu сюда: /etc/init.d/ddclient 5. Всё. Теперь стартуем : /etc/init.d/ddclient start Почему-то DDCLIENT у меня пару раз ругнулся, но заработал :) Смешно, но только после установки я подумал, что клиент должен быть в репозиториях. Всё верно. Так и получилось. Из репов ставим так:

Page 138: VR-Online (April 2010)

sudo apt-get install ddclient

Интерфейс установщика прост до безумия. На нём не заостряю внимания. После инстала нужно поправить /etc/default/ddclient, сменив тип запуска daemon c false на true. И дело в шляпе. =) Первый раз стартуем ручками : /etc/init.d/ddclient start Теперь к шлюзу можно обращаться по имени mypc.homelinux.com. На этом всё :) P.S. не забудь раздать права конфигу на запись, а скрипту на выполнение.

Page 139: VR-Online (April 2010)
Page 140: VR-Online (April 2010)

Михаил Фленов aka Horrific [email protected]

Photoshop. Быстрая коррекция фотографий Когда мы только загружаем фотографию в Adobe Photoshop Elements, то очень часто нужно выполнить сразу несколько различных операций коррекции. Возможно, что придется осветлить тени, а после этого может оказаться, что нужно затемнить слишком яркие участки. Если вы снова решите осветить темные участки, то придется несколько раз переключаться с окна на окно различных мастеров. В какой-то момент времени, вы остановите процесс корректировки не потому, что фотография уже приняла отличный вид, а потому, что задолбались переключаться с окна на окно. Нужен какой-то простой и удобный способ коррекции фотографий с помощью Photoshop и он есть. Чтобы этого не произошло с вами, я рекомендую переключаться на режим Edit Quick (быстрая коррекция). Справа вверху окна есть цветные кнопочки, и по умолчанию на оранжевом фоне вы можете видеть EDIT Full. В этом режиме вы видите на этой панели слои и эффекты, которые можно наложить на фотографию. Если щелкнуть по кнопочке со стрелочкой вниз, то вы увидите выпадающее меню, как показано на следующем рисунке:

Если переключиться на режим QUICK Fix, то панель изменяется, преображаются и принимает следующий вид:

Page 141: VR-Online (April 2010)

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

Справа наверху находится две очень важные кнопки – Close и Reset. Первая закрывает файл, и если он был изменен, то перед закрытием предложит вам сохранить изменения. Вторая кнопка сбрасывает все изменения, которые вы произвели в режиме QUICK Edit.

Page 142: VR-Online (April 2010)

Игорь Антонов aka Spider_NET [email protected]

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

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

Page 143: VR-Online (April 2010)

обеспечение, в котором был бы реализованы возможности решения специфических задач. В то время (примерно лет 5-6 назад), на рынке был явный дефицит подобных решений. Самый известный сегодня продукт (1С:Управление страховой компанией) находился в стадии зародыша и не мог претендовать на работу в реальных условиях (ИМХО). К счастью (а точнее к не счастью) нашелся альтернативный продукт. Стоило связаться с компанией-разработчиком, как они сиюминутно согласились помочь. Как мне потом рассказали, представители компании сразу же направили в наш адрес кучу буклетов и других презентационных материалов. Наших сотрудников вроде все устроило. А если быть точнее, то альтернативы не было, работать-то надо было. В итоге решили купить. Отвалили кучу баблосов и стали пожимать плоды. Первые проблемы начались при близком знакомстве с продуктом. Оказалось, что многих нужных функций просто нет. Точнее есть, но работают они не совсем так, как хотелось бы. Страхование – одна из самых плохо регулируемых отраслей бизнеса в РФ. В законах не все прописано (особенно несколько лет назад) и разработчикам подобных решений приходится действовать, не привязываясь к документам. Безусловно, это вина не разработчиков. Ну да ладно, оставим этот момент за кадром. Пришлось компании X обращаться в тех. поддержку. Там ее заверили, что все будет very well. Мол, готовиться новая версия и там-то будет все тип-топ. Каждый получил свое – компания X сладкий период ожидания, а компания-продавец деньги. Время шло и в купленной программе находилось все больше и больше недочетов. Спустя пару лет активного использования программы, были сделан вывод, что в программе чересчур много проблем и самое главное, она совершенно не пригодна для того объема документооборота, который приходится на долю компании «Х». К тому времени, компания-разработчик, решила начать сворачивание это направление бизнеса и сделала откровенное признание – «Наша программа вероятно для вас не подходит». Нет, они не нарушили условия договора, они продолжали оказывать поддержку, но компании «Х» лучше от этого не стало. Не буду больше томить вас этим рассказом, скажу лишь, что компании «Х» пришлось окончательно отказаться от использования этого продукта и нанять разработчиков на разработку решения «для себя». Несколько потраченных лет впустую, куча вложенных финансовых и временных средств – результат красивого предложения и не умение выбирать. Сегодня народ стал умней Стал, но все, же лажает. Причем крайне по-крупному. Как-то раз я наткнулся на статистику наиболее часто используемого программного обеспечения для поднятия почтовых серверов. Одним из лидеров был великий и ужасный MS Exchange сервер. Я очень хорошо отношусь к этому продукту (особенно к версии 2007), но я не понимаю зачем он нужен небольшим компаниям? Это ведь настоящая махина с кучей возможностей, 70% из которых явно не используются. Я понимаю, что у нас в стране еще не принято покупать софт, но когда-нибудь это придется сделать (особенно на уровне компаний). Так зачем мне интересно системные администраторы пытаются применять подобные дорогие решения? Реально, за Exchange нужно отвалить примерно 2 штуки баксов + n сумма денег за нужное количество почтовых ящиков. Если не ошибаюсь, то одна CAL лицензия сейчас стоит в районе 100$. Получается, что для внедрения решения от MS, компании нужно разориться (представим, что в ней трудится 20 сотрудников) примерно на 4 штуки баксов (Windows 2003 + Exchange + CAL). Обратите внимание – это сумма лишь за ПО. Добавим к этому сам сервер и получим все 5 штук. Не кисло? Это только за продукт для обмена почтовыми

Page 144: VR-Online (April 2010)

сообщениями. Лично я не вижу в этом смысла и не за что бы ни пошел на такой шаг (хотя вру, один раз пришлось пойти, но скоро этому будет положен конец). Уж лучше часть этих денег потратить на приобретение лицензий на Windows для рабочих станций и купить почтовый сервер, но дешевле. К большему счастью, на рынке предложений хватает. Взять тот же KERIO Mail Server. Добротный продукт. Обладает меньшими возможностями (по сравнению с MS Exchange), но и стоит в разы дешевле. Поскольку все фишки Exchange на обычном предприятии заюзать проблематично, то получается, что фактически ничего не теряем, а наоборот – приобретаем. Мы экономим деньги. Для этого не нужно много ума, достаточно уметь пользоваться поисковыми системами и тщательно фильтровать то, что нам пытаются втюхать. Едим дальше. На прошлой моей работе, стандартом считались продукты от компании MS. Я уже говорил, что я не из тех людей, кто кричит «MS – ламеры» и «Windows must die!». Напротив, мне очень нравятся многие разработки этой компании и я с удовольствием готов за них заплатить. Некоторые, но не все. Опять я отвлекся. Так вот, на моей прошлой работе, администраторы очень любили и любят продукты MS. Все сервера работали только под управлением Windows. Я в этом плане не разделяю их точку зрения. Как бы там не было, но я бы не решился установить на файловый сервер и шлюз Windows. Не потому, что она небезопасная, а потому, что не вижу смысла тратить пару штук долларов за две лишни копии Windows 2003 Server. Организовать файловый менеджер/шлюз достаточно легко на FreeBSD. Сейчас статей по этой тематике навалом! Потратив 10 минут на «google it» можно найти все необходимые материалы. Увы, большинство этим не заморачиваются и продолжают юзать пиратские версии, либо вбухивают деньги в никуда. Где он, выход? Как бы ни было грустно, выход есть. Еще с детства мама говорила мне «будь внимательней, а то испачкаешься в грязи». Тогда на меня эти слова плохо действовали (да-да, после гулянок я часто приходил домой грязным), но сейчас я стараюсь максимально рассматривать то, что мне предлагают. Вот я и вам советую: «Никогда и не при каких условиях не введитесь на брэнд и рекламу». Apple, MS, Google – это не последние инстанции. Они делают отличные продукты (за это большущий им респект), но нужно с умом их выбирать. В этом и заключается профессионализм человека. Нужно решать задачу наиболее подходящим для этого инструментом. Не берите в руки кувалду если вам нужно закрутить шуруп. Не покупайте MS Office если вам приходится очень мало работать с текстом, поставьте OpenOffice и радуйтесь жизни. Ни за что не покупайте платные CMS если на 100% не уверены, что этот проект можно построить лишь на этой коммерческой системой управления контентом! Посмотрите в сторону свободного Drupal и на сэкономленные деньги купите лучше в офис кондиционер или новый письменный стол. Думайте, выбирайте, ищите плюсы и минусы. Желаю вам наслаждаться правом выбора. Помните одну старую, но мудрую поговорку: «Выбрать достойного намного трудней, чем стать им самому».

Page 145: VR-Online (April 2010)

Михаил Флёнов aka Horrific PHOTOSHOP. УПРАВЛЕНИЕ РАБОЧИМ

ПРОСТРАНСТВОМ Этот раздел будет посвящен просто базовым понятиям работы с Adobe Photoshop Elements 8. Для большинства читателей этого сайта раздел покажется простым, но ведь все мы когда-то были начинающими и все когда-то знакомились с компьютером и его программами с самых основ. Может быть кому-то просто будет интересно заглянуть в некоторые статьи этого раздела, чтобы почитать на досуге. Но основными читателями будут начинающие пользователи Adobe Photoshop Elements. Я не буду здесь описывать прямо совсем уж банальные вещи, наподобие вопросов о том, где находятся меню или панели.

Окна современных программ очень часто делают настраиваемыми, чтобы пользователь мог настроить рабочее пространство под себя. Иногда это бессмысленно, если программа проста в использовании и состоит из пары команд. Но Adobe Photoshop Elements достаточно большая и сложная программа, состоящая из такого большого количества функций, что их просто невозможно все отобразить сразу.

Вы можете перемещать панели по экрану, располагая их так, чтобы выиграть как можно больше дополнительного рабочего пространства. У меня на ноутбуке всего 14-ть дюймов счастья, поэтому особо не разгуляешься, и я использую параметры по умолчанию. А вот на работе, когда я много работал с графикой, у меня был ноутбук с 15-ю дюймами и 24 дюйма внешнего монитора. В результате получается очень большое рабочее пространство, просто разделенное на два экрана. На одном экране я держал холст с фотографиями, с которыми приходилось работать, а на другой экран были выведены панели, а так же окно текстового редактора, в котором писался HTML/CSS/PHP код.

Если у вас такой же маленький экран, то можно поступать так же как я – использовать расположение окон по умолчанию (не обязательно, но какая разница). Ну а когда вы выбрали нужный инструмент и хотите видеть только фотографию, то просто нажмите Tab. Это переключит Adobe Photoshop Elements в режим полноэкранного редактирования фотографии, а все панели исчезнут. Ну а если запомнить горячие клавиши, то возвращаться из полноэкранного режима придется не так уж и часто. Для этого разработчики каждой команде назначили горячую клавишу. Как запомнить горячие клавиши? Их нужно просто использовать. Чем чаще вы их используете, тем быстрее они запоминаются.

Page 146: VR-Online (April 2010)

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

Если в определенный момент времени у вас открыто больше фотографий, чем возможно отобразить в текущей раскладке, то они будут на заднем плане. Переключаться между фотографиями можно с помощью сочетания клавиш Ctrl+Tab, или выбирая нужное имя фотографии в меню Window.

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

Page 147: VR-Online (April 2010)

Когда открыто много фотографий, то переключаться между ними намного проще с помощью окна Project Bin, которое по умолчанию располагается вдоль нижнего окна Adobe Photoshop Element. Если у вас нет этого окна, то выберите меню Window и убедитесь, что напротив Project Bin стоит галочка. Если нет, то выберите это меню. В этом окне нужно дважды щелкнуть по фотографии, которую вы хотите отредактировать в данный момент, и она выйдет на передний план.

Правый клик по фотографии в окне Project Bin позволяет вывести меню, с основными командами манипуляции фотографией. Конечно, это не редактирование, да и не уверен, что вы будете пользоваться этим меню. Лично я пользуюсь им только для того, чтобы закрыть ненужную в данный момент фотографию, без вывода ее на передний план.

Page 148: VR-Online (April 2010)

Антон Козлов aka Jimmy Jonezz INKSCAPE. СОЗДАЁМ ОБОИ ДЛЯ РАБОЧЕГО

СТОЛА. ЧАСТЬ 1

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

На страницах журнала VR-Online, мы с вами уже кратко познакомились с векторным графическим редактором Inkscape (для тех, кто еще не читал про этот замечательный инструмент, советую глянуть январский номер за 2010 год). Данной статьей, я хотел бы начать плавное погружение в основы создания векторных изображений/объектов с помощью такого инструментария как Inkscape. Но несколько слов хочется уделить тому, зачем мой выбор пал на этот редактор.

Говоря Inkscape, мы подразумеваем векторную графику, а именно, это означает работу с геометрическими примитивами, такими как точки, линии, сплайны, многоугольники и т.д. Хочу добавить, что использование данного вида графики удобно тем, что мы работаем именно с примитивами, а не с пикселями, как, например в растровой. Поэтому редактирование и какая либо другая трансформация объектов, происходит менее болезненно, чем, если бы мы работали с растровой графикой. И это основной плюс векторной графики, т.к. благодаря этому открываются другие возможности: масштабирование без потери качества, анимация, и естественно меньший размер файлов, но и это еще не все. Inkscape, на данный момент, активно расширяющийся и развивающийся проект (Open Source), и поэтому я надеюсь, что в будущем он будет только радовать.

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

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

Создаем новый документ, размеры полотна нам не важны - мы всегда сможем изменить размер до желаемого. Вы должны учитывать, что Inkscape запоминает, по умолчанию, последние настройки инструментов. Следовательно, свойства/настройки объектов, которые вы будете использовать при рисовании, могут отличаться от скриншотов используемых в этой статье.

Начнем с инструмента «Кривые Безье» - , который является одним из наиболее важных инструментов в Inkscape, хотя многие думают, что он является достаточно сложным, это, скажу я вам, предрассудки, все довольно легко и

Page 149: VR-Online (April 2010)

удобно, ведь главное начать осваивать.

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

Пусть, получившаяся фигура получилась не совсем, такой как на рисунке,

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

Благодаря этому инструменту мы можем изменить тип узла:

1. Узел может быть параболическим (угловой) (Shift + C): его два рычага могут самостоятельно передвигаться под любым углом друг к другу.

2. Узел может быть гладким (Shift + S), что означает его рычаги всегда находятся на одной прямой;

3. Узел может быть симметричным (Shift + Y), который так же, как гладкий, но его рычаги имеют одинаковую длину.

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

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

Page 150: VR-Online (April 2010)

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

отдельные контуры, нажав на кнопку , которая находится на панели узлов, или же с помощью Контур> Разбить (Shift + Ctrl + K) из меню. Выделите два нижних контура (как показано на рисунке ниже), и удалите их, с помощью клавиши Delete. Не забываем, что первый контур остается без изменений.

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

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

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

Page 151: VR-Online (April 2010)

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

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

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

В данном случае, контур пересекается с самим собой, и малая форма сердца, на вершине

заполняется тоже. Откройте меню заливки и обводки - (Shift + Ctrl + F). Изменение

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

Создайте дубликат заполненной формы сердца (Ctrl + D) и использовать инструмент , чтобы переместить его в сторону - мы используем его позже.

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

Уважаемы читатель, если ты заметил какие-либо неточности или у тебя возникли затруднения в освоении данной темы, а может ты хотел бы внести свои замечания и предложения, то не стесняйся, пиши нам – либо автору, либо на форум нашего сайта www.vr-online.ru, ответы на твои вопросы не заставят себя долго ждать. J

Полезные ссылки:

Page 152: VR-Online (April 2010)

Оригинальная статья: http://verysimpledesigns.com/vectors/inkscape-tutorial-valentine-wallpaper.html

Несколько профессиональных уроков: http://www.youtube.com/watch?v=XU0vhBZY6YY

Большое количество уроков (англ): http://verysimpledesigns.com/vectors/

Огромный клипарт: http://www.openclipart.org/

Page 153: VR-Online (April 2010)

VR-Crew Наши рабочие столы

Перед самым релизом этого номера, наш постоянный читателей и посетитель Kastor толконул идею: «А почему бы не разместить фотки рабочих мест тех, кто тусуется на VR?». Его творческую мысль мы все поддержали и вот результаты.

Открывает наш показ мод фотка от Юрия Рожкова. Аккуратненькое такое место. Есть все, что необходимо для работы. Видно, что Юрий привык работать в четыре руки. У него и ПК, и нетбук, и вдобавок все это на одном столе J.

Следующая наша модель – рабочий стол грозы VR-Online, бесстрашного админа и просто прикольного перца - Lord_Of_Fear! Аплодисменты! Lord настолько суров, что даже двух мониторов ему мало. Провода, куча девайсов и порядок на столе – райское рабочее место Lord’а.

Page 154: VR-Online (April 2010)

А что за это за знаменитость? Куча наград/дипломов/медалей, true книги от отца VR и настоящее гиковское рабочее место в стиле модерн-СССР. Кто бы это мог быть? Не догадались? Это же наш хакер беспроводных сетей – Kastor! УраАаааааааа!

Срач на рабочем столе, куча книг по 1С и просто творческий бардак (прим. Lord’a – бывает значительно хуже -))). Кто это? А это я, ваш покорный слуга – Spider_NET (прим. Lord'a – а еще никто не знает, что на окне за жалюзями спайдер хранит сахар и кофе. Шифруется J).

Page 155: VR-Online (April 2010)

Много книг, самодельные картинки с какими-то компьютерными богами и old'скульный монитор на таком же олдскульном столе - все это рабочее место одного из наших мега дизигнеров – zahod5277. Простенько и уютненько J.

Два монитора (прямо как у lord_of_fear: lg + acer), нетбук, а также книга с суровым названием «Азбука выживания» характеризуют рабочее место нашего постоянного форумчанина Va-bank’a. Нам вот интересно, что он такое делает с компами, что ему

Page 156: VR-Online (April 2010)

приходится читать азбуку выживания? Уже стало страшно J.

Как выглядят рабочие места журналистов VR-Online? А вот примерно так и выглядят! На фотке рабочая зона нашего неповторимого JimmyJonezz’a. Сразу видно, человек любит VR. Даже на рабочем месте постоянно открыт правильный портал J. А еще смею предположить, что Jimmy шлет много факсов и также печатает на принтере. Ах, да, у Jimmy еще точно такой же принтер как и у Spider_NET’а. Наверное, в одном магазине покупали J.

Полный творческий беспорядок, крутые колонки с сабом и черная свинья – копилка. Наверное, в ней simzlodey хранит все честно и нечестно заработанные финансы J. В остальном у него все круто и этот перец готов к любым невзгодам. Почему? А потому что у него на столе лежит пачка аспирина! Мы также знаем, что simzlodey любит фигурки маленьких фей J.

Page 157: VR-Online (April 2010)

Neon_Kaligula http://neonka.info

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

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

Page 158: VR-Online (April 2010)

верующий и никогда не читал Библию, знаю лишь отдельные строки. Засим процитирую: "И спросил его: как тебе имя? И он сказал в ответ: Легион имя мне, потому что нас много." Можете меня так и звать, если вам удобно. Я не умру в известном смысле, а буду жить дальше. Я бессмертен до тех пор, пока в человечестве живёт алчность и корысть. Я буду здесь." Он держался правой рукой за поручень, вкрученный в пол тремя мощными винтами со скруглёнными шляпками, чтоб не скрутили на лом. Дождь шёл уже вторые сутки, прерываясь только на рекламу, ветер хлестал его по щекам и глазам. 23:28, более суток назад Он спал крепко, набираясь сил перед крестовым походом на зверей в облике людей. Сон его был спокоен, дыхание ровным и глубоким. Он спал, но не видел ни одного сна, наоборот, мозг усиленно работал над решением каких-то глобальных проблем и задач. "Я проснулся в своей кровати, хотя толком не помнил, как добрался досюда. Голова раскалывалась, и всё тело ныло. В любом случае, у меня было в запасе минут полчаса перед началом охоты. Надо было собираться." Он взял уже готовый школьный ранец, в котором лежала амуниция, и поставил его у двери. Тогда, в квартире напротив, у старого друга они праздновали какой-то юбилей, правда никому до этого не было дело, лишь бы была выпивка. Они часто собирались вместе, даже иногда без повода, просто встречались, болтали о всякой насущной ерунде, делились проблемами и в шутку строили планы на будущее. Витёк, самый старший из их дружеской четвёрки, был совладельцем какого-то магазинчика, торгующего детскими игрушками, посему он и обеспечивал спиртное и закуски. Несмотря на то, что он мог себе это позволить, на встречи он всегда приходил, закутанным в старый плащ. - Это так модно, - любил говорить он. С ним не спорили. "Сколько себя помню, он всегда появлялся в этом плаще." Сейчас это было как-то далеко, туманно. Он пытался что-то вспомнить, но не смог. Тогда он попытался вспомнить лица своих друзей, а конкретно Витька, который имел обыкновение произносить длинные тосты, не вгоняя при этом в скуку, но и тут его постигла неудача. То ли он не мог вспомнить, то ли не хотел, и не понимал этого. Радио на кухне тихо играло лирическую музыку. Дикторы "Маяка" иногда прерывали её, чтобы сказать что-то своё, отдалённое от реальности, а потом, после паузы, она продолжалась. Им это было можно - делать большие паузы, а остальных бы, на коммерческих станциях, уже давно уволили бы за это. На кухонном столе стояла лапша быстрого приготовления, банка тушёнки и пол буханки хлеба. На секунду его посетила мысль и отдалённое чувство голода: а не поесть ли? Нет! Может стошнить с непривычки, а тогда будет потеряно время. К тому же так он будет злее. - Я ненавижу его. Ненавижу всем сердцем и даже сильнее. Ненавижу то, что поклоняются не ему, а деревянному тотему. Слышишь, ты! - он смотрел куда-то вдаль. - Все боги были бессмертными. Если ты есть, то останови меня! Ибо скоро твои любимые дети начнут умирать. 00:00, сутки назад - Галлюцинация? - вопрошал он сам себя.

Page 159: VR-Online (April 2010)

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

Page 160: VR-Online (April 2010)

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

Page 161: VR-Online (April 2010)

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

Page 162: VR-Online (April 2010)

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

Page 163: VR-Online (April 2010)

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

Page 164: VR-Online (April 2010)

как перестаёт течь кровь по артериям, пропадает сердцебиение. Всё вокруг помутнело. Он упал. Номер двадцать один. Рядом, буквально в двух шагах, был канализационный колодец. Он был закрыт, но не до конца - люк просто лежал, будучи задвинутым не до конца. Видимо, те, кто работал здесь, собирались вскоре вернуться сюда и продолжить работу. Время будет. Он отодвинул люк в сторону, бросил туда тело. Раздались звуки ударов, потом последовал всплеск, а за ним звук задвигающегося люка. Лязг. Люк полностью встал на место. 02:00, 22 часа назад В нескольких сот метрах отсюда на пустыре сонный человек в пижаме выгуливал свою собаку. Чау-чау, так они, кажется, называются. Толстый пушистик с синим языком. Незаметно подбрасываем снятую ранее маску из кожи человека и ждём. Пёс затейливо принялся обнюхивать находку, трогая её лапой. Хлопок, и пуля пробуравила его голову насквозь. В следующую секунду, пока хозяин соображал, что произошло, на него набросилась тёмная фигура и воткнула ему нож в ногу. - Квартира! Номер! - рычала тень. В забытьи человек сообщил цифру тридцать пять. Он хватался за раненую ногу и бормотал что-то про скорую помощь. Ему было больно. Чтобы он не хватался за ногу, у него были отрезаны обе руки от плеч, а в рот засунута лапа собаки. Номер двадцать два. Умрёт через пару минут от потери крови. Тридцать пятая квартира, если он не соврал и не перепутал. При условии, что на этаже по четыре квартиры, это будет восьмой этаж третья квартира слева. В подъезде пахло мочой. "Мрут как мухи - быстро и непринуждённо." Он открыл ключом дверь, стараясь делать всё тихо и без резких движений. В двуспальной кровати лежала молодая жена. Волосы у неё были красивого золотистого цвета. Она крепко спала. Легион подошёл к ней вплотную, занёс левую ногу над кроватью, и сел на спящую. Она тихо промычала что-то во сне. Он наклонился и обнял её за шею. Большими пальцами обеих рук как капканом он сдавил её дыхалку. Тихо! Спи! Номер двадцать три. "Для грамотного удушения необходимо обхватить горло руками таким образом, чтобы большие пальцы образовывали перекрестие на трахее, а остальными пальцами нужно крепко удерживать шею. Большие пальцы смыкаются на трахее, перекрывая кислород." Под одеялом она спала голой, лобок гладко выбрит, бёдра округлые, живот худой. Неплохо. Люблю хороший труп на ночь. За пять минут обыска он нашёл в тумбочке небольшую связку ключей, которых не было в той, которую он снял с трупа на улице. Здесь было два тонких ключа, видимо, запиравших какие-то висячие замки, и ещё два ключа с номерами четыре и три. Скорее повинуясь чистому любопытству, чем логике, он попробовал открыть этими ключами двери напротив.

Page 165: VR-Online (April 2010)

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

Page 166: VR-Online (April 2010)

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

Page 167: VR-Online (April 2010)

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

Page 168: VR-Online (April 2010)

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

Page 169: VR-Online (April 2010)

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

Page 170: VR-Online (April 2010)

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

Page 171: VR-Online (April 2010)

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

Page 172: VR-Online (April 2010)

издавая громкий хрип, выплёскивая кровь порциями из появившейся раны. Он затих. Номер пятьдесят три. Его глаза не закрылись после смерти. Он смотрел куда-то вверх, без фокусировки, без жизни и задора. Он просто смотрел и всё. Легион вглядывался ему в глаза, стараясь рассмотреть что-либо, но там ничего не было. Пустота. А, нет, было что-то. Это что-то сильно напоминало страх, хотя он и уходил с каждой секундой. Голова трупа взлетела высоко, на уровень третьего этажа, ударилась щекой в стекло и отскочила в сторону. При ударе о плоский асфальт, она раскололась как яичная скорлупа, из неё вывалился мозг. Он вернулся к двум аккуратным трупам милиционеров на обочине и, срезав одному из них пуговицы на рубашке, распахнул её. Фу! Волосатая мужская грудь. Собственно, это уже не важно, даже скорее волосатая грудь трупа, так правильнее. Повинуясь мгновенному приступу музы, он вырезал ему на груди большой круг, украсив его несколькими иероглифами. "Я люблю свой ножик. Это Kershaw 1550 с простым лезвием. Я купил его полгода назад. А перед этим советовался с навязанным мне гуру по ножам. Смешной паренёк, пытался доказать мне мою безграмотность в этом вопросе, заявляя, что для охоты на людей нужен нож не дешевле 200 баксов. Советовал керамбиты с камилусом... Сегодня он умрёт. Мне хочется увидеть его глаза, когда он будет умирать от ножа для чистки картофеля... Он говорил, что всегда носит нож с собой. Говорил, что керамбитами удобно резать сухожилия. У него будет эта возможность." Он остановился, вслушиваясь в звуки мира. Шелест, когда капли рассекали воздух. "А даже если и так. Если это произойдёт, то восстановится ли вселенский мир хотя бы на сутки?" 04:00, 20 часов назад Думай, думай, думай! Только ты один знаешь, что делать, ты был к этому готов. Не так ли? "Да, это действительно так. Я знаю. Я знаю, что я делал, что делаю, и что буду делать. Я даю гарантии, что буду знать это до конца, вплоть до самого последнего момента, когда фигуры на шахматной доске придут в движение, когда, наконец, начнётся настоящая игра." Ночь была прекрасна - моросил приятный дождь, периодически из-за туч выглядывала Луна, иногда показывались звёзды. У него чесалась правая нога. - Эй! - двое подошли из-за угла. - Попить не дадите? - Ребята... - ответил он дрожащим голосом. Один из них достал дешёвый выкидной нож, раздался щелчок, который почти слился с хлопком. Парень с ножом замер секунды на три. Нож выпал из его рук. Он упал головой в землю. Из уха у него торчала отвёртка, утопленная по рукоять. Номер пятьдесят четыре.

Page 173: VR-Online (April 2010)

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

Page 174: VR-Online (April 2010)

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

Page 175: VR-Online (April 2010)

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

Page 176: VR-Online (April 2010)

Оставались считанные минуты до конца часа; он выскочил на улицу. Немного запачканные в ходе боёв подошвы оставляли чуть заметные следы. Он шёл мимо стоянки за забором в дом. Тут не было домофона, поэтому он прошёл легко, поднялся на десятый этаж лифтом и позвонил в дверь. 05:00, 19 часов назад - Чего ты ищешь? - Смерти. В конечном итоге тех, кто её не ищет, она находит сама. Кому-то это может и нравится, не спорю, но я лучше сам найду её и загляну в её глаза. А до тех пор мне нечего страшиться. Из-за двери сонный голос что-то пробурчал. Легион буркнул в ответ, и дверь отворилась. На пороге стоял улыбающийся паренёк. - Оппаньки! - тихо воскликнул он. - Что это ты так рано? Удар в челюсть заставил его замолчать и упасть. Ещё не коснувшись пола, он ощутил как что-то воткнулось ему в бедро. Жгучая боль, он закричал. - Смотри, - прошипел Легион, показывая окровавленный нож, - это нож для чистки картофеля. С этими словами он воткнул ему нож в солнечное сплетение и изо всех сил провернул. Парень кашлянул кровью, глотнул воздуха и упал в конвульсиях. На крик выскочил мужчина лет сорока, небритый и в тапочках на босу ногу. "Занятно, что-то мне это уже напоминает," Оттолкнувшись правой ногой от стены, он отлетел влево, делая отмашку тем же ножом. Нож воткнулся по самую рукоять в таз мужчине, пропарывая его тело влево и вверх, пока полностью не вышел. Кишки вывалились у него из брюха как сосиски, связанные верёвочкой. Такие скользкие и мягкие. Номер шестьдесят пять. Изнутри послышался приглушённый визг. Там на кровати, накрывшись с головой одеялом, сидела женщина и дрожала. Он взял валяющийся на полу толстый пакет и откинул одеяло. Она боялась его, она чувствовала приближение конца. Ударом в живот он заставил её согнуться, накинул на голову пакет и сжал пальцы вокруг её шеи. Она сучила руками, пыталась оттолкнуть его, ударить, но это не получалось. Он слышал её учащённое сердцебиение сквозь полиэтилен. Она затихла через пару минут. Номер шестьдесят шесть. - Твои родители, - сказал он ещё живому пареньку, складывая трупы кучкой. По балкону он влез в квартиру рядом. Здесь играла тихая музыка, и лился приятный тусклый свет. На столе в гостиной стояли камеры с открытыми лотками для кассет. Из ванной комнаты доносился плеск воды. Там стояли два очень щуплых мужчины в домашних халатах. Они стояли спиной к двери, рассматривая проявленную плёнку. Один из них, тот что левее, вдруг ощутил руки, резко обвившие его голову. Рывок в сторону, его голова с хрустом повернулась назад, чуть не совершив полный оборот. Номер шестьдесят семь.

Page 177: VR-Online (April 2010)

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

Page 178: VR-Online (April 2010)

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

Page 179: VR-Online (April 2010)

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

Page 180: VR-Online (April 2010)
Page 181: VR-Online (April 2010)

ОБЗОРЫ ОТ VR

Игорь Антонов aka Spider_NET [email protected]

Drupal: Создание и управление сайтом После того как в январе этого года мы с Lord of fear перевели VR-Online на Drupal, я решил во чтобы то ни стало выделить время и попытаться как можно лучше познать эту систему управления контентом.

«А что там изучать?» – возразят многие. Справедливый вопрос и на него у меня есть ответ. К несчастью (а может наоборот), Drupal не похож на продукты подобного типа. Это не WordPress или Joomla. Тут недостаточно просто «тыкать» мышкой и заполнять формы. Drupal дает гибкость и мощь, за которую приходится платить простотой использования. Я не хочу сказать, что на базе Drupal – а невозможно создать проект, не прибегая к написанию кода. Ни в коем случае! Типовой сайт на нем поднять легко. Причем такой проект можно не хило прокачать сторонними модулями. Я совсем забыл сказать, что модульность – это одна из главных фич Drupal. С каждым днем их становится больше и уже сейчас их хватает на решение практически любых задач.

Сорри, я немного отвлекся и ушел в сторону раздачи комплиментов. Каюсь, но я действительно восхищен мощью Drupal и просто не мог, не поделиться с тобой своими эмоциями. Выговорился. Теперь перейду к главной теме этого поста. Мне очень нравится читать книги в бумажном варианте, и я решил, что неплохо бы прикупить хорошую книгу про Drupal. Я был очень огорчен когда, пробежавшись по своим любимым книжным магазинам (ozone, books.ru), т.к. я обнаружил всего лишь две книги по нужной мне теме. Подумал-подумал и решил купить их обе. Одна из книг целиком и полностью ориентирована на программистов, а вторая на начинающих пользователей. Сегодня я рассмотрю вторую. Итак, поехали. Немного о книге Перед тем как рассказать о своих впечатлениях, хочу немного рассказать о содержании книги. Главная цель книги – познакомить читателя с системой Drupal и продемонстрировать процесс разработки нескольких web-проектов (само собой на примере Drupal). Практически каждая глава книги (а их всего 11) – это история создания отдельного проекта. Исключением можно назвать разве что первую главу и самую последнюю. Сразу хочу сказать, что по этой книге ты не научишься программировать под Drupal. Все приведенные рецепты/примеры базируются на применении модулей из богатого репозитория. Хотя нет, я немного лукавлю. Совсем чуть-чуть программирования будет в

Page 182: VR-Online (April 2010)

самой последней главе. В ней авторы, немного затронут одну из самых сложных областей познания Друпал – темизацию. Проекты рассматриваемы в книгу Думаю, перед покупкой книги тебе будет интересно узнать о проектах, построение которых будет рассмотрено. Всего их 8: Каталог вакансий. Представьте, что перед вами встала задача организовать каталог вакансий для университета. Решить подобную задачу можно несколькими способами. Авторы очень подробно расскажут о своем решении на Drupal. Обзор продуктов. В примере рассматривается построение сайта каталога любых продуктов. Основная фишка сайта – предоставление пользователям выставление оценок/голосований/рейтинга, комментирования и все в таком духе. Сами товары будут добавляться не вручную, а подтягиваться из известного американского магазина – Amazon. Wiki. Что такое Wiki рассказывать не нужно. А вот как сделать что-то подобное на Drupal будет рассказано в пятой главе этой книги. Управление процессом публикации. В этом приеме, авторы расскажут о том, как можно построить полноценный портал статей/новостей. Авторы материалов смогут управлять своими работами: выполнять публикацию материалов (с предварительной модерацией), вносить изменения в ранее опубликованный контент. Если ты собираешься строить свой блог/новостной сайт, то этот пример тебе очень пригодится. Фотогалерия. По названию уже можно было догадаться, что речь пойдет о создании фотогалерии. Маленькие превью, загрузка изображений на сервер, автоматическое корректировка фотографий, организация просмотра полноразмерных изображений и многое другое. Многоязычные сайты. Drupal может похвастаться созданием сайтов с одновременной поддержкой нескольких языков. Собственно говоря, пример отлично демонстрирует это. Интернет-магазин. В главе рассмотрено построение типичного интернет-магазина на базе Drupal. Пример вполне работоспособный и для многих проектов его можно считать готовым решением. Управление событиями. В этой главе будет рассказано про создание сайта, на котором пользователи смогут планировать мероприятия, оформлять подписку на предстоящие события и т.д. Мои впечатления Стиль изложения В целом стиль книги мне понравился. Все написано простым языком и без лишней воды. При чтении заметил, что местами хромает перевод. Видно у переводчика кончилась фантазия или его достало подбирать синонимы.

Page 183: VR-Online (April 2010)

Полезность информации На мой взгляд, в книге нет воды и всяких больших лирических отступлений. Это мне очень понравилось, т.к. в последнее время мне часто попадаются книги, авторы которых любят поговорить «за жизнь». В этой же книге все ok. Еще раз убедился, что издательство O’Relly плохих книг не делает. Подборка информации оставляет приятные впечатления. Прочитав ее, ты, конечно же, не станешь гуру-друппаллером, но строить типовые проекты и подбирать модули однозначно научишься. На мой взгляд, именно это и нужно начинающему друппалеру. Авторы понимают, что сначала человека нужно максимально заинтересовать, а уже потом начинать раскрывать все интимные подробности. Моя оценка Моя оценка книге 5/5. Для тех, кто ни разу не видел Drupal, но очень хочет познакомиться с ним – лучше книги не найти. Книга очень легко читается и воспринимается. В этом особая заслуга авторов и переводчика. Прочитав книгу, ты однозначно сможешь начать разрабатывать свои сайты. ИТОГИ: Полезность: 5/5 Стиль изложения: 5/5 Перевод: 4/5 Оправданность цены: 100% Качество печати: 5/5 Купить эту книгу ты можешь в магазине books.ru. Прямая ссылка на книгу в магазине: http://www.books.ru/shop/books/728178

Page 184: VR-Online (April 2010)

ОБЗОРЫ ОТ VR

Игорь Антонов aka Spider_NET [email protected]

Библия C# Уже примерно год назад на прилавках магазинов появилась новая книга Михаила Фленова – «Библия C#». Мне всегда нравились Мишины книги (многие из них очень сильно мне помогли). Я до сих пор считаю, что его Библия Delphi – настоящий бестселлер. А как иначе, ведь именно благодаря этой книге (а я ее читал еще задолго, как она стала продаваться) я смог сделать первые шаги в программировании. Как бы многие и не утверждали, что книга написана непрофессионально, я открыто заявляю, что это не так. Для новичков – это лучший guide. Узнав, что Михаил написал Библию C#, я сразу же поспешил ее приобрести. Эту книгу я покупал в большей степени не для себя. На то время, у меня уже был небольшой опыт работы с Си диезом, и книга для новичков уже вряд ли смогла мне пригодиться. Тем не менее я совершил покупку и ничуть не жалею. Более того, я полностью прочитал эту книгу и сейчас поделюсь с тобой своими впечатлениями. На кого ориентирована книга В первую очередь, книга ориентирована на абсолютных новичков. Если ты только что решил связать свою жизнь с программированием, то книга однозначно придется тебе по душе. Все написано простым языком (впрочем, как и все книги Михаила) и вся теория подкреплена практическими примерами. Каждый пример отражает суть главы и не содержит ничего лишнего. Мне всегда нравился подобный подход, т.к. иногда я натыкался на книги, в которых теории был дан минимум, а пример приводился достаточно сложный или вообще слабо демонстрирующий описанные возможности. В Библии C# с этим все в полном порядке. Книга будет также полезна тем, кто уже имеет опыт программирования на каком-либо языке и собирается начать изучать C#. Если последнее предложение про тебя, то считай, что книга сослужит тебе хорошую службу. Не стоит обманывать себя и думать, что прочитав «Библия C#» ты сможешь стать программистом-гуру. Одной Библии Си шарп для этого мало. Но вот взять хороший старт книга тебе поможет. Во всяком случае, проще руководства я еще не видел. Что в книге рассматриваются В книге дается необходимая вводная информация о платформе .NET и языке C sharp. Кроме того из книги ты узнаешь и научишься: - ООП. Многие, в курсе, что C# является полностью объектно-ориентированным языком программирования. Автор книги явно знает, как преподнести ООП максимально просто. Не могу сказать, что данная тема освещена в полном объеме (пойми правильно, по ООП

Page 185: VR-Online (April 2010)

пишут отдельные книги), но необходимый теоретический и практический уровень дан. - Создавать приложения с визуальным интерфейсом. Автор рассматривает все основные компоненты, которые используются для построения визуального интерфейса приложения. Под рассмотрением я подразумеваю описание всех необходимых свойств компонент, а также практические примеры их использования. - Разрабатывать консольные приложения. Консольные программы сегодня уже не так сильно распространены. Тем не менее, автор затрагивают эту тему. Написать что-нибудь консольное после прочтения ты будешь в состоянии. - Программировать базы данных. Данному вопросу уделено достаточное внимание. Автор покажет, как соединяться с базами данных и взаимодействовать с ними из своего приложения. - Работать с файлами XML. Данный формат сегодня используется повсеместно. Куда не глянь везде xml. Из книги ты узнаешь, как работать с файлами в этом формате из своего приложения. - Работать с потоками. - и т.д. Итоги Книга, однозначно, будет полезна всем тем, кто хочет совершить быстрый старт в C#. Простой язык изложения, полезные примеры, хорошо структурированная информация, как всегда интересные бонусы на диске – все это Библия C#. Если ты когда читал Библию Delphi, то приготовься, восхитится и этой книгой. Сайт автора книги: http://flenov.info Купить книгу в магазине books.ru: http://www.books.ru/shop/books/694267

Page 186: VR-Online (April 2010)

ОБЗОРЫ ОТ VR

Роман Костенко aka Lord_of_fear [email protected]

Умный будильник Дочитывал на днях мартовский номер “Железа” и наткнулся на интересный обзор. Автор писал о тесте будильника Axbo Sleep Phase Alarm Clock. Сначала подумал “А причем тут будильник, если журнал о железе?”. Оказалось, что это – уматный гаджет, который может подключаться к компу через USB. Затем увидел цену: 11k рубликов. Неожиданно. За какой-то будильник? Оказалось, что не так всё просто… Фишка вся в том, что самое идеальное для человека проснуться между двумя фазами сна: быстрым и легким сном. Когда время подходит к утру, фаза глубокого сна проходит, и начинаются чередоваться фазы среднего, легкого и быстрого сна. Если будильник прозвонит во время среднего сна, то тебе обеспечен тяжелый подъем, ибо проснёшься разбитым как корыто. Будильник Axbo умеет отслеживать текущую фазу сна и разбудить тебя как раз в “нужную” фазу. За полчаса до времени срабатывания будильник начинает мониторить твоё состояние и постарается разбудить как раз между фазами быстрого и легкого сна. Мониторинг производится с помощью браслета, который нужно одеть перед сном. Все данные между будильником и браслетом треллюются беспроводным способом. Поддерживается мультиплеер. Т.е. будильник может вести сразу 2-х человек .

Page 187: VR-Online (April 2010)

Пробуждение, естественно, произойдёт немного пораньше от запланированного времени, но зато у тебя будет лишних 15-20 минут на зарядку =) Не знаю насколько хорошо он работает. Но автор статьи в “Железе” пишет, что будильник знает своё дело и будит когда надо. Меня этот девайс прямо заинтересовал, что я задумался о покупке. Правда, дороговато как-то для будильника… Не считаешь?

Page 188: VR-Online (April 2010)

ОБЗОРЫ ОТ VR

Игорь Антонов aka Spider_NET [email protected]

Большая книга CSS Технология CSS сегодня стала уже стандартом при разработке web-сайтов. Времена голого и кастрированного в возможностях html прошли. Использование каскадных таблиц стилей дает нам громандные возможности и свободу действий, а также позволяет забыть понятие "табличная вертска". Несмотря на все плюсы данной технологии многие начинающие web-мастера пытаются обойти ее стороной. Происходит это вероятней всего из-за сложности освоения. Реально, после знакомство с html, применение css кажется чем-то необычным. Сужу по себе, с языком разметки html я познакомился в далеком 2003 году. Тогда мне нравилось пробывать себя в качестве web-мастера. Само собой, все оформление я пытался делать средствами html. Хорошего из этого не фига не выходило. Попробов заюзать css я жутко обломался. Та книга, которую я приобрел (по css) была написана ужасным языком и смогла только запутать меня, а не помочь. Как жаль, что в то время еще не было книги "Большая книга CSS". На кого ориентирована книга Книга будет полезна всем, кто решился на изучение технологии CSS. Автор рассказывает все последовательно, поэтому никаких знаний основ CSS от тебя не потребуется. Наличие навыков работы с html желательно, но не обязательно. Если до чтения книги ты ни разу не применял html тэги, то не волнуйся. Тебе вполне хватит какого-нибудь онлайнового справочника. Автор книги затрагивает достаточно много аспектов использования таблиц каскадных стилей. После прочтения ты уже научишься понимать и писать css код. Т.е. Сверстать страничку на базе этой технолгии для тебя не составит труда. Мое мнение о книге Книга мне очень понравился. Стоит отметить хорошую работу переводчика (автор книги не наш соотечественник). Стиль изложения простой и читать книгу одно удовольствие. Мне так понравилась книга, что я прочитал ее достаточно быстро. Данную книгу можно юзать не только как пособие для изучения CSS, но и как справочник. Лично я, когда начинаю заниматься версткой, то всегда держу эту книгу под рукой. Верстать мне приходится крайне редко, поэтому многие свойства я просто не помню. А тут открыл книгу и освежил память. Что даст тебе книга 1. Ты узнаешь всю необходимую вводную информацию о CSS. Разберешься со всеми необходимыми понятиями и прочими около css нюансами. 2. Научишься делать разметку страниц с помощью слоев. Словосочитание "табличная

Page 189: VR-Online (April 2010)

верстка" забудешь как страшный сон. 3. Узнаешь как форматировать средствами CSS текст. Более того ты поймешь какие шрифты лучше применять в web, а какие не стоит. 4. Поймешь как происходит выравнивание блоков. 5. Получишь священные знания создания минюшек для сайта. Только css и ничего больше. 6. Научишься создавать фотогалереи. 7. Узнаешь как правильно применять стили к web формам. 8. И многое другое. А что в итоге? Если ты нацелился всерьез заняться версткой, но у тебя отсутствует опыт в этом деле, то книга "Большая книга CSS" будет для тебя полезным приобретением. Прочитав ее ты сможешь получить все необходимые знания и сразу же приступить к выполнению реальных задач. Также хочу отметить, что эта книга не является исчерпывающем руководством. В ней описано далеко не все. Зато в ней есть все то, что тебе потребуется на первых порах.

Page 190: VR-Online (April 2010)
Page 191: VR-Online (April 2010)

Роман Костенко aka Lord_of_fear Немного о взаимоотношениях полов

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

Как то странно получается, но в свои 24 я так и не встретил ту девушку, с которой я готов хоть на край света. Так сложилось, что “бытовуха” уничтожает взаимоотношения напрочь. Считаю, что надо притираться друг к другу, стараться поначалу любую ссору замять, спустить на тормозах, ограничившись выяснением отношений без повышенного тона, обид и т.п. Каждый высказался, все друг друга поняли и приняли к сведению. Не люблю я ссор, не люблю криков и скандалов. Я живу по принципу “Поступай с другими так, как хочешь, чтобы поступали с тобой”. Объективная критика всегда мною принимается адекватно к рассмотрению. Я сразу ставлю себя на место другого человека и, если был неправ, то признаю свой “косяк” и прошу прощения. Вот только вся трабла в том, что меня, блин, нифига не слушают. Я говорю, а всё как горохом о стену. Через несколько месяцев меня всё достаёт и мы больше не общаемся. Сыпятся звонки, смс-ки “прости, была неправа” и т.п. Прощу – начинается всё с начала. В последних отношениях не простил даже после первой такой ситуации. Каждая девушка чувствует себя королевой. И это правильно. Надо любить себя. Иначе никак нельзя. Если девушка не дорожит собою – грош ей цена. Однако, это уже переросло во что-то неправильное, извращённое. Я не говорю про всяких богатых гламурных девочек… Я говорю про обычных девушек, которые учились с тобой в одной школе, на одном факультете в институте, так же, как и ты, ездят на работу на автобусе, снимают

Page 192: VR-Online (April 2010)

квартиру подальше от центра, чтобы подешевле было… Но зато она – королева. “Это я делать не буду, это мне не нравится, это я не хочу”. Может я немного сгущаю краски, но в общем оно так и получается. Откуда это? Первая мысль, что мне приходит в голову – зомбоящик. Всякие MTV, RuTV, МузТВ… Они, наверное, навязывают такое мышление. И фиг убедишь в обратном. Она сидит после работы каждый день по 2 часа(!) рисует новый узор на ногтях и смотрит Дом2. А на утро мне жалуется, что ничего не успела сделать. Да ты бы подняла с дивана свою попу и пошла погуляла, жирок растрясла… Надо двигаться. Я встаю за 3 часа до начала рабочего дня. Успеваю пробежать пару-тройку километров со Spider_NET’ом, потягать гантели, погладиться (если необходимо. Всегда хожу в брюках и рубашке), покушать, помыться и доехать до работы… Почему после ссоры из за её вспыльчивости я никогда не слышу “Извини. Была неправа”? Конечно же, она мне первая звонит как ни в чем не бывало. Я понимаю, что раз позвонила сама первая, то какой-то частью мозга осознала свою неправоту. Занятно, короче, получается :)

Не так давно узнал, что есть, оказывается, по вечерам нельзя. Спросил “Почему?”. Получил ответ “Худею”. Все мои предложения нормально питаться и заниматься спортом были отвергнуты. И правильно… лучше на диване полежать, ящик посмотреть. :). А ещё за просмотром нужно вмазать плиточку шоколадки. Чтоб скучно не было. :) Сказал однажды “Давай пожарим курицу в духовке”. Она сказала “Не знаю. Не умею.”. Позор! В 25 лет не уметь даже готовить. А что там уметь то? И позор не ей одной, а всем, кто в таком возрасте ответит так же. Когда мои родители были в моем возрасте, я уже умел

разговаривать. А фраза типа “Не знаю”, “Не хочу”, “Мне лень” меня вообще бесит. Полная безынициативность. :( Это – совсем не то, что хочет услышать другой человек. Надо сказать “Конечно. Давай.”. Знаешь в чем проблема молодежи? Отсутствие хобби. Не у всех, конечно, а у большинства. Так получается, что с девушкой и нет общих интересов, кроме того, что вы друг друга привлекаете физически. Знаю реальные случаи, когда мужчина уходили к другой, с которой был общий интерес. Например, катание на лыжах. У меня интересов же столько, что, если заниматься ими всеми, то надо увольняться с работы =) Ибо в сутках не 48 часов. Эта часть была опубликована у нас на блогах. Было много интересных комментариев. Вот некоторые из них: jimmy jonezz Полностью согласен с выше сказанным, с каждой буквой, словом, фразой и предложением. Словно ты написал мои мысли. Наверное так бывает. Очень интересно. По-поводу спорта, у меня всегда вызывает умиление разговоры о диетах. Зачем ограничивать себя в еде, когда можно просто заниматься спортом: утром зарядка и вечером. Наслушался я разговоров о диетах и однажды меня прорвало по поводу занятия зарядкой по утрам, на меня так посмотрели словно я инопланетянин. Ведь девушкам проще выступать в роли мученицы – я страдаю, я на диете, чем заставить себя работать физически, хоть чуть-чуть.

Page 193: VR-Online (April 2010)

На девушках не стоит заморачиваться, как только привыкаешь, прикипаешь, считай сам одел хомут, остается сжать зубы и тащить повозку, на которой восседает “королева”. По большому счету они нужны только для секса и не более. Да, звучит грустно и может быть не правильно, но это так. Как таковой любви не существует, она лишь цемент, связующее звено. Со временем остаются только отношения, поставленные на уважении друг к другу. Spider_NET +1. Только что вернулся с пробежки и прочитал этот пост. Не мог удержаться, чтобы не внести свои две копейки. Очень интересные рассуждения. Я всегда говорил и говорю – нужно двигаться вперед. Как бы там ни было, не нужно впадать в ступор. Каждый день нужно что-то делать и проживать его по полной. Успевать максимум! Lord знает, что у меня практически нет свободного времени и я страдаю хроническим недосыпом, но с утра я готов вытащить себя на пробежку, а вечером я с удовольствием бегу на всевозможные курсы и т.д. Жизнь дана человеку чтобы развиваться и постигать новое. Про зомбоящик ты правильно заметил. Хорошего он ничего не дает. Только жрет время и полезный креатив. Как можно чем-то заниматься если ты увидел порцию дерьма? У нас же как, либо криминал, либо “популярное” шоу “Дом 2″, от которого мне хочется блевать. Отношения между мужчиной и женщиной – отдельная песня. Тут все реально сложно. Я не соглашусь с высказыванием “что любви мол нет”. Она безусловно есть и это хорошее чувство, которое каждый испытывает по своему. Ведь если смотреть с научной точки зрения, то любовь – это реакция мозга, а значит каждый испытывает ее по разному. На мой взгляд идеальные отношения между мужчиной и женщиной (имеется ввиду после периода страсти) – это дружеские. Т.е. если любовь в будущем перерастает в дружбу, то это и есть идеальные отношения. Когда мужчина и женщина пытаются идти в ногу и не заморачиваться по пустякам – это есть великое счастье. Увы, зомбоящик правит людьми и учит нас жить (именно поэтому я его и не смотрю), а хорошего там очень мало. И уж точно не на МТВ, ТНТ и т.д. Да, многие отрицают этот факт, но оно так и есть. Вспомните своих друзей/подруг которые смотрят “Дом 2″. Наверняка многие говорят, что это галимый отстой, но продолжают его смотреть. Так уж получается, что сегодня многим интересней НАБЛЮДАТЬ ЗА ЧУЖОЙ ЖИЗНЬ, ЧЕМ СТРОИТЬ СВОЮ. Johnta эээ.. ребята, вы че)? Такими темпами девчонки вконец наглеют, а потом на место поставить огого как трудно будет :) надо показать свой характер и сразу объяснить, что к чему. И не надо тут говорить типа нельзя так с девушками нагло разговаривать, мама не позволит проч. С самой милой и циничной улыбкой на лице и спокойным голоском объясняешь, что к чему, типа “так, подруга, марш на кухню, чтоб через 5 минут был готов мой обед”. Нет, иначе нельзя. девчонки любят хамское, наглое и циничное требование, мужской характер, а не тряпку, не культурное и вежливое в духе “ты не могла бы…”, “почему…” и т.д. Заставляй их самих бегать за тобой, а не наоборот. Это не значит, что ты с топором в руке должен предъявлять это все :). Но это не относится к девушкам-друзьям, и своей суженой-ряженой, хотя и ей нельзя давать расслабиться ;)

Page 194: VR-Online (April 2010)

Одним словом с друзьями, девушкой, с которой ты общаешься с самыми серьезными намерениями можно и вежливо, и аккуратно. Ко всем остальным – самым пофигистским образом. Словами трудно объяснить, хотя я постарался ;). все парни с этим сталкиваются, но, поверьте, это легко исправимо ;) Vadim Зря вы так про телеящик. :)Мне, например, нравится канал “Культура”. Иногда там показывают очень интересные вещи, например, три тенора (фамилии называть не буду, дабы не делать рекламу :)) когда поют, подглядывают в свои шпаргалки, прямо как и я. :)И это доказывает, что они тоже люди. :) Если серьёзно, то телеящик не формирует подобную убогость духовной жизни. Её формирует весь предыдущий опыт человека. Заметьте – не ребёнка, а именно человека, ибо ребёнок тоже человек. Представьте себе самую обычную ситуацию – ребёнок обращается к родителям с разными “а зачем”, “а почему”. Реакция на это, после парочки “вырастешь – поймёшь” и вообще уродская – “отстань, мне некогда”. Как вы думаете, куда ребёнок после этого будет обращаться? В телевизор, больше некуда, т.к. его друзья\подруги находятся в той же самой ситуации. А теперь – о принципиальных возражениях этой статье. Девушки вас не слышат. Это понятно. К сожалению с парнями абсолютно та же ситуация – парни совершенно не слышат девушек. Конечно я слегка преувеличиваю, но, в целом, так и есть. Ведь проблема не в слышимости, проблема в понимании друг друга. Опять же, понимание это закладывается в глубоком детстве – во взаимоотношениях родителей. К примеру мама чудно готовит и очень хорошо стирает, отец точно так же чудно лежит на диване пялясь в телевизор, куря в квартире, сплёвывая на пол и макая бычки в горшки с цветами. На все, сначала, увещевания, что так делать нельзя, а потом уже и откровенные скандалы, реакция только одна – пофигистская – “я мужчина, я так всегда делал и буду делать! А если не нравится – вот тебе очередной фингал под глаз”. При таких взаимоотношениях, что мальчик, что девочка, вырастают с серьёзно ущемлённой психикой. Дальше – больше. Они хотят такую жизнь исправить. А как? Рецепт буквально на глазах – в телике. Там приходит принцы (принцессы) и, после нескольких недоразумений, наступает всеобщее повальное счастье. Надо только твёрдо придерживаться выбранного образа жизни. :) nubliK Подпишусь под каждой буквой этой статьи. НО! Я, наверное, везунчик, мне такие приживалки попадались совсем не часто, точнее я не часто с такими общаюсь. И есть у меня дружок, который “курочками” таких малюток называет. Мне кажется причина не только в отсутствии хобби, а в форме воспитания теми же родителями, и, наверно, неспособностью девушкой понять, что за нее никто ничего делать не будет… или даже не так, нежеланием решать проблему. ведь это же трудиться надо, мозгом шевелить, ручками и ножками двигать… В общем, я автора поддерживаю, осталось надеяться что если у автора родится девочка он найдет в себе силы не баловать ее без повода =) Итого

Page 195: VR-Online (April 2010)

Вот такое обсуждение получилось. Тема взаимоотношения мужчины и женщины – вечная тема. По этому вопросу написаны книги. Я всего лишь вскользь затронул эту проблему, а как быстро завязалось обсуждение. :) Под конец хотелось бы тебе, читатель, пожелать 100-процентного взаимного понимания с противоположным полом. Хотя, 100% не даст даже Бог, то сойдёмся на 99% :) . Удачи!

Page 196: VR-Online (April 2010)

Роман Костенко aka Lord_of_fear КАК РАБОТАТЬ С ТУПЫМИ ЛЮДЬМИ

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

Для общения с такими людьми нужно проявлять рассудительность и хладнокровие. Ибо вывести из себя они могут очень быстро. Как то наткнулся в интернете на такое выражение: "тупые люди - как тупые ножи: вроде и вреда причинить не могут, но бесят!". Да. Тупые люди бесят. Особенно бесят наглые и тупые люди. А если твой начальник один из них, то хочется кричать "A-A-A-A-A!!!" :) Было и у меня такое. Благо, что я в этой конторе недолго проработал...

Каких же принципов нужно придерживаться, общаясь с "тяжелыми" личностями? 1. Воздерживаться от ненужных ссор и споров. Не нужно вступать в споры и ссоры с "невменяемыми" личностями, которые слышат только себя. В первую очередь нужно помнить, что, вступая в ссору, мы наносим вред именно себе. Ведь весь негатив, который мы переживаем во время, и после ссоры, разъедает нас изнутри. Бывает, что человеку просто хочется выплеснуть свой негатив на кого угодно. А тут ты подвернулся. Лучшая реакция на такое поведение – это ее полное отсутствие. Не стоит тратить время на бессмысленные дебаты. На просторах рунета я прочитал такую мысль: "Спорить с начальником бессмысленно, спорить с женой опасно для здоровья, спорить с ребенком глупо, так как вы по определению правы. И что же осталось? Ах, да! Спорить с друзьями. Ну, это отдельный разговор. Спор с другом - это уже или пари, или спор ни о чем, иначе это уже не спор, а драка. И вот тут побеждает простая истина, у кого кулаки больше, тот и прав! Так как? Будем спорить?". Если применить это к нашей ситуации, то спорить совсем не нужно :) 2. Не дать этому человеку убедить себя в его правоте.

Page 197: VR-Online (April 2010)

Если дело, всё таки, дошло до споров, то будь готов отстоять свою точку зрения в то время, как будет навязываться его мнение. Говорят, что человек состоялся морально, когда собеседника с полярной точкой зрения не считает неадекватом. Но т.к. мы уже определились, что собеседник неадекватен, то можно о себе не волноваться :) 3. Быть готовым к спору на публике С самого детства нам внушают: спорить плохо, а спорить с взрослыми плохо вдвойне. Взрослый всегда прав, так как он умнее и опытнее. В дальнейшем, когда немного подрастешь, ты начинаешь понимать что это не всегда так, и появляется другое определение - в споре рождается истина. А в дальнейшем, когда появляется «авторитет», мы снова, как в детстве, начинаем считать, что спор (с вами) это плохо, так как вы и опытнее, и умнее. Одной из характерных черт неуживчивых людей является то, что они склонны унижать свою "жертву" на публике. Спор "на публику" немногого стоит, его исход зависит от состава и предрасположенности аудитории. Даже если очень удачно выстроить аргументацию, противоположная сторона в таком споре никогда не сдаст позиций и, конечно же, останется при своем мнении. 4. Будь сдержан Не обращай внимание на оскорбления, которые сыплются в твой адрес, и попытайся не дать ситуации перейти в личный конфликт. Где бы ты не столкнулся с проявлением унижения и оскорбления, без сдержанности и самообладания тебе никак не обойтись. Вспыльчивые люди навлекают на себя дополнительную порцию злостных эмоций со стороны обидчика, и только разжигают бурю страстей . Поэтому воспитывай в себе при каждой возможности сдержанность и самообладание. И когда сложится ситуация, где их необходимо будет применить, тебе будет легче справиться. Напомни себе, что использовать те же методы (оскорблять и унижать в ответ) – это значит проявить слабость, принять поражение, утратить чувство собственного достоинства. Никогда не пользуйся теми же методами. Самая лучшая реакция, сказать человеку в ответ , что в таком тоне ты общаться не намерен. Отстранись от него, займись своими текущими делами. Конечно же, трудно сдерживаться, когда тебя поливают грязью. Так и хочется сказать в ответ что-нибудь эдакое да позаковырестее, чем оппонент. Вроде хочешь выйти в этой перепалки победителем, а в реальности становишься таким же, как и твой “собеседник”. Палка о двух концах :) 5. Оставайся объективным Допустим, что у тебя в подчинении есть человек с тяжелым характером. Ты должен научиться ладить с людьми, которые плохо уживаются с другими сотрудниками. Оставайся профессионалом и будь объективен - никогда не принимай чью-либо сторону. Веди себя нейтрально. Если тебя просят разобраться с ситуацией, когда кто-то ведет себя недостойно в течение длительного времени, спроси себя: такую ли большую ценность представляют они для компании и оправдывают ли они вложенные в них средства? Есть ли смысл раскошелиться

Page 198: VR-Online (April 2010)

на тренинг по управлению собственными эмоциями, или будет лучше просто дать им уйти? Необузданный нрав трудных людей может привести тебя и твою организацию прямо к судебному разбирательству. Итог. Вот такое вот небольшое руководство к действию. “Спокойствие. Только спокойствие” говорил всем известный мультипликационный персонаж :) Будь и ты спокоен. Удачи тебе.

Page 199: VR-Online (April 2010)
Page 200: VR-Online (April 2010)

Сообщество vr-online, сегодня, находится на новой волне, не берусь оценивать точно, но

до 10-и бальной не хватает совсем чуть-чуть. Ощущается движение и это движение заметно усиливается, пускай и малыми порциями. Активное участие я начал проявлять практически год назад, года 3 назад - я впервые узнал об этом ресурсе (Big thanks to Soffrick), поэтому я с уверенностью могу судить о том, что происходит. Везде есть трения, разногласия, нестыковки, но в "деле" остаются только те, кому это действительно интересно и нужно. Десять лет, немалый срок, если учитывать то обстоятельство, что все держится на чистом энтузиазме, и можно только восхищаться и радоваться, что это сообщество? еще живет, и не просто живет, а приносит плоды - блог, подкасты, смена движка и обновление сайта. Отдельного слова заслуживают журналы, которые, как вы можете судить сами, каждый раз штурмуют новую планку. Этой планки, я надеюсь, мы будем придерживаться еще долгое время и покорять новые вершины. Я очень рад, что мы трое (Soffrick, Kastor и я) удачно влились в коллектив VR-online, рад что можем приносить свои мысли и идеи в этот ресурс, дополнять его своими статьями. Я искренне надеюсь, что волна на которой находится сообщество VR еще долго не иссякнет.

Антон Козлов aka JimmyJonezz

Красивая девушка стоит посреди современных многоэтажных домов и смотрит вдаль. Прямые черные волосы, солнце защитные очки и строгий костюм не оставляют сомнений, что она как то связана с миром информационных технологий. Лучи солнца пробивают некую плазменную панель, на которой видны различные графические объекты и техническая документация. Я уверен, что она техническая. Иначе и быть не может. Эта картинка для меня всегда являлась символом развитого, технологического будущего. Вспомнил откуда она? В самых первых выпусках VR-ONLINE она была размещена вверху страницы перед интрой. До чего же я балдел от этого журнала. Первым делом я всегда читал вступление. В разных журналах его писали разные тимовцы VR и всегда это были интересные темы для меня. Еще бы! Те, кто создают такой интересный журнал, делятся частью своих мыслей, рассуждений, жизни с тобой. Я до сих пор балдею, от таких рассказов, как «BloodyHart» и «DarkHorror». В них я нашел часть своих юношеских фантазий о технологическом будущем и борьбе молодого поколения против посягательства на свободу. И пусть они, как и многие статьи в VR, написаны не профессиональным языком. Некоторые назовут это недочетом, хотя, для меня это скорее фишка. Большинство статей дается легко и в доступной форме. Здесь следует поблагодарить создателя VR, Horrific’a. Именно «по его вине», доступным статьям и книгам я начал изучать программирование. Здорово, что Михаил Фленов создал этот клевый проект, который держится на энтузиазме команды и объединяет стольких единомышленников. Здорово, что у VR есть целая история с выпусками своего журнала, переделкой сайта, притоком новых посетителей. И как здорово, что у VR есть сейчас такая креативная, энергичная и трудолюбивая команда, которая продвигает проект и делает его все лучше. Современный ВР мне очень по душе. После ряда перемен и модернизаций он смотрится супер достойно. Поздравляю тебя с днем рождения, VR-ONLINE! Тебе сегодня 10 лет! Удачи, процветания и новых посетителей на твои просторы! Роман Волков aka Kastor Первый раз придя на VR, я не пробыл на сайте даже пяти минут. Меня отпугнул дизайн. Но со временем я понял, что Virtual Reality Online это не просто сайт, это целый мир. Я

Page 201: VR-Online (April 2010)

говорю не о джаббер-конфе, блогах, подкастах и прочем. Я говорю о том, что VR в некоторой степени похож на нашу планету. Он так же пережил насыщенную жизнь, хоть и в доисторическую эпоху, потом пережил падение метеорита и катастрофу, а сейчас наступил момент эволюции. Хоть сейчас на сайте и мало народа, но я верю что в скором времени все изменится, и наш портал станет популярным и нужным для всех IT-совместимых людей.Что есть VR-Online сегодня? Это новая, активная команда, современный дизайн, журналы выходят регулярно, при этом качество статей и оформления вышли на новый, качественный уровень, и главное, чтобы команда VR не останавливалась на достигнутом, а уверенно шла вперед.

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

С момента своего рождения VR пережил многое. Было время, когда посещаемость была практически нулевой и у самого Horrific'а возникали мысли дропнуть проект. Каждый раз его что-то останавливало. Было и наоборот - посещаемость зашкаливала, форум просто врывался от количества ежедневно оставляемых постов. Да что тут говорить, много всего произошло. Все перемены и невзгоды VR мужественно переносил и всегда воскресал из пепла. Сколько раз его пытались похоронить - все тщетно. Подобно птице Феникс VR-Online восставал из праха. Это просто здорово и заслуживает восхищения! Десять лет - это солидный срок! Особенно это касается проектов, работающих на голом энтузиазме. Сегодня VR уже не тот проект, которым он был 10 лет назад. На мой взгляд, нам удалось сделать значительный рывок вперед и начать строить абсолютно новый VR. Да, последние два года были просто ужасными, но 2010 внес свои коррективы. Подобно быстрому и бесстрашному тигру мы стали поднимать проект. Результат на лицо: новый двиг, два дизайна, стабильный выпуск журналов, отдельный и постоянно обновляемый проект "Коллективные блоги VR-Online" и т.д. Причем все это было сделано меньше, чем за полгода. Если дальше будем двигаться в таком же ритме, то к концу года наша посещаемость существенно возрастет и VR вновь станет хорошей IT'школой. Мне очень нравится, что VR-Online оживился, и многие люди пытаются помочь его развивать. За это им отдельное спасибо! Надеюсь, дальше будет все идти в таком же духе. С днем рождения милый VR-Online, существуй еще долго и процветай! С ДНЕМ РОЖДЕНИЯ!!! Игорь Антонов aka Spider_NET VR для меня - это больше, чем просто проект. Это – уже кусочек моей жизни. Хоть я и занимаюсь проектом всего 3 года, но зато он мне стал ближе некуда. Время не всегда удаётся ему уделять, но я делаю всё возможное. За 3 года VR реально сильно преобразился. Жаль, что Миша Флёнов оставил проект. Но, видимо, у каждого приходит тот момент, когда уже хочется уйти на покой. Мы же со Spider_NET’ом переняли заботу о ВР на себя. На данный момент имеется много идей по развитию ресурса. Наши блоги всего 2 месяца в строю, а посещаемость уже достаточно неплохая. В принципе, и с основным сайтом дел ещё достаточно, но и болгами тоже занимаемся. Ещё даже не все статьи из журналов перенесли. В скором времени ещё что-нибудь придумаем. :) Хочется сказать спасибо всем, кто принимает участие в жизни VR-online. Даже если ты впервые на ресурсе, всего лишь скачал и читаешь первый наш журнал, то всё равно СПАСИБО. Ведь всё это делается для тебя. Да прибудет сила с VR! VR жив пока хоть один

Page 202: VR-Online (April 2010)

человек будет помнить пароль админа, пока есть хоть один посетитель на сайте. Всё равно тебя не брошу потому, что ты хороший =) С днём рождения, VR-Online! 10 лет! Совсем большой уже стал. :)

Роман Костенко aka Lord_of_Fear

Тема рубрики "Мнение VR" сегодня довольно обширная, и описать все в пару строк не получится, но я постараюсь. На VR я давно, более 3 лет вроде, и я успел насмотреться на многое: и на взлет популярности, и на "замораживание" проекта, и снова на взлет и так далее. Причины некоторых не очень хороших обстоятельств развития проекта разные: нехватка времени, занятость, временная болезнь и прочее. И это понятно, ведь все мы люди. Но как бы то ни было, VR-Online живет уже 10 лет! И постоянно развивается, обновляется, дополняется, улучшается! Сегодня можно лицезреть в лице данного проекта удобную, информативную и перспективную среду обитания для программистов любого уровня знаний. Сегодня, VR это: прекрасный электронный журнал с интересными и полезными статьями, набор подкастов, постоянно обновляющиеся новости, блоги, online статьи различных тематик, обширный форум, круг умных и приятных в общении людей! Это огромный кладеж знаний, которыми всегда рады поделиться авторы журнала и обычные программисты на форуме. К нам приходят и новички и любители, и всем мы стараемся дать ответ. Проект развивается и будет развиваться, о чем свидетельствуют многочисленные нововведения как в насыщенность журналов, так и функционал самого сайта. Проект никогда не был коммерческим, он всегда терпеливо и вежливо относился к людям, ничего не понимающим в программировании, но желающим ему научиться, всегда предоставлял возможность высказаться! В общем чего говорить - откройте сайт и Вы сами все уведите, весь кропотливый труд, произведенный администрацией форума. Ну а VR я лично хочу пожелать удачного процветания, большого числа посетителей, повыше уровня ТИЦ и PR ну и долгих лет жизни! :) Никита Булай aka Bulka Моя первая статья по программированию была опубликована именно на этом сайте. Десять лет азад. И именно благодаря vr-online и его лидеру (точнее, он и был всем vr-online :)) Михаилу Фленову я нашел себя в журналистике в целом и в компьютерной журналистике в частности. Единственное пожелание к проекту сейчас - делать прямые ссылки на статьи. Блин, ну вот не хочется мне качать журнал одним файлом, что тут поделаешь? Хочу как раньше, читать постатейно :). А так – все путем, респект Игорю Антонову, который пришел на смену Михе Фленову в деле руководства этим проектом.

Александр Лозовский aka Dr. Klouniz

Page 203: VR-Online (April 2010)
Page 204: VR-Online (April 2010)

Игорь Антонов aka Spider_NET [email protected]

Как посчитать количество фйлов в Unix Сегодня у меня в голове возник, казалось бы, простой вопрос: «Как посчитать количество файлов/папок в консоли unix-like систем?». С linux’ом у меня крайне мало опыта работы, поэтому вот сходу ответ придумать решение не смог (позор!!!). Хотел было уже на все это положить железный болт, но моя любознательность взяла свое, и решил я подключиться на наш сервер, работающий под FreeBSD. Уж больно захотелось быстрых экспериментов. Что из этого получилось – читай дальше. Итак, SSH клиент задорно мигнул и представил моему взору голую консоль бзди. Вообще, у нас на работе всеми животными (linux’ами) и адскими созданиями (freebsd) рулит Lord_of_fear. Я знал, что lord непременно знает ответ на мучивший меня вопрос, но решил попытаться дойти до решения самостоятельно. Сначала я думал, что мою скромную потребность может удовлетворить команда ls. Тыкал и так и сяк, но, то, что мне, было, нужно не нашел. Почему я подумал на ls? Да потому что с помощью ls выдает список файлов и папок запрашиваемого каталога в разных представлениях. Мне как человеку с отсутствием должного опыта показалось логично, что операция как подсчет файлов полюбас должна быть организована. Увы, я ошибся. Ну, ничего, стал ковырять дальше. А дальше было самое интересное. Я вспомнил, что есть такая команда как wc. Для тех, кто не в курсе рассказываю. При помощи wc можно посчитать количество символов/строк (ключ l) /байт и т.д. Немного пошевелив извилинами, мой мозг сгенерировал следующее решение: rod$: ls | wc –l

Команда тут же выплюнула мне число 22. Эксперимент удался. Я получил число файлов и каталогов текущей директории. Цель вроде была достигнута, но тут я решил, что было бы здорово получить именно количество файлов, т.е. без учета директорий. Стал опять крутить вертеть комбинацию и докрутил до следующего вида: rod$: ls -l | grep ^- | wc –l

Команда успешно выполнилась и показала мне количество файлов. О том, как это работает я расскажу чуть ниже, а пока продемонстрирую подсчет количества директорий: rod$: ls -l | grep ^d |wc –l

Я не ошибся, команда опять выдала верный результат. Теперь я был полностью доволен. Ответ на вопрос получил, но мне все, же захотелось сделать еще один тест. На этот раз я решил посчитать количество файлов с определенным расширением. Думать уже не пришлось. Всего лишь изменил команду до вида: rod$: ls –l|grep php|wc –l

Как и следовало ожидать, в этот раз, команда также выполнилась без ошибок. Теперь

Page 205: VR-Online (April 2010)

немного отвлечемся и попробуем разобраться, что же я здесь такого написал. Итак, начнем с команды ls c параметром l. Сама команда ls в мире Unix предназначена для получения списка файлов/папок определенной директории. Если при вызове этой команды указать параметр l, то для каждого файла/папки будет выведена дополнительная информация. Под дополнительной информацией я подразумеваю дату, размер файла, права доступа и т.д.

Пример вывода информации при помощи команды ls с ключом l я показал на рисунке. Присмотрись внимательно к рисунку. Если ты не разбираешься в unix-like системах, то советую обратить пристальное внимание на самую первую колонку. В ней расписаны права доступа. Первый символ (-) перед маской прав означает, что это именно файл. Буква d наоборот, дает нам четко понять, что это каталог. Выходит для определения количества файлов в директории, нам всего лишь нужно посчитать строки, выведенные с помощью команды ls –l, у которых первый символ тире (-). Для решения этой задачи я использую команду grep. Саму команду grep я вызываю в той же строке, где и ls. После команды ls –l я указываю символ |, который означает, что результат выполнения команды (ls –l) нужно передать в качестве параметра для команды, указанной после вертикальной черты. Надеюсь, с этим моментом все понятно. Двигаемся дальше. Сама команда grep предназначена для осуществления поиска текста в файлах. В нашем случае эта команда будет использоваться для отбора строк, которые начинаются с символа (-). Мы знаем, что поиск нужно производить именно сначала строки (т.е. проверять именно первый символ), а раз так, то введем для grep уточнение. В мире unix-like сделано все очень гибко и было бы странным, если в grep отсутствовала поддержка регулярных выражений. Она есть, и грех ей не воспользоваться. Для решения этой задачи воспользуемся конструкцией: ^-. Те, кто еще не начинал учить регулярки, объясняю. Это выражение говорит о том, что первым символом должен быть именно -. Таким же алгоритмом я пользуюсь для подсчета количества директорий. Только на этот раз вместо символа -, я указываю букву d (directory). Думаю, про пример с подсчетом количества файлов с расширением php уже пояснять не нужно.

Page 206: VR-Online (April 2010)

Outro Вот так просто можно посчитать количество файлов/папок в ужасной и страшной консоли unix-like систем. Удачи!

Page 207: VR-Online (April 2010)

Роман Костенко aka Lord_Of_Fear [email protected]

Охлаждаем по-гиковски Сгорел, значит, у ноутбука на работе кулер, что охлаждает ЦП. Разобрал, начал исследовать. Попробовал в разъем для вентилятора подключить другой кулер. Работать он отказался. “Вот зараза!” подумал я. Померил напряжение. Оказалось, что и напряжение с материнки не подается… Хз что за сбой произошёл, но решил использовать отдельное питание для кулера… Нашёлся кулер 60х60, кусок картона и красная изолента. И замыслил я гиковскую мегамощную внешнюю систему охлаждения. Вот он виновник торжества:

Вот сама система охлаждения с демонтированным вентилятором:

Рад, что девелоперы этой модели Асера додумались сделать удобный доступ к системе охлаждения. Помнится, на моём первом ноутбуке Roverbook для доступа к кулеру необходимо было разобрать пол ноута. Вот уж я тогда пролетел с покупкой… Сам ещё не шарил, а посоветовать было некому. :( Сказать к слову, и это – не мой ноут, а корпоративный. Я бы в жизни такое гумно не купил :) Да простит меня компания Acer =)

Page 208: VR-Online (April 2010)

Да и не люблю я эти ноутбуки и нетбуки. И как люди умудряются их юзать вместо домашнего десктопа? Тормознутый процессор с заниженными частотами, низкая производительность дисковой подсистемы, маленький дисплей. Дома, например, под раздел с операционной системой сделал Raid0. Работать теперь одно удовольствие. Всё открывается, сохраняется, устанавливается мигом. Мне никогда не нравились системы охлаждения ноутбуков. Непродуманность такой системы видна на глаз. Понятно, что нужна компактность и легкость исполнения, но качество охлаждения очень страдает… Но вернёмся к нашим баранам. Я убрал сдохший вентилятор и вернул нижнюю крышку на место. 40 минут ковыряния и получилась вот такая забавная штука:

Работает вентилятор на выдув. Так будет проще понять. Путь прохождения воздушного потока нарисован синим:

Page 209: VR-Online (April 2010)

Забор воздуха идёт из под ноутбука, проходит систему охлаждения и выдувается через мою примочку :) Провёл несколько тестов. Охлаждает лучше стандартного. И шума меньше. Смотрится по-гиковски =)

Вот такую штуку можно сделать, если немного пофантазировать.

Page 210: VR-Online (April 2010)

Андрей Петрикин aka Zanuda25 [email protected]

Эффект “Полярное сияние” В этом уроке я продемонстрирую как поздать эффект “Полярное сияние» в бесплатном графическом редакторе Gimp. Шаг 1. Мы создаем новый файл размером 800х600 с черным фоном. Шаг 2. Белый цвет поменяй на цвет: 28188f , а задний фон оставить черным. В диалоге “Градиентная заливка” проставь следующие параметры: Градиент – Основной в фоновый; Форма – радиальная. Шаг 3. Теперь применяем градиент от центра холста к нижнему левому углу. Так должно выглядеть после применения градиента:

Шаг 4.

Page 211: VR-Online (April 2010)

Создай новый слой и залей его черным цветом. Затем перейди Фильтры > Визуализация > Облака > Разностные облака. В диалоговом окне установите следующие значения: - Случайное зерно – 3; - Отметь опцию “Турбулентный”; - Детализация – 5; - Размер по X – 16; - Размер по Y – 0.1.

Шаг 5. Теперь мы увеличим резкость изображения, чтобы лучше детализируются вертикальные линий. Переходим на Фильтры > Улучшение > Повышение резкости и ставим 72.

Шаг 6. Создаем новый слой. Теперь в диалоге “Градиентная заливка” выбираем Градиент – “Full saturation spectrum CW” и форма – линейная.

Page 212: VR-Online (April 2010)

Шаг 7. В окне “Слои” мы ставим режим “Перекрытие” и дублируем этот слой. И мы должны получить вот такое изображение:

Шаг 8. Объедини все слои за исключением слоя Фон, отключи “глаз” слоя Фон. Щелкните правой клавишей мышки и в контекстном меню выбери “Объедини видимые слои...”.

Page 213: VR-Online (April 2010)

Шаг 9. Теперь обратно включи “глаз” слоя Фон. Применяем инструмент “Свободное выделение” и растушуем на 70 (Вделение > Растушевка).

Шаг 10 и последний. Щелкни правой кнопкой мыши на слое “Новый слой” и выбери “Добавить маску слоя”. Отметь “Выделение”. Финал. Этот простой эффект можно использовать где угодно, главное – это зависит от полета твоей фантазии

Page 214: VR-Online (April 2010)

Оригинал статьи: http://gimp-tutorials.net/gimp_msnbc_effect

Page 215: VR-Online (April 2010)

Андрей Петрикин aka Zanuda25 [email protected]

Эффект “абстрактные волны” Шаг 1. Создай файл размером 640 на 640 пикселей... (Файл > Создать...)

Шаг 2. Применяем фильтр “Сплошной шум” через Фильтры>Визуализация>Облака>Сплошной шум. Здесь мы отмечаем галочкой “Перемешать” и “Турбулентный”. И поднимаем уровень детализации до 3 или 4. Перемещаем ползунки до 4.

Шаг 3. Сейчас для улучшения работы мы применим “Уровни. ” (Цвет > Уровни..). Перемести белый ползунок справа налево до где-то 180. Потом серый ползунок, который находится между черным и белым ползунками, и перемести так, что этот ползунок показывал 1,80. Дело в том, что это позволяет повысыть яркость разделов, но не полностью удалять черные и серые.

Page 216: VR-Online (April 2010)

Шаг 4. Добавляем эффект размытия. Это через Фильтры > Размывание> Размывание движением... Ставим галочку на “Наезд камерой”, не забывая, что центр нашей работы должно находиться в центре просмотра. Это даст размытие из центра...И увеличи длину до 60.

Вот что мы сделали:

Page 217: VR-Online (April 2010)

Шаг 5. Нам осталось еще немного сделать. Переходим на Фильтры> Искажения> Вихрь и щипок... Ставим Угол вихря в 160, Радиус – 1, Величина щипка – 0. Если тебя это не устраивет, ты можешь поэкспериментировать со значениями фильтра “Вихрь и щипок ”.

Шаг 6. Продублируй слой(Слой > Продублировать слой).

Page 218: VR-Online (April 2010)

Шаг 7. Убедись, что второй слой выделен и снова примени фильтр “Вихрь и щипок ”. Сейчас мы поставим такие значения: -400 в Угле вихря...

Можешь попробовать другие параметры. J Шаг 8. Для верхнего слоя режим поставь “Только светлое”. Через контекстное меню на втором слое выбери “Свести изображение”.

Page 219: VR-Online (April 2010)

Шаг 9. Остается только, чтобы цвета были в соответствии с твоими вкусами. Покрась свою работу тем цветом, какой ты хочешь! Но, чтобы получить цветы в моем изображении, нужно открыть Кривые (Цвет > Кривые..) и перейти на зеленый канал и настроить его таким образом.

Теперь сделай то же самое, только с синим каналом.

Page 220: VR-Online (April 2010)

Также я и добавил контрастность... Финиш

Оригинал статьи: http://gimp-tutorials.net/abstract-gimp-effect

Page 221: VR-Online (April 2010)

Андрей Петрикин aka Zanuda25 [email protected]

Планета в каркасной модели Черно-белые модели (в том числе каркасно-моделей) достаточно хорошо известны в 3D-индустрии, и мы видим связи объектов и их 3D проволочные сетки. В GIMP это почти невозможно преобразовать сложные объекты в сетки трехмерных координат. А вот для простых объектов, таких как сфера, можно легко создать каркасные модели J . В этой статье я покажу тебе, как создать для нашей голубой планеты сетки. Шаг 1. Создаем новый файл размером на 600х600. Черный фон должен быть черным. Добавляем альфа-канал(Слой >Прозрачность>Добавить альфа-канал). Шаг 2. Фильтры >Визуализация> Текстура > Шахматная доска: 20px.

Шаг 3. Мы сейчас сделаем красивую сетку: Фильтры > Выделение края > Край. Задаем следующие параметры: алгоритм – Собел; Величина: 2; и размытость.

Page 222: VR-Online (April 2010)

Шаг 4. Сейчас мы выберем Фильты > Карта > Рельеф. Фильтр“Рельеф” применяется к тому же слою, над которым мы сейчас работает. Параметры: Тип карты: Линейный Отмечаем галочкой “Компенсировать затемнение” Азимут: 0 Возвышение: 90 Глубина: 6 Остальные опции ставим в 0.

Шаг 5. Вызываем через Фильтры > Карта > Проекция объекта. Задаем следующие параметры. ПАРАМЕТРЫ: Проекция на: Сферу Отмечен “Прозрачный фон” Отмечен “Включить сглаживание” СВЕТ: Тип освещения: нет освещения МАТЕРИАЛ: Уровни интенсивности: Обволакивание: 0.3; Рассеивание: 1 Отражательная способность: Рассеисвание: 0.5; Отражение: 0; Блики: 27 ОРИЕНТАЦИЯ: Позиция: 0,5 = 0,5 = 0 Вращение: -1,5 = 70 = 45 После применения фильтра мы получим результат:

Page 223: VR-Online (April 2010)

Шаг 6. Черно-белый каркас не так отчетливо просматривается, поэтому мы повысим контрастность. Цвет > Тонирование: 215 / 100 / 0. Потом примени Цвет> Яркость-Контраст: 60 / 70

Шаг 7. Переходим по Цвет > Цвет в альфа-канал и выбираем в качестве основного черный цвет. Создаем новый прозрачный слой и называем его “Задний фон”. Перемещаем его на самый вниз под слоями и заливаем черным цветом. Шаг 8. Дублируем слой с синим каркасом. Дублированный слой называем “Передний каркас”, а слой “Фон” переименовываем в “Задний каркас”. Слои должны выглядеть примерно так:

Page 224: VR-Online (April 2010)

Шаг 9. Активизируем слой “Задний каркас” и ставим Прозрачность в 50%. Нажимаем комбинацию клавиш Shift + F. Удерживая Ctrl, щелкни на изображении, чтобы перевернуть слой по вертикали. Теперь мы должны получить впечатление прозрачной 3D каркасной сферы.

Шаг 10. Сейчас мы делаем часть работы – Земля. В архиве ты найдешь картинку Земли. Открываем Файл > Открыть как слои... и выбери тот файл, с которым мы будем работать. Шаг 11. Чтоб подогнать к размерам Каркаса, мы переходим через меню Слой > Размер слоя и ставим значения: 301 и 301. Если что-то не так, то ты можешь переместить и с помощью иснтрумента “Мастшаб” подогнать Землю под синий каркас. Перемести слой “Земля” так, чтобы этот слой располагался между слоями “Передний каркас” и “Задний каркас”.

Page 225: VR-Online (April 2010)

Шаг 12. Мы почти закончили. Установи режим слоя “Передний каркас” на Экран. Мы применим маски слоя ко всем слоям, чтобы получить хороший градиент. Щелкни правой клавишей мыши на каждом слое (исключая “Задний фон”) и выбирай “Добавить маску слоя”.

Шаг 13. Нажмите D, чтоб вернуть стандартные цвета, то есть черный и белый. Выбери инструмент “Градиент” и в маске, только в маске примени слева направо... А вот для слоя “Земля” градиент проведи с верхнего правого угла до нижнего левого угла примерно на треть изображения.

Page 226: VR-Online (April 2010)

Финиш

Оригинал статьи: http://www.gimpusers.com/tutorials/wireframe-planet.html

Page 227: VR-Online (April 2010)

Андрей Петрикин aka Zanuda25 [email protected]

«Лого Volkswagen» Этот урок посвящен созданию логотипа Volkswagen.

Шаг 1. Создай новый большой прозрачный файл. Я задал размер файла: 1000 X 1000.

Измени цвет переднего и заднего фона, соответственно, на #82B2E0 и #012B62.

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

Page 228: VR-Online (April 2010)

Шаг 2. Выделение все еще активно. Выбери инструмент “Градиент”. Градиент поставь в “Основной в прозрачный” и форму в “Радиальная”…

И примени градиент так, как показано ниже.

Сними выделение.

Шаг 3. Сейчас мы создадим эмблему на лого. Нажмите "D", чтобы изменить свой цвет и цвет фона и нажмите X, чтобы инвертировать их. Создай новый слой. Как и раньше, мы рисуем круг внутри нашего созданного круга и заливаем белым цветом. Выделение все еще активно. Мы уменьшим выделение через Выделение> Уменьшить... на 55 пикселей. Удаляем белое выеделение, нажав клавишу Del. Сними выделение.

Page 229: VR-Online (April 2010)

Шаг 4. Теперь мы создаем надпись внутри кольца. Вместо того, чтобы рисовать “V” и “W”, мы нарисуем “X” с горизонтальной линией, перечеркивающий “X”, и приделаем “ножки” к “X”. Нажмите на “Кисть” Нажмите на изображении, где будет начало линии. Появится одна точка. Размер точки зависит от размера активной кисти, который можно изменить в диалоге. После начальной точки и во время держания клавишы Shift появится прямая линии до курсора мыши. Нажмите первую кнопку мыши (обычно самую левую) и отпустите. Во время нажатия кнопки мыши необходимо держать клавишу Shift .Создай “X” так, как показано ниже. 1 этап.

2 этап.

Page 230: VR-Online (April 2010)

3 этап.

Шаг 5. Скачай набор скриптов с сайтта: http://registry.gimp.org/node/186 и установи его в папку скриптов Gimp’а. Закрой, если он у тебя открыт, редактор Gimp и открой его еще раз. В главном меню появится новое меню: Script-Fu, рядом с меню Фильтры. Слой с эмблемой все еще выделен. Переходи на Script-Fu > Layer Effects > Drop Shadow. Выставь следующие параметры: цвет – черный; непрозрачность – 75%; Contour – Linear; Noise – 0; Blending Mode – Normal; распространение – 10; размер – 10; Offset Angle – 145;

Page 231: VR-Online (April 2010)

Offset Distance – 5; и отметь галочкой Layer knocks out drop shadow. С тем же выделенным слоем переходим к Script-Fu > Layer Effects > Inner Shadow. Следующие параметры таковы: цвет – черный; непрозрачность – 5%; Offset Angle – 145%. Опять с тем же слоем работаем. Снова переходим к Script-Fu > Layer Effects > Bevel and Emboss. Задаем следующие параметры: Style – Inner Bevel; Глубина – 3; Ориентация – верх; Soften – 10; Highlight Opacity – 24.7%; Shadow Opacity – 41.2%. Убедись, что слой “Inner Shadow” находится над слоями “Bevel and Emboss”.

Шаг 6. Ваш логотип завершен! По желанию можно добавить блеск к ней или тени, если хотите. Наслаждайтесь!

Оригинал статьи: http://gimp-tutorials.net/volks-logo-tutorial