vr-online (february 2010)

54

Upload: igor-antonov

Post on 26-Mar-2016

221 views

Category:

Documents


6 download

DESCRIPTION

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

TRANSCRIPT

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

Новости- Железные новости...............................................................04- IT новости.................................................................................07

КоДиНГ- отправляем почту средствами PHP через msTP под FreeBsD.....................................................11- обратная польская запись...............................................13- размер имеет значение.......................................................16- создаем ярлыки из DelPHI.................................................18- парсим HTml тэги в C#..........................................................22

БЕЗоПАсНостЬ- остороЖно. HI-TeCH. банкоматы. часть 2....................31

АДМиНиНГ- поднимаем беспроводную сеть....................................35- создаем видеоконференцию. часть 1..........................42

ШКоЛА- копирование каталогов средствами DelPHI.............46

КРЕАтиFF- маски-шоу или учимся работать со слоями и альфа-каналами......................................49

Page 3: VR-Online (February 2010)

ИНТРОидея

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

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

Антонов Игорь ([email protected])Костенко Роман ([email protected])

графика в журнале

Васючков Андрей aka Soffrick([email protected])

текущий состав Vr-Team

Neon_Kaligula, Soffrick, Egoiste,FrIToOll, Lord_of_fear, Spider_NET

вопросы и предложения пожурналу

[email protected],[email protected]

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

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

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

Не буду больше тебя грузить своими переживаниями по поводу завала олимпиады, а лучше просто пожелаю тебе удачи и приятного чтения! Надеюсь, номер тебе понравится!

антонов игорь

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

05

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

vr-online.ru февраль 2010

lorD_oF_Fear ([email protected])

Настоящий экскалибур!Корпусной вентилятор, чье название совпадает с названием легендарного меча, выполнен в типоразмере 120 мм (120 х 120 х 25 мм). Ось ротора опирается на «барометрический шариковый подшипник» (Barometric Ball Bearing). Как утверждается, этот подшипник обеспечивает малый уровень шума и длительный срок службы — до 100000 часов.Пропеллер Excalibur имеет девять лопастей, форма которых напоминает форму лезвия меча (откуда и название изделия). Они легко снимаются для очистки. Как видно на иллюстрации, крыльчатка находится в вентилируемом кольце из перфорированной ленты. Скорость вращения ротора можно изменять в пределах 600-2000 об/мин, при этом уровень шума не превышает 13-30 дБА соответственно.

Видео На Blue Ray В 3DПервый 3D Blue Ray привод представила компания в первых числах февраля. Новинка может проигрывать 3D фильмы. Правда тут есть нюанс. На данный момент в продаже нет 3D телевизоров и дисков с 3D фильмами, поэтому оценить плеер довольно сложно.Тем не менее, компания уже анонсировала начало производства 3D телевизоров с частотой развертки 240 Гц. В модельный ряд будут входить устройства с диагоналями 40, 46 и 55 дюймов.Будем надеяться, что в скором будущем мы сможем оценить новинки вживую, а не по пресс-релизам компании.

aTI RaDeon HD 5450: DIRecTX 11 почти даромКомпания AMD представила завершающую линейку

видеокарт серии HD 5000 — самые младшие видеокарты ATI Radeon HD 5450. Ценовая категория новинок попадает в пределы 49-59 долларов США для адаптеров с 512 МБ бортовой памяти. Таким образом, поддержка

нового API Microsoft DirectX 11 стала возможна в самой нижней ценовой категории.

Эталонный дизайн видеокарт ATI Radeon HD 5450 представляет собой решение с пассивным радиатором.

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

2D до 6,5 Вт.

Page 6: VR-Online (February 2010)

06

vr-online.ru февраль 2010

НатуральНый шестиядерНый процессор GulfTown от InTelВсего пару недель осталось подождать до выхода первого в индустрии настольного шестиядерного процессора, известного сегодня под именем Gulftown и индексом Core i7-980X Extreme Edition. Процессор Intel Gulftown представляет собой монолитный кристалл. Но даже не это делает его уникальным. Как и представленные недавно настольные Clarkdale (Core i3/i5/i7), Gulftown основан

на 32-нм микроархитектуре Westmere. Итого, на выходе появился настоящий монстр с 1,17 млрд. транзисторов площадью 240 кв.мм. Неудивительно, что компания не планирует выпускать новые модели Gulftown. Как технологическое достижение подобный процессор вполне оправдан, но вот его актуальность и ценовая целесообразность для настольного рынка вызывает сомнения.

«cпортиВНый» телефоН Puma PHoneКомпания Puma, занимающаяся выпуском спортивной одежды, представила мобильный телефон Puma Phone на выставке Mobile World Congress 2010. Купить Puma Phone можно будет в апреле текущего года. О цене новинки пока не сообщается.«Пумафон» поддерживает ряд спортивных функций: например, он оснащен секундомером, шагомером, компасом и GPS-приемником, позволяющим отслеживать маршруты пробежек по картам, а также рассчитывать их продолжительность. В память телефона установлено приложение для доступа к порталу Puma World, предоставляющему различную околоспортивную информацию. Новинка оборудована 2,8-дюймовым сенсорным дисплеем с разрешением 320×240 точек (QVGA), акселерометром, 3,2-мегапиксельной камерой со светодиодной вспышкой и поддержкой геотегинга, музыкальным проигрывателем, слотом для карт памяти формата microSD, 3,5-миллиметровым разъемом для наушников и модулем Bluetooth версии 2.1+EDR. На задней панели телефона располагается солнечная батарея, оснащенная индикатором уровня заряда.

Page 7: VR-Online (February 2010)

07

vr-online.ru февраль 2010

IT-новостиsPIDer_NeT aka игорь антонов ([email protected])

GooGle отказыВается от поддержки Ie 6Наконец-то это свершилось! В самом начале февраля, компания Google заявила, что начиная с марта, прекратит поддержку браузера IE 6 в своих приложениях. Как сообщили представители компании, все новые фишки сервисов будут недоступны пользователям IE 6. Лично я, чертовски рад этому событию! Если все крупные компании, имеющие вес в WEB’е перестанут осуществлять поддержку этого говно-браузера, то пользователи быстрей начнут от него избавляться. Следовательно, всем

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

критическая уязВимость В SamBaЧтобы не говорили, а хакеры находят баги не только в серверных продуктах, разработанных для платформы Windows. OpenSource приложения также находятся под прицелом. Взять хотя бы знакомую каждому линуксойду Samb’у. В начала февраля, хакеры обнаружили в этом продукте серьезную уязвимость. Если злоумышленнику удастся заюзать баг, то он сможет прочитать содержимое системных файлов. Проблема кроется в символических ссылках, в которых присутствует обращение к предыдущей директории (при помощи ../). Чтобы заюзать багу на практике, злоумышленнику необходимо обладать правами на создание файлов в samba разделе. Пока не вышло официальное обновление, разработчики рекомендуют всем администраторам присвоить опции wide links значение no.

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

файлов, которые были помечены как вредоносные стали детектится некоторыми антивирусными сканерами.Вот из-за таких нетрадиционных опытов, компания Hispasec Sistemas (именно она рулит проектом VirusTotal) и затаила обиду на ЛК. Мол, юзаете вы наш сервис не по назначению, да еще и кидаете тень на своих коллег. Нехорошо!

Page 8: VR-Online (February 2010)

08

vr-online.ru февраль 2010

перВые слухи о wInDowS 8Не успели фанфары отгреметь о Windows 7, как в сети стала появляться информация (слухи) о Windows 8. Рассказываю по порядку. Один из сотрудников Microsoft опубликовал на своем блоге заметку, в которой и упомянул о новинке. Вскоре после публикации пост был удален. Видимо Microsoft не хочет раскрывать карты заранее. В сообщении не было каких-то деталей касательно функционала новой ОС. Зато, хлопец из Редмонда сообщил: Windows 7 – стала блокбастером (прим. редактора: интересно, а чем стала Vista?), а Windows 8 будет «потрясающей». Также, в тексте поста было подчеркнуто, что Windows 8 совершенно не будет похожа на предыдущие версии Windows.

что Не деНь, то НоВый багВ последнее время, в самых востребованных продуктах компании Adobe стали постоянно обнаруживать серьезные уязвимости. Например, в феврале выяснилось, что в Adobe Flash Player и Adobe Reader были обнаружены критически баги. Эти баги, конечно, будут исправлены (а точнее уже), но лично у меня начинает складываться не очень хорошее мнение об этих продуктах. Думаю, Adobe нужно всерьез задуматься о качестве, иначе есть большой шанс растерять своих пользователей. Особенно когда на рынке имеется сильный конкурент (я про Microsoft и их SilverLight). Если ты давненько не обновлял свой флеш плеер, то сделай это прямо сейчас.

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

Page 9: VR-Online (February 2010)

09

vr-online.ru февраль 2010

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

коллектиВНые блоги проекта VR-onlIneФевраль для проекта VR-Online начался весьма бодро. Не успели мы запустить в эксплуатацию новый двиг, как Soffrick решил, что пора бы уже поднять коллективные блоги. Я пытался все это дело немного перенести, но наш тимовец был серьезней некуда и пригрозил в случае отказа изрисовать мою фотку и повесить на главной странице :). Сам понимаешь, я отказать ему не смог. Вот примерно так и заработали наши блоги. Так что теперь мы рады тебя видеть не только на www.vr-online.ru, а еще и на www.blogs.vr-online.ru. Заходи к нам почаще и оставляй свои коммменты. Ну а если у тебя возникнет желание стать автором постов, то не стесняйся, обращайся, и, возможно, мы угостим тебя аккаунтом!

реактиВНый lInuXСотрудники компании MPC Data установили настоящий олимпийский рекорд. Им удалось добиться загрузки Linux’а меньше чем за 1 секунду. Весь процесс загрузки представители MPC Data продемонстрировали в 2-х минутном ролике. В нем была показана oC-система ARM cortex-a8 (с тактовой частотой 500 МГц), работающая на плате Texas Instruments 3530 EVM. Данные на устройстве хранятся в памяти NAND flash, куда установлено Linux-ядро версии 2.6.29. Практически мгновенно после включения/перезагрузки устройства его дисплей отображает видео, снимаемое с камеры.Время загрузки распределилось так:* XLoader — 0,234 с;* UBoot — 0,053 с;* Linux-ядро — 0,177 с;* приложение, отображающее видеопоток, — 0,406 с.Суммарное время загрузки (т.е. с момента запуска устройства до работающего видеоприложения) составляет около 0,9 секунд. В подтверждение тому, что после в результате этой загрузки пользователь получает уже функционирующее устройство, в конце ролика показано, что с его помощью можно делать и просматривать фотографии с камеры.

Page 10: VR-Online (February 2010)

10

vr-online.ru февраль 2010

Отправляем пОчту средствами PHP через mstP пОд FreeBsD

Обратная пОльская запись

размер имеет значение

сОздаем ярлыки из DelPHi

парсим Html тэги в C#

Page 11: VR-Online (February 2010)

11

vr-online.ru февраль 2010

Отправка почты средствами php через msmtp под FreeBSD

роман костенко aka lorD_oF_Fear

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

итак, приступим…Сначала ставим msmtp из портов:

cd /usr/ports/mail/msmtpmake install clean

После установки необходимо создать файл глобальных настроек msmtprc в директории /usr/local/etc. Если необходимо для каждого пользователя сделать отдельные настройки, то этот файл нужно создать в домашней папке каждого юзера.Но сейчас будем использовать глобальные настройки.

сОдержимОе файла msmtPrC:account mymailhost 192.168.0.5tls offtls_starttls offtls_certcheck offfrom [email protected] 25protocol smtpauth offaccount default : mymail

если кОму не пОнятнО:account mymail - имя аккаунта в конфигеhost 192.168.0.5 - ip адрес почтового сервера. У меня он стоит в моей локальной сетиtls off - отключаем нафиг криптографию, т.к. по дефолту она включенаtls_starttls offtls_certcheck offfrom [email protected] - указываем наш почтовый адресport 25 - портprotocol smtp - протоколauth off - необходимость авторизации по логину и пасу. Если необходимо, то включаем и дописываем в конфиг логин и пароль.account default : mymail - с каким аккаунтом работать по дефолту

Page 12: VR-Online (February 2010)

12

vr-online.ru февраль 2010

теперь Обратимся к кОдингуПодходящий способ отправки писем через msmtp - это создание текстового файла с необходимой информацией о письме (адресат, тема, тело письма) и передача его клиенту msmtp.Привожу готовый код, т.к. не вижу смысла расписывать построчно. Комментарии в коде имеются.Функция cp1251_to_utf8 отвечает за конвертацию cp1251 в utf8. Если будем отправлять в cp1251, то получим в письме абракадабру :)От этой функции можно избавиться, если все данные изначально кодировать в utf8.Однако даже NotePad++ по дефолту создает новый документ в кодировке ANSI. Поэтому пусть лучше будет так, чтобы уже точно нигде не ошибиться.

<?php // Функции отправки почтыfunction cp1251_to_utf8 ($txt) { // Конвертируем cp1251 в utf8 $code = “UTF-8”; // Необходимая кодировка $curcode = “Windows-1251”; // Текущая кодировка$txt = mb_convert_encoding($txt, $code, $curcode); return $txt;} function mailToSender($emailOfSender, $resultForSender) { // Отправка писем $pth=’/home/user’; // Путь к директории, куда создавать txt файл $fp=fopen($pth.”/message.txt”,”w”); // Создаем этот файл fputs($fp,’To:’ . $emailOfSender . “\r\n”); // Пишем адрессата fputs($fp,cp1251_to_utf8(“Subject: Тема письма \r\n”)); // Тема письма fputs($fp,”\r\n”); // Пустая строка. Обязательно! fputs($fp, cp1251_to_utf8($resultForSender)); // Текст письма fclose($fp); exec(“cat “. $pth .”/message.txt | msmtp “ . $emailOfSender); // выполняем отправку unlink(‘/home/user/message.txt’); // после отправки удаляем файл }?>

Входные параметры функции mailToSender:$emailOfSender - почтовый адрес адресата$resultForSender - текст письмаВот и все. Если есть вопросы, то задавай их на нашем форуме.

Page 13: VR-Online (February 2010)

13

vr-online.ru февраль 2010

Обратная польская запись. Часть 1крылов егор aka kraBCHe ([email protected])

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

Пример: Рассмотрим выражение 2+3. Так бы его записал любой нормальный человек. Сначала первый операнд, потом знак операции, потом второй операнд. В ОПЗ все немного не так. Сначала идут операнды, а уже потом знаки операций. Это значит, что наш пример будет записан как 2 3 +. Немного странно и не привычно. Теперь рассмотрим что-нибудь посложнее. Возьмем выражение со скобками. Например, (3+5)*6. А теперь как оно будет записано в ОПЗ. 3 5 + 6 *. Попробуем понять, почему именно так. По правилам математики нужно сначала выполнить то, что в скобках, а потом все остальное. Складываем, потом умножаем. Операции в ОПЗ выполняются над последними двумя операндами (числами) стоящими перед ними, и результат записывается на их место. Таким образом, получается, что сначала выполнится сложение 3+5=8, а потом 8*6=48. Сегодня мы не будем сильно углубляться в подробности счета, и поговорим об этом в следующей статье. Сегодня речь пойдет о том, как перевести выражение из стандартной записи в ОПЗ. Но, казалось бы, зачем? 17 лет я жил, ничего не зная о ОПЗ, и при этом жил не плохо, считал нормально. А теперь подумаем, как вычислить на компьютере выражение с уровнем вложенности скобок хотя бы 2, и длинной в 5 операций. Человек это сделает легко. Найдет самые «глубокие» скобки, посчитает, что там и, так и будет «подниматься» пока скобки не пропадут и вовсе. Но человек умеет думать, а компьютер нет. Вот именно поэтому, и придумали ОПЗ. Считать выражение любой сложности в ней очень легко, главное, что алгоритм абсолютно линеен, и ничего анализировать не надо. Да, я опять намекаю на умный калькулятор, о котором говорилось в прошлой статье, про скобки (Кстати, ОПЗ широко использовалась в первых отечественных калькуляторах типа МК-56). Сегодня мы поговорим о том, как перевести выражение в ОПЗ.

алгОритмОн довольно прост. Вот он:1. Пока во входной строке, с выражением в обычной форме, есть символы, читаем их

1.1. Если символ является операндом (числом или цифрой), добавить его к выходной строке.1.2. Если символ является открывающей скобкой, помещаем его в стек. Вот он стек!1.3. Если символ является закрывающей скобкой:

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

1.4. Если символ является оператором op1:1.4.1. Пока приоритет op1 меньше либо равен приоритету оператора, находящегося на вершине стека выталкиваем верхние элементы стека c большим либо равным приоритетом в выходную строку.1.4.2. Помещаем оператор op1 в стек.

2. Когда входная строка закончилась, вытолкнуть все символы из стека в выходную строку.

Page 14: VR-Online (February 2010)

14

vr-online.ru февраль 2010

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

кОдингВсю программу я здесь приводить не буду. Обсудим только основные ее части.Алгоритм реализуется двумя циклами while. Первый немного больше второго, в котором и вовсе 1 строка.Для начала обсудим разные дополнительные функции. Их будет 7, но все они маленькие. Две из них нам уже знакомы. Это Push и Pop для работы со стеком. Теперь еще 5. Они больше похожи на макросы, потому что проверяют ровно одно условие, и возвращают его истинность. Вот они:

int IsDigit(char c); - является ли символ с цифройint IsOper(char c); - является ли символ с операторомint IsOpBr(char c); - является ли символ с открывающей скобкойint IsClBr(char c); - является ли символ с закрывающей скобкой

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

if(IsDigit(inexpr[i])){ outexpr[j]=inexpr[i]; j++;}

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

if(IsOpBr(inexpr[i])){Push(inexpr[i]);}

1.3 Если символ является закрывающей скобкой: …if(IsClBr(inexpr[i])){Pop(&c); while(!IsOpBr(c)) { outexpr[j]=’ ‘; j++; outexpr[j]=c; Pop(&c); j++; }}

1.4 Если символ является оператором op1.

Page 15: VR-Online (February 2010)

15

vr-online.ru февраль 2010

if(IsOper(inexpr[i])&&inexpr[i]!=’(‘){ x=Pop(&c); if(x==OK) { while(Prior(inexpr[i], c)) { outexpr[j]=’ ‘; j++; outexpr[j]=c; j++; x=Pop(&c); if(x==NotOK) break; } } else { outexpr[j]=’ ‘; j++; } if(x!=NotOK) { outexpr[j]=’ ‘; j++; Push(c); } Push(inexpr[i]); outexpr[j]=’ ‘; j++;}

теперь немнОгО пОясню кОдЗачем добавлять в выходную строку пробел? Чтобы можно было использовать многозначные и дробные числа, а так же чтобы после каждого знака операции стоял пробел. Сначала пробелов может получится несколько подряд, но потом мы их удалим.Зачем нужна проверка на успешность извлечения данных из стека? А вдруг там еще нет не одного знака операции, тогда нам просто надо добавить текущую в стек.Что за такая функция Prior? Она нужна для определения приоритетов операций. Все знают что умножение и деление выполняется раньше сложения и вычитания. Вот ее код.char opers[Op]={‘+’, ‘-’, ‘*’, ‘/’, ‘(‘}; - массив операций, скобка сюда попала не случайноint priors[Op]={1, 1, 2, 2, 0}; - приоритеты операций в порядке их перечисления в массиве.int Prior(char op1, char op2)

{ int op1p, op2p, i; op1p=0; op2p=0; for (i=0; i<Op; i++) { if(op1==opers[i]) op1p=i; if(op2==opers[i]) op2p=i; } if(priors[op1p]<=priors[op2p]) return 1; return 0;}

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

Page 16: VR-Online (February 2010)

16

vr-online.ru февраль 2010

Размер имеет значениеZeroxor

доброго времени суток, уважаемый читатель VR-online! сегодняшний разговор у нас будет совершенно не интимным, как Вы могли бы ошибочно решить, прочтя заголовок этой статьи. Но, как ни парадоксально, он в точности соответствует теме, которую я и собираюсь здесь раскрыть.уходя все глубже в недра фриланса (зачастую в областях копирайтинга и Seo (хоть я и не пишу об этом, но, тем не менее, интересуюсь этими областями)), я все чаще стал натыкаться вот на какую проблему: многие ресурсы ограничивают размеры вводимых строк, причем, совершенно не заботясь о пользователе, владельцы сих порталов/каталогов/блогов/сайтов не соизволили ограничить размер полей ввода, об ограничении сообщает лишь пояснение возле этих самых полей. и что, заполняя по 30-50 подобных форм в день, Вы еще хотите, чтобы я считал количество вводимых символов? Неоднократно выражаясь в адрес разработчиков этих ресурсов (зачастую не особенно цензурно выражаясь) в моей голове потихоньку вызревала мысль о создании небольшой софтинки, которая бы смогла облегчить мою жизнь, равно как и всех тех, кто сталкивался, сталкивается и будет сталкиваться (к сожалению, некоторые девелоперы не очень то внимают просьбам пользователей).

Поначалу, когда нужно было считать лишь общее количество символов в записи, меня здорово выручил Twitter. Я тупо копировал туда свою строку и тви более-менее внятно показывал, сколько же байт я нацарапал в процессе изложения своей мысли. И тут появилась новая трабла: копирайтеры наверняка знают условия заказчика типа “2000 символов без пробелов”. Здесь тви уже гулял полем, а также и лесом. Считать же вручную пробелы и вычитать их из общего количества текста было уже лениво. Настолько лениво, что выкроив немного свободного (точнее, наименее занятого) времени, я запустил Kate и Opera (первое, что подвернулось под руку) и начал решать эту проблему.Сразу скажу, если Вам лень или просто не интересно разбираться, что и как работает, но с вышеупомянутыми траблами сталкиваться доводилось, то готовое рабочее решение лежит у меня на блоге в рубрике “Сервисы” - пользуйтесь на здоровье. Тем же, кто хочет разобраться, что, как и почему, а, возможно, и использовать этот код в своих проектах – welcome читать дальше, все расскажу в подробностях. Но для начала, руководствуясь тем, о чем уже писал в одном из предыдущих номеров VR, четко обозначил цели.

Цели разрабОтки. чтО требуется Об будущей прОграммыНужна была программа для автоматического подсчета количества введенных символов, символов без пробелов (чистого текста) и количества введенных слов. При этом она должна была быть кроссплатформенной (мало ли, под какой осью она может пригодиться в следующий раз) и работать даже на десктопе true blondie (где, как Вы сами понимаете, вряд ли можно найти развернутый LAMP). В итоге, выбор пал на JavaScript (нужен лишь доступ в Сеть и более-менее GUI’вый браузер, либо можно постоянно с собой носить пару небольших файлов).

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

var cnt_symbols = str.length; var cnt_symbols_no_spaces = replaceString(“ “, “”, str).length; var cnt_words = deleteDoubleSpaces(str).split(“ “).length;

Первая строка легко и просто посчитает нам общее количество символов в строке str (откуда мы ее получим – об этом чуть позже, пока просто примите на веру, что это и есть тот самый вбитый текст). Вторая и третья строчки считают количество символов без пробелов и количество строк. Функции re-

Page 17: VR-Online (February 2010)

17

vr-online.ru февраль 2010

placeString() и deleteDoubleSpaces() - это небольшие самописные функции, код которых я покажу чуть позже. Итак, собственно, вот он и результат. Правда, просто? Достаточно лишь немного разлениться, чтобы написать это. Увы, победу отмечать пока что рано: мы совсем забыли про перенос строки, который будет учитываться как вполне валидный символ, даже не разрывая слово. Ok, раз пошла такая пьянка, сделаем так:

var optimize_str = deleteDoubleSpaces(delete1013Code(str)); var cnt_symbols = str.length; var cnt_symbols_no_spaces = replaceString(“ “, “”, str).length; var cnt_symbols_no_spaces_1013_code = replaceString(“ “, “”, optimize_str).length; var cnt_words = deleteDoubleSpaces(optimize_str).split(“ “).length; var cnt_1013_code = cnt_symbols_no_spaces – cnt_symbols_no_spaces_1013_code;

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

$(document).ready(function() { $(“body”).html(‘<div id=”posttext”></div><textarea id=”chktext”></textarea>’); checkText($(“#chktext”).val()); $(“#chktext”).keyup(function() { checkText($(“#chktext”).val()); }); });

Здесь я использовал фреймворк jQuery. Для тех, кто с ним не знаком, поясню: при “готовности” документа (еще до отображения в браузере), вписываем в тег <html> слой posttext и многострочное поле ввода с id=chktext, затем вызываем checkText со строкой по умолчанию, скажем так, для инициализации всех наших переменных и выставления нулей напротив всех значений. После чего начинаем отлавливать момент отпускания клавиши (событие keyup), после которого также проверяем, во что же превратилась наша проверяемая строка и, соответственно, пересчитываем все параметры.Теперь вкратце поясню, какая функций здесь за что отвечает, раз уж обещал их упомянуть.

replaceString(fnd, rplc, str) – заменяет одну подстроку на другую. Параметры аналогичны функции PHP str_replace(). Напомню:fnd – подстрока для замены (что заменить?)rplc – подстрока, которой нужно заменить fnd (на что заменить?)str – строка, в которой происходит замена (где заменить?)deleteDoubleSpaces(str) – удаляет двойные пробелы в строке str.delete1013Code(str) – удаляет переносы строк в строке str.ltrim(str) – удаляет пробелы в начале текста.rtrim(str) – удаляет пробелы в конце текста.trim(str) – удаляет пробелы в начале и в конце текста (собственно, она только и делает, что вызывает по очереди две предыдущих функции).HTML-файл с этим скриптом, а также jQuery в самой базовой комплектации, вполне естественно, дожидается Вас в архиве, прилагаемом к журналу. Конечно, это все наверняка можно оптимизировать и заставить работать еще быстрее, но мне сейчас это делать просто лень (да и некогда, если уж совсем честно). Главное, что программа выполняет все, что на нее было возложено и при этом ее работа никоим образом не тормозит машину – а лично мне на данный момент большего и не нужно.P.S. Наверняка во время тестирования Вы сможете заметить, что при вводе символов на русской раскладке (а именно букв нашей с Вами родимой кириллицы) скрипт молчит как пленный советский партизан. Честно пытался бороться с этим, оставил эту затею после того, как заметил что на том же тви (да и не только на нем) этот момент работает абсолютно аналогично.

Page 18: VR-Online (February 2010)

18

vr-online.ru февраль 2010

Учимся программно создавать ярлыкиsPIDer_NeT aka игорь антонов ([email protected])

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

Откуда в этОм меню берутся ярлыкиПеред тем как окунуться в дебри кодинга рассмотрим небольшую теоретическую часть и узнаем, откуда вообще берется список ярлыков, отображаемых в пункте «отправить». Итак, пункт меню «отправить» представляет из себя обычную папку, расположенную в твоем профиле (т.е. \document and settengs\\sendto).Сразу напрашивается ответ на вопрос: «Как добавить ярлык на свое приложение в этот заветный список?». Нужно всего лишь создать в этой папке ярлык на твою программу! Никаких лишних телодвижений! Ради спортивного интереса попробуй скопировать в эту папку какое-нибудь приложение (например, созданный в Delphi пустой проект). После этого вызови где-нибудь контекстное меню и убедись, что в меню «отправить» действительно появилась ссылка на твое приложение.

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

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

в папке «sendTo». Запускай Delphi, создавай новый проект и бросай на форму один компонент TButton. Далее переходи в редактор кода и потрудись переписать код из листингов 1-3. В нем я описал класс, который будет использовать для создания ярлыков.

Page 19: VR-Online (February 2010)

19

vr-online.ru февраль 2010

листинг 1: класс для быстрОгО сОздания ярлыкОвtype

TShortcutMaker = class private public procedure CreateShortCut(SpecialFolderCSIDL:Integer; ShortcutName:string); end; procedure TShortcutMaker.CreateShortCut(SpecialFolderCSIDL: Integer; ShortcutName: string);

var

IObject : IUnknown; ISLink : IShellLink; IPFile : IPersistFile; PIDL : PItemIDList; InFolder : array[0..MAX_PATH] of Char; TargetName : String; LinkName : WideString;

begin

TargetName := ParamStr(0) ; IObject := CreateComObject(CLSID_ShellLink) ; ISLink := IObject as IShellLink; IPFile := IObject as IPersistFile; with ISLink do

begin

SetPath(pChar(TargetName)) ; SetWorkingDirectory(pChar(ExtractFilePath(TargetName))) ;

end; SHGetSpecialFolderLocation(0, SpecialFolderCSIDL, PIDL) ;SHGetPathFromIDList(PIDL, InFolder) ; LinkName := Format(‘%s\%s.lnk’,[InFolder, shortcutName]) ; IPFile.Save(PWChar(LinkName), false) ;

end;

листинг 2: пример испОльзОванияvar

MyShortCutMaker:TShortCutMaker;

begin

Page 20: VR-Online (February 2010)

20

vr-online.ru февраль 2010

MyShortCutMaker := TShortCutMaker.Create; MyShortCutMaker.CreateShortCut(CSIDL_SENDTO, ‘My Delphi Application’); MyShortCutMaker.Free;end;

листинг 3: пример ОбрабОтки переданных параметрОвprocedure TForm1.FormCreate(Sender: TObject);

begin if (ParamCount > 0) then ShowMessage(ParamStr(1));end;

листинг 4: списОк всех вОзмОжных кОнстант, Определяющих спеЦ папкиconst REGSTR_PATH_SPECIAL_FOLDERS = REGSTR_PATH_EXPLORER + ‘\Shell Folders’; CSIDL_DESKTOP = $0000; CSIDL_INTERNET = $0001; CSIDL_PROGRAMS = $0002; CSIDL_CONTROLS = $0003; CSIDL_PRINTERS = $0004; CSIDL_PERSONAL = $0005; CSIDL_FAVORITES = $0006; CSIDL_STARTUP = $0007; CSIDL_RECENT = $0008; CSIDL_SENDTO = $0009; CSIDL_BITBUCKET = $000a; CSIDL_STARTMENU = $000b; CSIDL_DESKTOPDIRECTORY = $0010; CSIDL_DRIVES = $0011; CSIDL_NETWORK = $0012; CSIDL_NETHOOD = $0013; CSIDL_FONTS = $0014; CSIDL_TEMPLATES = $0015; CSIDL_COMMON_STARTMENU = $0016; CSIDL_COMMON_PROGRAMS = $0017; CSIDL_COMMON_STARTUP = $0018; CSIDL_COMMON_DESKTOPDIRECTORY = $0019; CSIDL_APPDATA = $001a; CSIDL_PRINTHOOD = $001b; CSIDL_ALTSTARTUP = $001d; CSIDL_COMMON_ALTSTARTUP = $001e; CSIDL_COMMON_FAVORITES = $001f; CSIDL_INTERNET_CACHE = $0020; CSIDL_COOKIES = $0021; CSIDL_HISTORY = $0022;Кода получилось достаточно мало и сложного в нем ничего нет. Единственное, с чем у тебя могли возникнуть проблемы - неизвестные функции. Вот про них мы сейчас и поговорим. Начнем с CreateComObject.Функция CreateComObject описана в модуле ComObj. С помощью нее создается объект класса, связанный с идентификатором класса переданным в качестве параметра. В примере я передаю CLSID_ShellLink. CLSID_ShellLink - это и есть идентификатор класса, который представляет из себя

Page 21: VR-Online (February 2010)

21

vr-online.ru февраль 2010

обычный GUID. Если говорить применительно к Delphi, то идентификатор соответствует типу TGUID. Можешь открыть модуль ShlObj и попробовать поискать в нем текст по CLSID_ShellLink. Не успеешь вбить, значение как наткнешься на примерно такой текст:

{$EXTERNALSYM CLSID_ShellLink} CLSID_ShellLink: TGUID = ( D1:$00021401; D2:$0000; D3:$0000; D4:($C0,$00,$00,$00,$00,$00,$00,$46));

Если функция CreateComObject выполнится успешно, то она вернет ссылку на идентификатор интерфейса типа IUnknown. Надеюсь, общую идею ты уловил. Двигаем дальше. Получив ссылку на интерфейс, тип IUnknown, мы можем инициализировать наши переменные типа ISheellLink и IPersistFile. Обрати внимание, имя типа этих переменных начинается с буквой I, т.е. этот тип является интерфейсом. Чтобы привести IUnknown к IShellLink я использую конструкцию: IObject as IShellLink. Что здесь делает «as»? Открой любую книгу по Delphi и там, в разделе описания основ нюансов ООП этот оператор обязательно упоминается. Обламывает копаться в хелпе? Тогда просто смотря на слово «as» представляй в голове «как». Т.е. условно вышеприведенную конструкцию можно прочитать так: считать IObject как IShellLink. Теперь понятно? Ок!Все необходимые переменные инициализированы, теперь перейдем к созданию самого ярлыка. Для этого, нужно поработать с интерфейсом IShellLink выполнив несколько его функций:- SetPath - Путь к приложению, для которого создается ярлык. Мы передаем сюда путь к нашему приложению, который получаем при помощи функции (ParamStr(0)).- SetWorkingDirectory(); - Рабочая папка. Тут думаю и так все должно быть ясно. Рабочую папку получаем традиционным ExtractFilePath().Выполнив предыдущие функции, мы сотворим скелет ярлыка. Остается лишь получить путь к спец папке (в нашем случае «Отправить»). Решить эту задачу нам помогут две функции:- SHGetSpecialFolderLocation - возвращает указатель на структуру ITEMIDLIST, содержащую информацию о специальных папках. Эта функция принимает три параметра: 1). hWndOwner - зарезирвирован. 2). nFolder - идентификатор папки, путь к которой хотим получить. 3). ppidl - указатель на PItemIDList.- SHGetPathFromIDList - конвертирует идентификаторы путей к специальным папкам в нормальные системные пути. Для работы, функция требует два параметра: 1). pidl - Ссылка на список идентификаторов, полученных с помощью функции SHGetSpecialFolderLocation. 2). pszPath - буффер, в который будет помещен полученный путь.После выполнения функции, в переменной InFolder (ее мы передаем во втором параметре) будет находится путь к специальной папке. Для удобства, я выдираю этот путь в переменную LinkName, предварительно оформив с помощью функции Format. Зная путь к системной папке (напомню, в нашем случае это «Отправить») ни что нам не мешает окончательно создать ярлык. Делается это при помощи функции Save интерфейса IPersistFile. Все, наш ярлык готов!

тестирОваниеПопробуй запустить пример и произвести тест. Нажав на одну единственную кнопку, ты создашь ярлык в папке «Отправить». Классно? А главное все просто! Ради интереса, передай методу нашего класса другой идентификатор системной папке (см. третий листинг), запусти приложение и опять кликни на кнопку. Результат не заставит себя ждать - в указанной тобой папке появится ярлык на твое приложение.

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

Page 22: VR-Online (February 2010)

22

vr-online.ru февраль 2010

Парсим HTML тэги в C#sPIDer_NeT aka игорь антонов ([email protected])

.neT framework предоставляет огромное количество возможностей для создания html разметки и разбора Xml документов. а вот с разбором html страниц все гораздо сложнее.давным-давно я написал хороший код (тогда я использовал Visual Basic) для своего web-паука. этот код до сих пор актуален, поэтому я решил портировать его на c#. думаю, не нужно объяснять каким типичным функционалом должны обладать такие приложения как web-пауки. как правило, их основная функция заключается в разборе html страницы на наличие ссылок. Находя очередную ссылку, паук должен получать страницу (расположенную по этой ссылке) и приступать к анализу. Не думай, что такие пауки применяются для чего-то криминального. подобные технологиями пользуются все поисковики.

Портированный мной код работает достаточно хорошо, но очень требовательный. Например, у меня был web-сайт, позволяющий пользователям вводить URL страницы ссылающейся на наш сайт за поощрения. По идее, код должен сканировать этот URL и получать обратную ссылку, т.е. линк на нашу страницу. Однако, иногда код сообщал, что обратной ссылки нет, хотя на самом деле все было наоборот.Эта ошибка возникает из-за когда web-страница содержала синтаксические ошибки. Например: у значений атрибутов отсутствуют закрывающие кавычки, мой код считает, что значение заканчивается, когда ему попадается конец строки. Я внес несколько изменений, которые сделали код более универсальным и работоспособным.В листинге 1 приведен код созданного мной класса – HtmlParser. Стоит заметить, что существует огромное количество способов разбора HTML. Мой же код интересуют лишь теги и их атрибуты. Текст, который заключен между ними мне неинтересен. Моего паука интересуют лишь ссылки. Такой подход идеально подходит для web-пауков.Метод ParseNext() вызывается для поиска очередного тега и при его нахождении возвращает объект типа HtmlTag, содержащий его описание. При необходимости можно определить тип тегов, информацию о которых требуется получить (если интересуют абсолютно все теги, то нужно указать «*»).Разбор HTML разметки выполняется достаточно просто. Как я уже говорил, мне пришлось потратить много времени на более качественный разбор страницы, в случае присутствия в ней ошибок. Я нашел несколько способов решения этой задачи. Например, если в коде был найден тег <script>, то производится автоматическое сканирование на наличие закрывающего тега </script> и игнорирование всего того кода, заключенного в эти теги. Это было сделано для того, чтобы защитить парсер от ложного срабатывания. Ведь в этих тегах может содержаться текст, который запросто сможет сбить с толку парсер (такое может произойти из-за спец символов и конструкций языка JS). Аналогичные способы я применял в отношении комментариев и специального тега !Doctype.

листинг 1using System;using System.Collections.Generic;using System.Linq;using System.Text;

namespace HtmlParser{ public class HtmlTag { /// <summary>

Page 23: VR-Online (February 2010)

23

vr-online.ru февраль 2010

/// Name of this tag /// </summary> public string Name { get; set; }

/// <summary> /// Collection of attribute names and values for this tag /// </summary> public Dictionary<string, string> Attributes { get; set; }

/// <summary> /// True if this tag contained a trailing forward slash /// </summary> public bool TrailingSlash { get; set; } };

public class HtmlParser { protected string _html; protected int _pos; protected bool _scriptBegin;

public HtmlParser(string html) { Reset(html); }

/// <summary> /// Resets the current position to the start of the current document /// </summary> public void Reset() { _pos = 0; }

/// <summary> /// Sets the current document and resets the current position to the /// start of it /// </summary> /// <param name=”html”></param> public void Reset(string html) { _html = html; _pos = 0; }

/// <summary> /// Indicates if the current position is at the end of the current /// document /// </summary> public bool EOF { get { return (_pos >= _html.Length); } }

/// <summary> /// Parses the next tag that matches the specified tag name

Page 24: VR-Online (February 2010)

24

vr-online.ru февраль 2010

/// </summary> /// <param name=”name”>Name of the tags to parse (“*” = parse all /// tags)</param> /// <param name=”tag”>Returns information on the next occurrence /// of the specified tag or null if none found</param> /// <returns>True if a tag was parsed or false if the end of the /// document was reached</returns> public bool ParseNext(string name, out HtmlTag tag) { tag = null;

// Nothing to do if no tag specified if (String.IsNullOrEmpty(name)) return false;

// Loop until match is found or there are no more tags while (MoveToNextTag()) { // Skip opening ‘<’ Move();

// Examine first tag character char c = Peek(); if (c == ‘!’ && Peek(1) == ‘-’ && Peek(2) == ‘-’) { // Skip over comments const string endComment = “-->”; _pos = _html.IndexOf(endComment, _pos); NormalizePosition(); Move(endComment.Length); } else if (c == ‘/’) { // Skip over closing tags _pos = _html.IndexOf(‘>’, _pos); NormalizePosition(); Move(); } else { // Parse tag bool result = ParseTag(name, ref tag);

// Because scripts may contain tag characters, // we need special handling to skip over // script contents if (_scriptBegin) { const string endScript = “</script”; _pos = _html.IndexOf(endScript, _pos, StringComparison.OrdinalIgnoreCase); NormalizePosition(); Move(endScript.Length); SkipWhitespace(); if (Peek() == ‘>’) Move();

Page 25: VR-Online (February 2010)

25

vr-online.ru февраль 2010

}

// Return true if requested tag was found if (result) return true; } } return false; }

/// <summary> /// Parses the contents of an HTML tag. The current position should /// be at the first character following the tag’s opening less-than /// character. /// /// Note: We parse to the end of the tag even if this tag was not /// requested by the caller. This ensures subsequent parsing takes /// place after this tag /// </summary> /// <param name=”name”>Name of the tag the caller is requesting, /// or “*” if caller is requesting all tags</param> /// <param name=”tag”>Returns information on this tag if it’s one /// the caller is requesting</param> /// <returns>True if data is being returned for a tag requested by /// the caller or false otherwise</returns>

protected bool ParseTag(string name, ref HtmlTag tag) { // Get name of this tag string s = ParseTagName();

// Special handling bool doctype = _scriptBegin = false; if (String.Compare(s, “!DOCTYPE”, true) == 0) doctype = true; else if (String.Compare(s, “script”, true) == 0) _scriptBegin = true;

// Is this a tag requested by caller? bool requested = false; if (name == “*” || String.Compare(s, name, true) == 0) { // Yes, create new tag object tag = new HtmlTag(); tag.Name = s; tag.Attributes = new Dictionary<string, string>(); requested = true; }

// Parse attributes SkipWhitespace(); while (Peek() != ‘>’) { if (Peek() == ‘/’) { // Handle trailing forward slash

Page 26: VR-Online (February 2010)

26

vr-online.ru февраль 2010

if (requested) tag.TrailingSlash = true; Move(); SkipWhitespace(); // If this is a script tag, it was closed _scriptBegin = false; } else { // Parse attribute name s = (!doctype) ? ParseAttributeName() : ParseAttributeValue(); SkipWhitespace(); // Parse attribute value string value = String.Empty; if (Peek() == ‘=’) { Move(); SkipWhitespace(); value = ParseAttributeValue(); SkipWhitespace(); } // Add attribute to collection if requested tag if (requested) { // This tag replaces existing tags with same name if (tag.Attributes.Keys.Contains(s)) tag.Attributes.Remove(s); tag.Attributes.Add(s, value); } } } // Skip over closing ‘>’ Move();

return requested; }

/// <summary> /// Parses a tag name. The current position should be the first /// character of the name /// </summary> /// <returns>Returns the parsed name string</returns> protected string ParseTagName() { int start = _pos; while (!EOF && !Char.IsWhiteSpace(Peek()) && Peek() != ‘>’) Move(); return _html.Substring(start, _pos - start); }

/// <summary> /// Parses an attribute name. The current position should be the /// first character of the name /// </summary> /// <returns>Returns the parsed name string</returns> protected string ParseAttributeName()

Page 27: VR-Online (February 2010)

27

vr-online.ru февраль 2010

{ int start = _pos; while (!EOF && !Char.IsWhiteSpace(Peek()) && Peek() != ‘>’ && Peek() != ‘=’) Move(); return _html.Substring(start, _pos - start); }

/// <summary> /// Parses an attribute value. The current position should be the /// first non-whitespace character following the equal sign. /// /// Note: We terminate the name or value if we encounter a new line. /// This seems to be the best way of handling errors such as values /// missing closing quotes, etc. /// </summary> /// <returns>Returns the parsed value string</returns> protected string ParseAttributeValue() { int start, end; char c = Peek(); if (c == ‘”’ || c == ‘\’’) { // Move past opening quote Move(); // Parse quoted value start = _pos; _pos = _html.IndexOfAny(new char[] { c, ‘\r’, ‘\n’ }, start); NormalizePosition(); end = _pos; // Move past closing quote if (Peek() == c) Move(); } else { // Parse unquoted value start = _pos; while (!EOF && !Char.IsWhiteSpace(c) && c != ‘>’) { Move(); c = Peek(); } end = _pos; } return _html.Substring(start, end - start); }

/// <summary> /// Moves to the start of the next tag /// </summary> /// <returns>True if another tag was found, false otherwise</returns>

protected bool MoveToNextTag() { _pos = _html.IndexOf(‘<’, _pos);

Page 28: VR-Online (February 2010)

28

vr-online.ru февраль 2010

NormalizePosition(); return !EOF; }

/// <summary> /// Returns the character at the current position, or a null /// character if we’re at the end of the document /// </summary> /// <returns>The character at the current position</returns> public char Peek() { return Peek(0); }

/// <summary> /// Returns the character at the specified number of characters /// beyond the current position, or a null character if the /// specified position is at the end of the document /// </summary> /// <param name=”ahead”>The number of characters beyond the /// current position</param> /// <returns>The character at the specified position</returns> public char Peek(int ahead) { int pos = (_pos + ahead); if (pos < _html.Length) return _html[pos]; return (char)0; }

/// <summary> /// Moves the current position ahead one character /// </summary> protected void Move() { Move(1); }

/// <summary> /// Moves the current position ahead the specified number of characters /// </summary> /// <param name=”ahead”>The number of characters to move ahead</param> protected void Move(int ahead) { _pos = Math.Min(_pos + ahead, _html.Length); }

/// <summary> /// Moves the current position to the next character that is // not whitespace /// </summary> protected void SkipWhitespace() { while (!EOF && Char.IsWhiteSpace(Peek())) Move(); }

Page 29: VR-Online (February 2010)

29

vr-online.ru февраль 2010

/// <summary> /// Normalizes the current position. This is primarily for handling /// conditions where IndexOf(), etc. return negative values when /// the item being sought was not found /// </summary> protected void NormalizePosition() { if (_pos < 0) _pos = _html.Length; } }}

Пользоваться определенным в первом листинге классом очень просто. Для этого достаточного посмотреть на следующий листинг. В нем приведен код, демонстрирующий выборку всех имеющихся на странице ссылок (значению атриботов href тега <a>). Код загрузки страницы для разбора также показан во втором листинге. Перебор всех найденных тегов осуществляется в цикле, в котором вызывается уже упомянутый мной метод ParseNext(). Как только будет достигнут конец страницы, этот метод вернет false.

листинг 2:protected void ScanLinks(string url) { // Download page WebClient client = new WebClient(); string html = client.DownloadString(url);

// Scan links on this page HtmlTag tag; HtmlParser parse = new HtmlParser(html); while (parse.ParseNext(“a”, out tag)) { // See if this anchor links to us string value; if (tag.Attributes.TryGetValue(“href”, out value)) { // value contains URL referenced by this link } } }

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

Written by Jonathan WoodURL: http://www.codeproject.com/Members/Jonathan-Wood

Page 30: VR-Online (February 2010)

30

vr-online.ru февраль 2010

Page 31: VR-Online (February 2010)

31

vr-online.ru февраль 2010

Осторожно: Hi-Tech. Банкоматы (продолжение)

Zeroxor

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

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

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

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

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

Page 32: VR-Online (February 2010)

32

vr-online.ru февраль 2010

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

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

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

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

Page 33: VR-Online (February 2010)

33

vr-online.ru февраль 2010

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

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

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

очереди за Вами, внимания не обращайте – они в любом случае уже не смогут снять

деньги – банкомат ведь сломался, так что никого не должно волновать, что Вы не

выходите из кабинки, а стоите и болтаете по мобильнику. Можете и сами обследовать щель картоприемника на предмет наличия “ушек” - и

вытащить свою карту самостоятельно (доказать, что петлю ставили не Вы легко и просто –

достаточно посмотреть несколько последних минут записи с камеры наблюдения)

И еще раз напомню: никому, никогда, ни при каких условиях не сообщайте

свой пин-код, даже если он нужен для

получения крупного выигрыша, который

был определен путем случайного выбора

номера карты и именно Вы оказались

счастливцем, сорвавшим джек-пот. Об этом виде

мошенничества, которое, кстати,

называется фишингом, мы обязательно

поговорим, но уже не в этот раз.

берегите себя и свои сбереЖения.

Page 34: VR-Online (February 2010)

34

vr-online.ru февраль 2010

Page 35: VR-Online (February 2010)

35

vr-online.ru февраль 2010

Настройка беспроводной сетиkasTor (HTTP://kasTorDrIVer.lIVejourNal.Com/)

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

Основной элемент беспроводной сети это точка доступа, которая является аналогом обычного коммутатора. Пример настройки беспроводной сети я буду рассматривать на базе точки доступа Dlink DAP-1150. Все настройки, которые мы рассмотрим сегодня, на большинстве АР (Access Point) аналогичны, так что ты сможешь разобраться в любой из них. Введение сделано, приступаем! По умолчанию, наша точка доступа имеет IP адрес 192.168.0.50, а маску подсети 255.255.255.0, поэтому твоя сетевая карта должна иметь адрес из этого же диапазона. Разные АР могут иметь разные адреса, установленные по умолчанию. Обычно они указываются в руководстве, которое идет вместе с устройством. Настройку будем производить через веб-интерфейс, поэтому вводим этот ip-шник в строку браузера. Кстати, вместо IP адреса можно использовать и NetBios имя устройства. Так что, если ты забыл какой установил адрес, то смело вбивай http://dlinkap (так же установлено по умолчанию). После этого появится окно, для ввода логина и пароля.

Узнать их можно из того же руководства. В нашем случае логин «admin», а пароль пустой. Для любой точки доступа очень легко найти в интернете пароли, которые установлены на ней по умолчанию, поэтому такие данные необходимо будет изменить. После аутентификации мы попадаем в настройки. В нашем случае мы попадаем «прямо в руки» мастеру настроек беспроводной сети. Но я предпочитаю все настраивать сам, чтобы точно знать какие настройки выставлены, поэтому сразу шагаем в раздел «Wireless Setup» на вкладке «Setup».

После того, как ты придумал мега страшное название для своей сети, вбивай его в поле «Wireless Network Name».Далее сними галочку в поле «Enable Auto Channel Scan», чтобы канал, на котором будет работать наша сеть, не выставлялся автоматически. По идее, в автоматическом режиме АР сама просканирует эфир и выберет самый не зашумленный канал. Можно воспользоваться этим благом WLAN строения, а можно все сделать самому. Запусти у себя на компьютере (или любом другом девайсе с Wi-Fi адаптером) программу, для поиска беспроводных сетей и посмотри, какие сети нашлись и на каких каналах они работают. Возможно в твоем доме у каждого жильца стоит по точке доступа, и вот чтобы вы не мешали друг другу, необходимо выбрать каналы, которые не будут перекрываться. Дело в том, что ширина канала, используемая при передаче данных равна 20МГц. А каналы с 1-го по 13-й, это как раз частоты от 2412МГц до 2472МГц. Вычитаем из второго первое и получаем 60МГц.

Page 36: VR-Online (February 2010)

36

vr-online.ru февраль 2010

Теперь делим это на ширину канала и получаем значение 3. Вот и выходит, что в одном «радиусе действия» нормально могут работать только три разные беспроводные сети на каналах: 1, 6 и 13. Кстати, есть точки доступа с технологиями повышенной передачи данных именуемые «Super G Turbo Mode», «Super N» и т.п. Вот эта повышенная пропускная способность в основном достигается за счет увеличения ширины канала. Поэтому, если у тебя или кого либо будет использоваться эта технология, то знай, что уже занята большая полоса частот, поэтому количество нормально работающих сетей, расположенных рядом, становится меньше. Я все время повторяю слово нормально и ни разу еще не сказал, что сеть будет работать отлично. Это потому, что препятствия различного рода могут частично или полностью поглощать радио волны. Так что если у тебя между точкой доступа и ноутом находится не одна бетонная стена, то тут что настраивай каналы, что нет, работать твоя сеть будет максимум нормально.Следующим параметром для настройки является «Enable Hidden Wireless». Я думаю ты уже догадался что он делает – отключает широковещательную рассылку beacon пакетов, в которых передается название сети. В таком случае, к ней смогут подключиться только те клиенты, которые точно знают как называется сеть. Следует помнить, что если выключить широковещательную рассылку после того, как к ней были подключены клиенты, то они в следующий раз все равно смогут к ней подключиться, так как ее название им уже было известно. Даже если сеть и будет скрыта, то при большом желании ее название все равно можно узнать. Но если ты хочешь спрятать ее от случайных глаз, то можешь поставить тут галочку.

Page 37: VR-Online (February 2010)

37

vr-online.ru февраль 2010

Далее переходим к защите нашей ненаглядной и в выпадающем списке «Security Mode» выбираем «Enable WPA2 Wireless Security (enhanced)». На данный момент WPA2 является лучшей защитой для беспроводных сетей, поэтому выбираем именно его (да выбор не особо и велик). Поле «Cipher Type» определяет тип шифрования, которым будет кодироваться наша информация. Выбираем AES, так как он более надежен чем TKIP, хотя мне кажется, что и последний взломать будет не легко. Далее следует такое интересное поле, где нам предлагают выбрать вид аутентификации клиентов в сети. При использовании WPA нам предоставляется два режима: в одном используется простой ввод пароля, в виде фразы длиной от 8 до 63 символов; во втором используется специальный RADIUS-сервер, который и определяет, кому можно заходить, а кому нет. Вот с радиус сервером мы как-нибудь потом разберемся, а сейчас будем использовать первый способ, как более легкий и быстрый в настройке. Поэтому в поле «PSK / EAP» выбирай «Personal». Ниже находятся два поля, где надо ввести и подтвердить пароль, который будут использовать клиенты для доступа в сеть.Основные настройки выставлены, но пункты на удивление еще не закончились. Осталось рассмотреть такую штуку, как WPS (WiFi Protected Setup). Она не является обязательной, это просто такая фича от разработчиков, которая должна облегчить настройку защищенной WLAN до уровня детского садика. Этот механизм может реализовываться двумя способами. Первый предусматривает работу с уникальными идентификационными PIN кодами. Для регистрации устройства, такой PIN код необходимо будет ввести в диалоговое окно точки доступа. Второй способ, который называется PBC, по идее должен быть еще легче. Регистрация нового устройства в сети сводится к одновременному нажатию специальных кнопок, расположенных на клиентском адаптере и точке доступа (да, это та самая непонятная кнопка, которая находится на нашей АР). Признаюсь честно, я в этих методах особо не разбирался, потому что они мне кажутся немного странными. Возможно в будущем разработчики доведут их до совершенства, а сейчас я не вижу в этом никакого смысла. Так, с основными настройками покончено, можно жмакать по кнопке «Apply Settings». Точка доступа сохранит наши установки и обратно запросит ввод логина и пароля. Не получится сначала настроить на разных вкладках параметры, а потом одним махом их сохранить. Придется каждый раз нажимать на кнопку сохранения и вводить логин и пароль (по крайней мере, на этой точке доступа).Переходим к сетевым настройкам и выбираем пункт «LAN Setup».

Page 38: VR-Online (February 2010)

38

vr-online.ru февраль 2010

Тут настроек поменьше будет. Первый выпадающий список определяет, будут ли настройки назначаться автоматически или вручную. Выбираем вручную и далее устанавливаем параметры, которые нам необходимо. У меня, например, точка доступа подключена к локальной сети (для расширения ее зоны действия) через коммутатор. Поэтому IP адрес и маска подсети соответствуют тем, которые используются в локалке. А адресом шлюза я прописал IP сервера, который раздает интет. В поле «Device Name» находится знакомое нам «dlinkap». Это NetBios имя, под которым нашу АР будет видно в сети. Его можно поменять на любое другое.

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

Здесь все настройки выставлены по умолчанию и без особой надобности их трогать не стоит. Но зачем они нужны мы конечно же разберемся. «TX Rates» определяет скорость передачи информации. В положении «Auto» точка доступа будет сама регулировать скорость передачи для наилучшего быстродействия и максимального расстояния. Следует помнить, что чем выше скорость, тем хуже может быть связь. Поэтому, если при развертывании своей беспроводной сети связь совсем никакая, то можно попробовать максимально снизить скорость передачи вручную. Следующий параметр «Transmit Power». Он устанавливает мощность передатчика АР в процентном соотношении. Если нежелательно обнаружение сети посторонними лицами, то можно подобрать мощность так, чтобы сигнал не распространялся за пределы необходимого здания или помещения. «Beacon Interval» - устанавливает интервал отправки в эфир тех самых пакетов, которые содержат название нашей сети и прочую служебную информацию. Далее идут еще более непонятные параметры. «RTS Threshold» - минимальный размер пакета, при котором сигнал запроса на отправку может быть послан на принимающее устройство. Если в эфире много помех (например, когда рядом развернуто много беспроводных сетей), то уменьшение этого значения может способствовать сокращению числа потерянных фреймов. «Fragmentation» - порог фрагментации, который используется для деления пакетов на части. Чем ниже установленный порог, тем меньше размер пакета, который не будет разбиваться на фрагменты. Если связь очень плохая, и нет других способов ее улучшить, то можно поэкспериментировать с этим параметром. «DTIM Interval» определяет временной интервал, по истечении которого беспроводным клиентам будут отправлены широковещательные и многоадресные пакеты, помещенные в буфер. Это позволяет мобильным станциям экономить энергию. При работе с приложениями, которые используют широковещательные и многоадресные

Page 39: VR-Online (February 2010)

39

vr-online.ru февраль 2010

фреймы, данный интервал следует минимизировать, чтобы не было никаких подвисонов. Все давно знают, что в беспроводных сетях есть такие стандарты, как 802.11b и более скоростной 802.11g. Вот параметр «Mode Settings» и определяет, в каком из них будет работать точка доступа. Можно выбрать смешанный режим, при котором АР будет работать в режиме 802.11g, но при наличии устройств работающих в менее скоростном 802.11b, автоматически перейдет на него. Следующее значение «Preamble Type» определяет длину блока контроля при помощи CRC, который используется при обмене данными между точкой доступа и клиентами. Спешу тебя обрадовать, что если на точке доступа выставить Short Preamble, а на клиентском адаптере – Long Preamble (или наоборот), то они все равно будут друг с другом работать. Тем более, если учесть, что на клиентских адаптерах можно выставить значение Short & Long, то и переживать особо не за что. Если в сети не используются устройства стандарта 802.11b, то для оптимальной производительности рекомендуется выбирать короткую преамбулу. Остался последний параметр «WMM», который расшифровывается как Wi-Fi multimedia.Он включает функцию качества обслуживания (Quality of Service), которая обеспечивает пакетам мультимедиа приоритет над обычными сетевыми пакетами. Это может использоваться для таких приложений, как VoIP и видео. Правда, для использования этой фишки, другие устройства так же должны поддерживать эту функцию. Все эти странные параметры лучше оставить в покое. Но когда уже ничего не помогает улучшить сигнал, то можно попробовать хоть как то улучшить качество связи меняя данные значения. Наверняка, пока мы с тобой разбирали на атомы эти настройки тебя уже давно выкинуло из меню и заново просят ввести логин и пароль. Это ни какая не атака хакеров. Просто по истечению некоторого времени, если не производить никаких настроек, точка доступа считает что за компьютером никого нет и можно выходить из меню, чтобы никто «левый» не подошел и не напартачил.Следующий пункт «Access Control» дает нам возможность фильтровать клиентов по MAC-адресу. Можно составить список MAC-адресов, доступ которым будет запрещен к данной сети, или наоборот – только им и разрешен.

Я, для примера, составил список из одного клиента с MAC адресом 11:22:33:44:55:66, доступ которому в сеть запрещен. Пробовал вводить реальный MAC своего ноута. Доступ в сеть мне был действительно закрыт, но не стоит полагаться на эту защиту полностью. Не так уже и сложно узнать список маков, доступ которым разрешен, а потом на свой адаптер поставить такой же. Это как и скрытие названия сети – просто знак Stop для непрошенных гостей, но ни как не металлическая дверь в колючей проволоке.А теперь шагаем на вкладку «Maintenance» и в первом же пункте «Device Administration» видим два поля ввода. Это как раз далеко не последняя по важности настройка. При развертывании WLAN необходимо сменить пароль, который используется для доступа к настройкам АР. В более дорогих

Page 40: VR-Online (February 2010)

40

vr-online.ru февраль 2010

точках доступа есть возможность заводить отдельных пользователей с разными паролями и правами на изменение настроек. В нашем случае остается довольствоваться сменой пароля на единственную запись администратора. Не стоит пренебрегать этим, особенно при развертывании hotspot’ов, а то можно будет заколебаться сбрасывать по умолчанию и настраивать их каждый день. Остальные пункты на этой вкладке отвечают за сохранение произведенных настроек и перепрошивку точки доступа.Осталась последняя вкладка в которой отображается статус устройства. В разделе «Device Info» отображены основные настройки АР, произведенные нами ранее.

В разделе «Log», как ты уже наверное догадался, записывается кто, когда и как к нам приконнектился. На мой взгляд, не самая последняя информация.

Page 41: VR-Online (February 2010)

41

vr-online.ru февраль 2010

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

А в разделе «Wireless» можно наблюдать список MAC адресов клиентов, которые сейчас подключены к сети, и время их пребывания в ней.

Поздравляю тебя! Сегодня мы рассмотрели все настройки, касающиеся развертывания беспроводной сети. Ну, если не все, то основные точно. Потому что в разных точках доступа, могут быть какие-нибудь свои приколы и навороты. Вот в рассматриваемой DAP-1150 нельзя отключить возможность зайти в настройки через сам Wi-Fi. Если ты владелец сети, то сможешь к ней подключиться по проводу и все настроить, а если нет – то тут тебе и поможет эта не выключенная возможность.

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

Page 42: VR-Online (February 2010)

42

vr-online.ru февраль 2010

Создаем видеоконференцию. Part1lorD_oF_Fear aka роман костенко ([email protected])

здравствуй, дорогой читатель. я тебе расскажу новогоднюю сказку. :) правда, сказочного в этом ничего не было, да и зима уже почти закончилась, но произошло всё практически сразу после наступления нового 2010-го года. Встала, значит, передо мной на работе (работаю в головном офисе страховой компании) задача: необходимо реализовать видеоконференцию с каждым из наших филиалов(а их у нас 12).что? Skype? … Всё верно. правильно ты подумал :) а что дальше? со стороны филиала реализовать всё просто. там в конференции будет участвовать только 1 человек (директор филиала), а с моей стороны – 10 человек. Вот тут то и пришлось озадачиться…

Погуглив, я понял, что готовые решения для видеоконференций обойдутся моему головному офису в 100 тысяч рублей и ещё по 20 тысяч за каждый филиал. Конечно же, идти с таким предложением к генеральному директору не хотелось. Да и он, скорее всего, не согласился бы.И я вернулся обратно к идее со Скайпом. Тут вырисовывалось 2 проблемы:1 – микрофон. Как сделать так, чтобы на том конце было хорошо слышно всех участников с моей стороны?2 – видеокамера. Как охватить одной камерой аж 10 человек одновременно?В этой статье я расскажу о том, как победил первую проблему. Описание решения 2-й задачи будет в продолжении статьи. Итак, приступим.

немнОгО теОрииРазличают 2 вида микрофонов: динамические и конденсаторные.

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

конденсаторные микрофоны представляют собой по сути дела конденсатор. Одна из обкладок которого закреплена жёстко, а другая подвижна. Эта подвижная обкладка и есть мембрана микрофона. Звук, который попадает на мембрану, естественно, заставляет её колебаться. При колебании мембраны расстояние между обкладками изменяется, что и приводит к изменению ёмкости конденсатора. Для работы такого микрофона необходимо на обкладки конденсатора подать напряжение, которое называется фантомным. Из за того, что мембрана изготовленная из тончайшей металлической фольги, она имеет очень маленькую массу. Такие микрофоны очень чувстствительны к высоким частотам и имеют гладкую АЧХ.

реализаЦияСначала пришла в голову мысль ограничиться обычными динамическими микрофонами на ножке. Было куплено 2 микрофона Genius MIC-01 на ножке:Общая стоимость составила 170 рублей. Я скрутил оба микрофона вместе

Page 43: VR-Online (February 2010)

43

vr-online.ru февраль 2010

и подцепил их к одному штекеру. Решил, что один микрофон будет стоять у гендиректора, а второй остальные будут передавать между собой. Первая же конференция была полным провалом. Чувствительность микрофонов хуже некуда. Говорящие постоянно крутили головой и, как результат, звуковой поток проходил мимо микрофона. Но я стал сильно расстраиваться и решил продолжить поиски. Мой взгляд остановился на поверхностном микрофоне ProAudio BM390:

Его характеристики:Тип: конденсаторный Характеристика направленности: всенаправленный Чувствительность: -32 дБСопротивление: 2000 ОмЧастотный диапазон от: 30 Гцдо: 20000 ГцВес: 180 г

Его цена - 4900 рубликов. “То, что надо!” подумал я и решил взять сразу 2.Заказ оформил в “МузБазаре” и через 6 дней передо мной лежали 2 красивых серебристых чемоданчика. Первой мыслью в моей голове было “Офигеть, да только один этот чемоданчик-упаковка стоит не меньше 1000 рублей”. Ну да ладно, главное – что внутри этих чемоданчиков лежали долгожданные микрофоны. Я сразу подключил 1 из них и решил затестить. Держа микрофон в руке, начал запись аудио. Каково же было мое разочарование, когда я увидел ужаснейшую чувствительность (на уровне микрофона Genius на ножке). Но все изменилось после того, как я положил микрофон на стол, убрав с него весь хлам. Теперь можно было без проблем записываться, сидя в другом углу кабинета. Моей радости не было предела. :)

Осталось только подключить сразу 2 микрофона.Первой мыслью было подключить всё таким способом:

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

Page 44: VR-Online (February 2010)

44

vr-online.ru февраль 2010

Вот теперь всё супер. 2 таких микрофона ловят все разговоры на ура. Финансовые затраты составили 9800 рублей.Ну и напоследок, я ещё включил усиление микрофона на +20 ДБ в софтине, что шла с дровами на звуковуху.

На этом с микрофонами всё. Во второй части статьи я расскажу как можно транслировать в Skype видео сразу с 2-х камер. Продолжение читай в следующем номере VR.

Page 45: VR-Online (February 2010)

45

vr-online.ru февраль 2010

Page 46: VR-Online (February 2010)

46

vr-online.ru февраль 2010

Копирование каталогов средствами DelphiZaNuDa25

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

ОснОвная частьСейчас будем кодить в среде Lazarus, похожая на Delphi.

Создай форму и оформи её как на рис.1

Рис. 1

Самое интересное впереди. Обратите внимание на невизульный компонент SelectDirectoryDialog1. Он играет роль OpenDialog, но только вместо файлов выбираете каталоги. Есть ли такой компонент в Delphi, я не знаю.

Сейчас напишем функцию, которая отвечает за копирование каталогов из одного места в другое.

function CopyDirectory( StrFrom, StrTo : string) : Boolean;var F : TShFileOpStruct;begin F.wFunc:=FO_COPY; F.pFrom:=PChar(StrFrom + #0); F.pTo:=PChar(StrTo+#0); F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION; if ShFileOperation(F) = 0 then result:=False else result:=True;end

Мы рассмотрим подробнее эту функцию.

Page 47: VR-Online (February 2010)

47

vr-online.ru февраль 2010

function CopyDirectory( StrFrom, StrTo : string) : Boolean;Здесь мы объявлем функцию под названием CopyDirectory, которая будет проверяться булевой алгеброй, то есть в случае успешного копирования будет True и наоборот, False.StrFrom, StrTo -- переменные, которые мы будем брать для копирования каталогов.

var F : TShFileOpStruct;

Присваиваемся переменнонй F значение TShFileOpStruct, которое вы найдете в документации, достаточно выделив это слово и нажав F1.Весь остальной код смотри в исходниках...Теперь откомпилируем программу, нажав кнопку F9.

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

Page 48: VR-Online (February 2010)

48

vr-online.ru февраль 2010

Page 49: VR-Online (February 2010)

49

vr-online.ru февраль 2010

Маски-шоу или учимся работать со слоями и альфа-каналами

ZaHoD5277 ([email protected])

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

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

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

как рабОтают эти штуки?Уже в те давние, давние времена, когда твой прапрадедушка защищал порт Артур от японских захватчиков, существовали маски в фотографии! При печати черным куском картона закрывали ненужную часть фотографии, и фотобумага в этих местах оставалась белой (поищи рядом с прапрадедушкиным фотоаппаратом черный картон). Принцип сохранился до сих пор: черным цветом обозначают невидимые области, а белым цветом – видимые. Этот как наши друзья биты : 0 –включен - белый цвет – видим, 1-выключен – черный цвет – не видим! Правда с битами мы не сможем сделать к примеру положение “чуть- чуть включен” или “не до конца выключен” , а в мире графики с легкостью можно сделать “чуть-чуть видно” и “не до конца видно”. Ладно, хватит всей этой теории, давай порисуем!

QuiCk mask (быстрая маска)Первым делом познакомимся с быстрой маской. Быстрая маска позволяет за короткий промежуток выделить сложный участок изображения. Открывай любой рисунок и смотри на скриншот.Красным кружком я пометил кнопку для перехода в режим быстрой маски. Жми на

Page 50: VR-Online (February 2010)

50

vr-online.ru февраль 2010

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

На скриншоте хорошо видно, что дракон закрашен красным полупрозрачным цветом, именно это и означает что редактирование рисунка идет в режиме быстрой маски. Если в процессе выделения дрогнула рука и маска нарисовалась не там где надо, выбери белый цвет и аккуратно закрась этот участок. Ты, наверное, уже заметил, что маску мы наносили черным цветом, но черный цвет это же положение “НЕ ВИДИМ”? Да, все верно, почему такой парадокс я объяснить не могу, да и на просторах сети мне .ϑне дали четкого ответа,

Page 51: VR-Online (February 2010)

51

vr-online.ru февраль 2010

поэтому не парься Вот ты наконец-то, изрядно попотев, закрасил свой участок рисунка. Что с ним дальше делать? Как отделить его от фона? Легко! Выключай режим быстрой маски, снова щелкнув по тому значку на панели инструментов или нажав клавишу Q. Образуется привычное для нас выделение. Жми на клавишу DELETE и радуйся результату!Немного доработав ластиком, получаем практически идеально выделенный участок изображения.

layer mask (маска слОя)Как продвинутый фотошопер ты знаешь, что в Photoshop’е вся работа основана на слоях. Так почему же не применять маску к какому-нибудь слою? Если проявить фантазию то открывается просто огроменный простор для экспериментов! Смотри сам: можно накладывать черно-белый градиент, чтобы добиться эффекта прозрачности, можно поиграться с фильтрами, которые используют черный и белый цвета, да мало ли чего еще!? Давай поближе познакомимся с этим видом масок. Открывай два любых рисунка, выбирай тот, с которого хочешь получить эффект полупрозрачности, копируй слой заднего плана (CTRL+J), выключай задний план и ищи кнопку “Добавить маску”, а чтобы ты не запутался, я покажу скриншот.

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

Page 52: VR-Online (February 2010)

52

vr-online.ru февраль 2010

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

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

alFa-CHannel (альфа-каналы)Альфа-канал хранит в себе информацию об изображении, и работает так же как и маска. Принцип работы с альфа каналом немного сложнее чем с быстрой маской и маской слоя, но нас же трудности не пугают? Поэтому загружай в фотошоп любой рисунок, переходи на вкладу “Каналы” и жми кнопу “Создать новый канал”Во вкладке “Каналы” появился новый канал, весь залит черным цветом. То есть вся область невидима. Выделяй этот канал, выбирай кисть белого цвета и начинай отмечать область, которую ты хочешь сделать видимой. Если память подкачала, и ты не помнишь где что находится на картинке, то просто сделай видимым RGB канал, картинка покроется уже знакомым прозрачным красным цветом.

Page 53: VR-Online (February 2010)

53

vr-online.ru февраль 2010

Page 54: VR-Online (February 2010)

54

vr-online.ru февраль 2010

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

В итоге вот что получилось:

Неплохо, да? А теперь вспомни все, чему ты научился в этом уроке, и иди сотвори что-нибудь эдакое! Если что не понятно - пиши письма на [email protected], разберемся :) !