PROgrammist, №8

Page 1


ПРО

граммист

СОДЕРЖАНИЕ

№8 (ноябрь) 2010

Издается с марта 2010. Выходит ежемесячно №8, ноябрь 2010 г.

Редакция: Выпускающий редактор Сергей Бадло Литературный редактор Utkin Редакторы JTG, Василий Мединцев, Алексей Шульга, Егор Горохов Редактор-корректор Yan Liplavskiy

Дизайн и верстка:

Егор Горохов, Сергей Бадло

Авторский состав:

Utkin, Дарья Устюгова, Алексей Шишкин, Александр Демьяненко, Виталий Белик, Олег Кутков, Сергей Бадло

Официальный сайт журнала: www.procoder.info

Контакты:

Авторские статьи направляйте на maindatacentr@gmail.com Вопросы и предложения для редакции reddatacentr@gmail.com Вопросы и предложения администратору info@procoder.info

ТЕМА НОМЕРА

Интеграция технологий ........................................ с.0х02 НЕВЕРОЯТНО, НО ФАКТ

Любопытные факты ............................................. с.0х03 ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

Почему сыр в мышеловке бесплатный ............................ с.0x08 Эксплойты. Анализ состава преступления ....................... с.0x0F ОТДЕЛ ТЕСТИРОВАНИЯ

Интерфейс. Часть 3 ........................................... с.0х13 WinAPI графика. Panic button ................................. с.0х17 ЛАБОРАТОРИЯ

WMI. Wладение Mагической Iнформацией. Часть 1 ................ с.0х1D Работа с NetLink в Linux. Часть 1 ............................ с.0х25 АРХИВ

БПФ. Практика использования .................................. с.0х2D ЮМОР

Невыдуманные истории сети AirNET-Бердянск .................... с.0х3B

Информационная поддержка:

Международная Академия Информатизации (МАИН) РК www.academy.kz Журнал «Радиолюбитель» www.radioliga.com V.K. сайт... www.kotoff.info Free Legal Soft Group www.flsoft.ru AirNet-Berdyansk www.airnet.sytes.net

Примечание:

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

Идея создания журнала: Алексей Шульга

Обложка номера: Дизайн Сергея Бадло

архив номеров журнала ^


ПРО

граммист

ЛЮБОПЫТНЫЕ ФАКТЫ ИНТЕГРАЦИЯ ТЕХНОЛОГИЙ

№8 (ноябрь) 2010

От редактора. Здравствуйте, уважаемые читатели журнала «ПРОграммист». Для постоянных посетителей нашего ресурса уже не секрет – появление в информационных партнерах нового участника, журнала VR-Online. Радует тот факт, что некоммерческое движение растет и не сдает свои позиции. В особенности, близка оказалась мне точка зрения главреда VR-Online – Игоря Антонова, высказанная им в сентябрьском выпуске по поводу постоянных холиваров по отдельным языкам программирования и ОС. Дополню коллегу из собственного опыта: около 30% систем учета, различных серверов и утилит, выполняющих функции, недоступные стандартным SCADA (или идущих за отдельные «немалые» деньги) на металлургических предприятиях (Криворожсталь, Запорожсталь и т.д.) и в области радиолокации, реализованы на Delphi. Множество программ, которыми большинство из нас повседневно пользуется – сделаны на Delphi. По моим личным убеждениям, настоящий специалист должен знать и уметь интегрировать максимум технологий, ибо слепая вера в одну технологию – подавляет возможность выбора... В наших выпусках вы уже убедились в этом, на примере построения некоммерческой Wi-Fi сети AirNet, создания энкодера (где сочетаются технологии ПЛИС, языка си и радиоэлектроники), создания собственного компилятора, методологией работы с MySQL и многие другие проекты. Огорчает лишь то, что остаются ярые фанатики «святых» войн.

В

этом

выпуске...

В

рубрике

Utkin

и

Дарья

Устюгова

затронут правовые вопросы использования ПО. «Отдел

тестирования»

Александр

Демьяненко продолжит рассказ про интерфейс. На этот

раз

поднята

эргономики.

А

актуальная

Алексей

тема

Шишкин

вопросов

постарается

привить вам навыки создания «чистых» WinAPI приложений в среде Lazarus.

Общие требования к материалам У

(используется облегчения •

мониторинга

форумчанина. В

рубрике

спектроанализа.

«Архив» Так

уж

мы

подняли

получилось,

что

тему

это

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

к

ПО

«SCRIBUS»)

и

редакторов,

есть

некоторый

и

содержать

название

статьи,

авторах, экскурс или введение, об

используемых

теоретическую

средствах

и/или

практическую часть, заключение и ресурсы к

можно озаглавить новый цикл статей нашего

для

разделами

разработки,

и

Netlink

управления сетевой подсистемой Linux», - так

требований

статья должна иметь выраженную структуру с информацию

«Использование

свободное

труда

сведения об

повара в сисадмина. На примере WMI он покажет

Линуксоидов, как всегда, порадует Олег Кутков.

категоричных

желательный минимум:

волшебник Виталий Белик преобразился из шефуправления вашей сетью.

нет

оформлению, но в связи с особенностями верстки

В рубрике «Лаборатория» наш великий маг и

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

нас

• По

статье;

текст статьи без табуляции в формате MS Word, VK WordPad или обычным текстовым файлом, шрифт Arial 10;

все рисунки, таблицы должны быть подписаны и иметь упоминание в тексте;

рисунки к статье должны прилагаться в виде отдельных файлов в формате PNG, TIF;

разделы статьи отделять двумя <ENTER>. присланным

рецензию

и

материалам

корректирует

автор

статью

получает

согласно

замечаниям. Шаблон для написания статьи можно взять тут.

С уважением, Редакция

ТЕМА НОМЕРА

СОДЕРЖАНИЕ

3


ПРО

ЛЮБОПЫТНЫЕ ФАКТЫ

№8 (ноябрь) 2010

граммист

В последнее время диву даешся некоторым действиям различных организаций. Вот, к примеру, введение налога на пустую болванку CD для защиты правообладателей или введение пошлин на GPS в России. Все казалось-бы хорошо, самые благие намерения – поддержка отечественной спутниковой системы ГЛОНАСС. Давно пора. И в то же время, когда не хватает рабочих мест внутри страны, размещение производства в Китае и Индии. Оно понятно, экономический фактор и уже действующие отработанные линии производства микроэлектроники на забугорных заводах. Так делают многие развитые страны Европы и даже США не брезгует. Но, тем не менее… Далее в материале вы узнаете: про разработку процессоров с ячеистой топологией, о развитии сети 4G в Казахстане, о практически готовых радиостанциях на основе RX/TX модулей диапазона 2.4 ГГц фирмы Aurel, об использовании оптоволокна в качестве массива датчиков температуры в самых агрессивных средах и многое другое... Сергей Бадло

Таможенные

by raxp http://raxp.radioliga.com

пошлины

на

навигаторы,

телефоны и мобильные компьютеры, в которых

не имеется модуля ГЛОНАСС, предлагает ввести правительство может

России.

достичь

25%

Размер

от

таких

пошлин

стоимости

каждого

продукта, сообщил вчера вице-премьер Сергей

Иванов. Если навигационный чип будет двойного стандарта (ГЛОНАСС*/GPS), то «никаких пошлин не будет». К

примеру,

компания

несколько наладила

китайская

OlinkStar

месяцев

уже

назад

производство

GNSS-приемников,

которые

дают возможность сочетать Нанобатарейки

не

за

горами.

На

57-м

Международном симпозиуме и выставке AVS в

Альбукерке (США) был представлен прототип одного

из

будущего

электролит

компонентов

размером

представляет

нанонитей,

материалом отношение

элементов

с

и

собой

покрытых

возможного

к

питания

Особый

комплект

электропроводным

организованных

поверхности

максимально

песчинку.

так,

объему

значения,

чтобы

достигало

повышая,

тем самым потенциальную плотность энергии. Для нанесения тончайшего слоя проводящего материала,

используется

алюминосиликата чрезвычайно

лития,

медленный,

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

(atomic layer deposition). Разработку финансирует Управление

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

исследований

Министерства обороны США (DARPA). Батареи будут

использоваться

наноустройств.

для

НЕВЕРОЯТНО, НО ФАКТ

питания

микро-

и

сигналы GPS, ГЛОНАСС и китайской Compass. В

компании Nokia отметили, что в скором будущем

собираются интегрировать в свои мобильные телефоны совмещенные GPS/ГЛОНАСС – чипы. *

Навигаторы

ГЛОНАСС

и

прочее

оборудование

российской

спутниковой навигационной системы будут производить в Китае и

Индии. Об этом заявил заместитель председателя правительства РФ Сергей Иванов, выступая перед журналистами. «Мы не исключаем

сборку гражданского оборудования ГЛОНАСС, предназначенного для

коммерческого

использования,

то

есть

не

связанного

с

вопросами безопасности и обороны России, в Китае, Индии», – отметил вице-премьер.

Специалисты отмечают, что главным условием развития системы ГЛОНАСС быть

должна

дешевизна

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

сигнала.

Не-

которые российские

предприниматели уже

начали

подыс-

кивать себе заводы в

Индии и Китае.

СОДЕРЖАНИЕ

4


ПРО

ЛЮБОПЫТНЫЕ ФАКТЫ

№8 (ноябрь) 2010

граммист

Процессоры с ячеистой топологией предлагает

реализованы

2011

Multi-touch

компания Tilera. В году

выпущен

будет

сервер

с

ядрами

в

высотой

котором

топологию,

когда

ядра

размещаются в поле со множеством точек для

передачи и получения данных. Каждое ядро имеет коммутатор для более быстрого обмена

данными. Новый Tile-GX100 в архитектуре RISC 64-разрядных

вычислений.

Каждое ядро работает с тактовой частотой до 1.5 ГГц

и

поддерживает

емкостью

32

ядерному

Мбайт.

процессору

В

агрегированный дополнение

Tilera

кэш

к

аппаратных

с

Дауда,

первые

набором

технологий

которые

позволяют

Моноблок

Lenovo

модели

начальной

Сначала

процессоры

выпускать

небольшими

ThinkCM90z

Архитектура

x86

серверов

мощности

из-за

количества

широко

в

определена. Астрономы

предсказали

большой

процессоров

программного

и

вычислительной

наличия

разработанного

обеспечения.

огромного

для

нее

Некоторые

компании стремятся использовать другие виды процессоров,

поскольку

процессоры

в

архитектуре x86 отличаются высоким уровнем

энергопотребления и генерируют очень много

тепла, а это две самые неприятные проблемы, которые

приходится

решать

центров обработки данных. Lenovo

представила

специалистам

настольный

ПК

с

сенсорным экраном 23 дюйма для предприятий. Моноблок

оснаща-

ется процессорами

Intel Core i3 и i5, DVD-приводом

опциональными

и

беспроводными

не

звезд

шаровом

в

ско-

плении.

Двое

астрономов из Space pe

Telesco-

Science

Institute

выяс-

должны

сме-

нили, в

скоплении

Достоверно

как

щаться звезды

омега

известно,

Центавра что

в

будущем.

это

шаровое

скопление, удаленное примерно на 16 тысяч

световых лет от Земли, содержит несколько миллионов звезд. Общая масса омега Центавра чрезвычайно занимать

велика,

второе

место

что в

позволяет

местной

ему

группе

галактик (более крупным считается скопление Mayall

II).

Упоминание

об

омега

Центавра,

которое было корректно классифицировано в 1867

году,

можно

найти

даже

у

Птолемея,

считавшего этот объект отдельной звездой. В

своем исследовании американцы использовали

снимки, выполненные камерой ACS телескопа

«Хаббл»,

Центавра

проводившего в

2002

и

наблюдения

2006

годах.

омега

Сравнивая

снимки, авторы отметили перемещения около 100 тыс. звезд скопления. На основании этих данных была построена карта движения светил в ближайшие 10 тысяч лет.

модулями Wi-Fi и

Робот

ThinkCentre

вымыть, отчистить и высушить различные типы

Bluetooth.

НЕВЕРОЯТНО, НО ФАКТ

в

пока

движение

их

для

появится

конфигурации

планируется

используется

большим

продаже в России в декабре 2010 г., стоимость

этого

партиями,

и

ThinkVantage,

управлять

100-

производство начнется в середине 2011 года.

Компьютер

компьютерным парком в крупных компаниях.

семейства будут выпущены уже в нынешнем году.

сенсорные

программных

3D

анонсировала

экземпляры

и

дисплея.

процессоры TileGX с 16, 32 и 64 ядрами. По словам

объектив

автоматический

конференцсвязи

настроек

поставляется

процессоры следующего поколения. Процессор

для

для

кнопки

ядерные

предназначен

закрывающая

веб-камеры;

микрофон

будут

ячеистую

интерфейсом

контроль яркости экрана; высококачественный

в

использоваться 100имеет

возможности:

фирменным

шторка,

встроенной

стойке

2U,

и

SimpleTap;

800 процессорными

следующие

сенсорный экран с поддержкой технологии 3D

В

M90z

для

мойки

пола

iRobot

Scooba

380

способен провести все этапы мойки: подготовить,

СОДЕРЖАНИЕ

5


ПРО

ЛЮБОПЫТНЫЕ ФАКТЫ

№8 (ноябрь) 2010

граммист

работающих

на

частоте

700

МГц.

Сеть

охватывает большую часть центральной части Алматы, и ее тестирование пройдет в реальном

рабочем режиме до конца января 2011 года, дабы обеспечить работу сети стандарта 4G в

Астане и Алматы во время проведения Саммита ОБСЕ и Азиады. Глава Правительства также поручил

Министерству

обороны

освободить

частоты для 4G в двух городах Казахстана – Астане

проекта.

и

Алматы,

на

Присутствовавший связи

и

на

информации

рассказал

о

том,

время

осуществления

презентации

как

Аскар

министр

Жумагалиев

решаются

вопросы

развертывания в стране сетей 3G. В частности, он сообщил, что к 1 января 2011 года ожидается поверхности пола в Вашем доме (от дерева до линолиума

и

даже

также

других

плитки).

Он

способен

почистить в углах, под столами и стульями, а в

труднодоступных

местах,

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

Робот

барьер,

который

использует

удерживает

только

чистую

водопроводную воду или специальное моющее средство Clorox Scoobа. проект

стандарта

4G

технологии

реализуется СНГ

компанией

LTE.

на

сети

Evolution).

Проект в

Alcatel-Lucent ходе

LTE

реализации

десять

рассматриваются

сотовым операторам. И после их утверждения

министерство сможет выдать разрешения на 3G. При этом сети охватят не только городские регионы, но и сельские. Микросхему

усилительного

без

единого

элемента

электромагнитных

статических зарядов.

казахстанской

В

котором

3G в республике, которые могут предлагаться

от

«Кар-Тел»

установлены

в

транзистора

и

выпустила

фильтр для защиты микрофонных входов (линий)

(группа «ВымпелКом Лтд.») на оборудовании компании

РК,

приемлемые тарифы для внедрения технологии

ИМС EMIF02-MIC07F3 - высокоинтегрированный

базе

впервые

кодекса

STMicroelectronics.

В Казахстане стартовал пилотный

вступление в силу новых поправок Налогового

(Long

«пилота»

базовых

Term уже

станций,

Колокольчик, рерывно уже

более

имеется ском

в

и

электро-

неп-

звенящий 150

лет

Оксфорд-

университете.

Электрический кольчик

помех

коло-

непрерывно

звонит с 1840 года. Он использует

татическое

электроспритяже-

ние, поэтому потребляет очень малый ток. Сухие

элементы,

питающие его, облиты

серой для герметичности, и никто точно не знает, как именно они устроены.

НЕВЕРОЯТНО, НО ФАКТ

СОДЕРЖАНИЕ

6


ПРО

ЛЮБОПЫТНЫЕ ФАКТЫ

№8 (ноябрь) 2010

граммист

Метод

оптоволоконного

измерения

распределенного

температуры**

(DTS),

использует

эффект Рамана, был разработан в начале 1980-х в

Саутгемптонском

Метод

DTS***

университете

основан

на

(Англия).

технологии

оптического измерителя отраженного сигнала (OTDR) и использует методику, применяемую при

тестировании

кабелей.

Оптоволоконный

распределенного особенно

телекоммуникационных

мониторинга

эффективен

в

• •

для

мониторинга;

(высокая

пространственная разрешающая способность и дальний радиус действия оптоволоконных какие • •

части

оператору

оптоволокна

выбрать, следует

контролировать после завершения проекта); когда

электрический

температуры

мониторинг

невыполним

из-за

электромагнитных помех; когда

соединен

с

ответвителя.

оптическим При

волокном

распространении

импульса через оптоволокно обратное рассеяние света зависит от изменений плотности и состава, равно как и от молекулярной вибрации

и

вибрации

массы.

В

однородном

оптоволокне

интенсивность обратнорассеянного света экспоненциально убывает со временем.

часто

непрерывного

датчиков

позволяют

лазер

направленного

возвращения обратнорассеянного света.

когда не имеется теоретических данных о

датчиков

импульсный

хорошо

известна,

расстояние

можно

определить

по

времени

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

температуры

размещении

DTS

посредством

Поскольку скорость распространения света в оптическом волокне

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

В

метод

температуры

некоторых

встречающихся ситуациях:

*** Описание методики DTS.

электрический

мониторинг

температуры небезопасен.

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

свет

состоит

из

различных

спектральных

компонентов. Эти обратнорассеянные спектральные компоненты включают в себя пики либо полосы Релея, Бриллуэна и Рамана:

1. Обратнорассеянный компонент Релея является самым сильным

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

использован для выявления разрывов и разнородности оптоволокна. Компонент Релея нечувствителен к температуре.

2. Обратнорассеянные компоненты Бриллуэна вызваны вибрацией пространственной решетки под воздействием распространяющегося

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

3. Обратнорассеянные компоненты Рамана вызваны термическим влиянием

на

молекулярную

распространяющимся

световым

вибрацию,

импульсом.

Таким

создаваемую

образом,

их

интенсивность зависит от температуры. Обратнорассеянный свет Рамана

имеет

стоксовский

два

пик

компонента,

и

симметричных

антистоксовский

пик.

пику

Релея

Интенсивность

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

интенсивности

температуру.

Сочетая

антистоксовского

сигнала

к

интенсивности стоксовского сигнала, мы можем точно измерить измерение

температуры

с

измерением

расстояния по времени прохождения света, DTS создает картину измеряемой температуры по всей длине оптоволокна.

** Комментарий редакции.

Также есть способ дистанционного измерения температуры по спектру.

В

использован

температуры

частности, довольно

в

металлургии,

любопытный

выливающегося

металла

на

метод:

из

Запорожстали

чана,

для

был

измерения

пустили

рядом

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

флеш,

демонстрирующий

работу

описание систем DTS вы найдете в ресурсах журнала.

НЕВЕРОЯТНО, НО ФАКТ

технологии

и

СОДЕРЖАНИЕ

7


ПРО

АЦП

ЛЮБОПЫТНЫЕ ФАКТЫ

№8 (ноябрь) 2010

граммист

MAX1102

мощностью

представила Основным

увеличение

и

с

низкой

разрядностью

Maxim

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

потребляемой 12/10/8

Integrated ИС

работы

бит

Products.

является

устройств

от

аккумулятора, при этом потребляемая мощность ИС составляет всего 9.9 мВт, что на 32% меньше

по сравнению с конкурирующими решениями. Низкое

потребление

без

ущерба

производительности позволяет применять новое семейство

АЦП

в

жестких

промышленных

условиях: с точки зрения соотношения сигнал

шум 70.5 дБ и отношения полного сигнала к полному

интерфейс

уровню ИС

помех

работает

диапазоне от 1.5 В до 3.6 В.

70

при

дБ.

Цифровой

напряжении

Интегрированные модули

AUDIO-2.4**** диапазона ГГц

2.4

производит

фирма

(Италия).

Aurel

особенностей стоит

приемо-передающие

RX/TX-

Из

отметить

возможность

прямой

подачи-приема

аудио

в

диапазоне Wi-Fi. Номер канала вещания или приема задается

специальными перемычками

на плате (см. таблицу 1 и 2).

в

**** Комментарий редакции.

Документация на все модули включена в архив восьмого номера.

Табл.1. Технические параметры приемных модулей

Табл.2. Технические параметры передающих модулей

НЕВЕРОЯТНО, НО ФАКТ

СОДЕРЖАНИЕ

8


ПРО

ПОЧЕМУ СЫР В МЫШЕЛОВКЕ БЕСПЛАТНЫЙ

№8 (ноябрь) 2010

граммист

По данным ассоциации производителей программного обеспечения (BSA) в 2009 году 67% программного обеспечения в России было установлено незаконным путем. И 43 % исходят из 111 стран мира. Потери мировой индустрии от распространения пиратского софта оцениваются в 51.4 млрд долларов. Рынок бесплатного программного обеспечения (само словосочетание уже является парадоксом) в Российской Федерации пока что находится в зачаточном состоянии (по данным 2009 года), однако быстро развивается. Так почему же во многих странах складывается ситуация когда пользователь не желает платить за программы? Сегодня мы с вами поговорим о причинах использования бесплатного и пиратского программного обеспечения… by Utkin utkin295@yandex.ru

2. Несоответствие ожиданий пользователей и качества продукции

Любая программа должна иметь ровно столько недоработок, чтобы

Вот многие жалуются – нас обкрадывают! А

она и сама неплохо работала, и позволяла неплохо зарабатывать

сами? Яркие цвета, пухлые кнопки, а в итоге

программистам на ее апгрейтах / Стас Янковский

Я люблю пиратов… И не только я один и для этого есть немало причин: 1.

Непомерная

стоимость

легального

программного обеспечения Здесь

все

очень

программы

форми-

просто: руют

цены

в

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

дело в избытке рекламы, современный бизнес строится

на

значительном

от

всех

затрат

на

производство

циальные

на

своей

не

в

Как

это

точ-

циалиста

государство).

Чтобы

оснастить

одну стоимость компьютера, что естественно не устраивает. работать,

стороны,

бродить

по

жить-то

как-то

Интернету,

надо

заниматься

творчеством и разработкой программ. И давайте

честно – жить хочется хотя бы хорошо, а потому с

минимальными

затратами

можно

найти

большинство программ, за исключением разве что экзотики.

работы

антивируса?

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

другой

оценить

ность

компьютер всем необходимым для комфортной

С

в

ность и эффектив-

от

Москвы

на

производитель-

нее Россия – это отдельное

поэ-

обратим

качестве примера.

самостоятельное государство,

далее

абст-

антивирусы,

(Москва

счет

рактно

внимание

готовы

реалий

Разго-

тому

оплачивать исходя зарплаты

рейтингах.

невозможно,

пользо-

из

продажу

варивать

потен-

ватели

и

хотя бы о тех же

исходя из западных а

в

программного обеспечения. О чем это я? Да вот

основном

условий,

вложении

маркетинг. Причем затраты могут достигать 50%

ционной

безопасности

не

области

удивишь

Спев

информасловами

проактивная защита и облачные вычисления, а

над коллективным разумом антивируса он только посмеется.

Но

авторитетные

товар

продать

лаборатории,

надо,

издания

поэтому

и

сайты

проводят различные тесты и выводят рейтинг, проще говоря, ставят оценку антивирусу. Значит, чтобы

продать

как

можно

больше

копий,

требуется высокий рейтинг. Это очень важный момент,

следствие

которого

мы

и

раскроем.

Чтобы антивирус продавался, нужен высокий

рейтинг, а не его реальная эффективность. И что мы получаем в результате? Если Ваша скромная

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

СОДЕРЖАНИЕ

9


ПРО

ПОЧЕМУ СЫР В МЫШЕЛОВКЕ БЕСПЛАТНЫЙ

№8 (ноябрь) 2010

граммист

поделка не дай бог, попытается самостоятельно что-то прописать реестр, да что реестр, если она попытается

распаковаться

из

любительски

созданного инсталлятора, 8 из 10 антивирусов поднимут панику.

Причем еще на стадии компиляции самодельного

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

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

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

веских

перестали

на

то

быть

оснований.

Программы

эффективными,

они

стали

яркими, мультимедийными, но реальной пользы

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

товара. Мой любимый конек – офис от компании Майкрософт. данному любит,

усилия,

а,

Во-первых,

пакету,

а

во-вторых,

чтобы

люди

привыкли

переучиваться

люди

компания

к

никто

не

прикладывает

сохраняли

в

теперь

есть

конверторы,

эволюционировать, начиная с офиса 97-го года выпуска. Все остальные поползновения мне не

принесли никаких новых функций, красивости

тормозят и требуют шустрого компьютера, а новый интерфейс 2007-го откровенно раздражает

(потому им не пользуюсь, а имею конвертер с формата docx http://ru.wikipedia.org/wiki/Office_ Open_XML).

1С.

Периодически

небольших

практически

за

организаций)

соответствует

все,

что

навязывают

огромные

деньги.

(по

8-е

меркам

При

рекомендует

действительности,

этом

либо

либо

не

играет

против потребителя. Это и новая организация работы, и замедление рабочего процесса (новая версия

для

небольшого

числа

с

помощью

старой

версии

программы. Как относительно новая версия она постоянно

обновляется,

модифицируется, что

просто

дополняется

обязано

и

содержать

ошибки (и так оно и есть, 8-ка неоднократно переписывалась практически заново), в тоже

время как старая версия практически полностью отлажена, исправления если и появляются, то не

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

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

устройства),

потребителя

данная

удобна.

но

ситуация

для

конечного

дороже

и

не

3. Программы перестают быть программами телефонами,

холодильники

имеют

функцию

обеспечение обрастает не нужным пользователю функционалом, платить,

не

за

который

намерен.

Все

он

дело

естественно

в

том,

что

экономика, как в отдельных странах, так и в мире в

целом

является

олигопольной,

а не

свободной. А это означает, что экономические

законы, открытые сотни лет назад перестали

работать. И как следствие не спрос рождает предложение, а предложение навязывает спрос.

Вот в мировой практике есть понятия авторское

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

добиться

выхода в чат и т.д. Устройства и программное

они

Теперь сам офис – лично для меня он перестал

бы

нельзя

но

подозреваю, что тоже по этой самой причине).

версии,

Нет ничего такого в работе бухгалтера, чего

Это общая тенденция, телефоны перестают быть

переводят не один в один (да и это невозможно,

хотя

старой версии они не все нужны.

формате

удобном для компании (сначала doc, затем docx). Конечно,

особенно на начальном этапе работы, да и в

компьютеров

требует больше ресурсов), и обучение персонала (если говорят обратное – знайте, врут). Большое

количество новых отчетов только запутывают,

право

и

лицензионный

«программа» программы

отсутствует.

являются

полупрограммами. монополистов

договор,

а

Потому

термин многие

недопрограммами

Опять

Вы

же

или

первенство

когда-нибудь

у

пробовали

решать что-то с помощью встроенной справки прилагаемой уважаемой

Майкрософт?

и

к

операционной

системе

В

с

горячо

любимой

связи

всеми

корпорации этим

в

околокомпьютерном фольклоре появилось целое направление, основанный

на

практически

сообщениях

новый

жанр,

операционных

систем данной фирмы (см. рисунок 1):

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

СОДЕРЖАНИЕ

10


ПРО

ПОЧЕМУ СЫР В МЫШЕЛОВКЕ БЕСПЛАТНЫЙ

№8 (ноябрь) 2010

граммист

Рис. 1. Вариации информационных сообщений от ОС Windows Не думаю, что эта картинная галерея достойна

Пиратские

только они (cм. рисунок 2):

содержащихся в них ошибок. Короче Вы

заявленной

оплаты.

Ну,

конечно

радуют

не

программы

уничтожат

рано

Ваши

сильно

рискуете.

или

поздно

данные

Ну-ну,

вся

из-за

эволюция

Windows есть сплошная борьба с глюками, багами и уязвимостями, а также вечная

установка паков и фиксов. И все это рано

или поздно приводит к жутким тормозам, решить, которые можно только выкинув

старый и купив новый компьютер. А там новая версия поспеет, и круг замкнется

снова… Кроме того, такие заявления палка

о двух концах – уж если Вы говорите о

возможности багов в нелицензионном ПО, то в лицензионном их не должно быть в

принципе. На что обычно тишина, либо предлагают

почитать

пользовательское

соглашение, где «все написано».

В Европах и Америках хорошие люди

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

пиратские

огромное червей

и

прочей

вирусов,

содержат

нечисти,

троянов,

которые

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

и

использовать

лицензионное

программное обеспечение. Никому и ничего я не должен, потому что кредитов на мне нет, и в долг

программы

первое.

обычно

не

себя ведут хорошие люди. Более чем одна треть не

считает

текущее

положение

нормальным, а это большой процент, на котором

программы

количество

в самом начале статьи, наглядно показывает, как населения

4. Сказки от производителей Все

люди? Ну что же, статистика, приведенная

продаются.

Это

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

Вот

Еще

уже

есть

одна

действуют спрос,

причина,

законы

будет

почему

и в

развитых странах пиратства меньше – это более грамотные

законы

и

большая

агрессия

со

стороны рекламы, агитации. Реклама для них

часть культуры – для нас надоедливое жужжание

по телевизору через каждые десять-пятнадцать минут

(хотя

молодое

поддается зомбированию). Вы

гигиены – мойте руки по утрам и не только

только

(антивирусы и брандмауэры в помощь).

рынка

предложение.

Второе – иногда действительно в инсталляторах

встречаются жучки, но это уже из области

здесь

свободного

много

теряете,

поколение

лучше

отказываясь

от

технической поддержки, которая доступна для

лицензионных

версий

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

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

СОДЕРЖАНИЕ

11


ПРО

ПОЧЕМУ СЫР В МЫШЕЛОВКЕ БЕСПЛАТНЫЙ

№8 (ноябрь) 2010

граммист

на сайте технической поддержки от компании

требует лицензию, то она в электронном виде

любой форум по операционным системам даст

только Windows). Серийный номер на упаковке

Microsoft, ох и не советую там никому оказаться, исчерпывающий

рецепт

на

большинство

проблем. Основными преимуществами являются

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

главное

нахваливает. Все

эти

Internet

тщательно

Explorer

никто

подогреваемые

не

легенды

совершенно не способствуют распространению

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

1359.

Действия,

нарушением

не

исключительного

изобретение,

полезную

промышленный образец

являющиеся права

на

модель

или

права на изобретение, полезную модель или промышленный образец:

Пункт 4. Использование изобретения, полезной или

удовлетворения

промышленного личных,

образца

семейных,

для

домашних

или иных не связанных с предпринимательской деятельностью

нужд,

если

целью

такого

использования не является получение прибыли или дохода.

А все лицензионные соглашения регулируются

общими нормами гражданского права. Иными словами

все

домашние

версии

Windows

не

являются нарушением, именно поэтому и гоняют в основном предпринимателей, да и толку с них в рублевом

эквиваленте

побольше

будет.

И

в

отличие от производителей ПО пользователь не стремится

нелегальных

наставить,

программ

как с

несчастного правообладателя.

можно

целью

больше

нагреть

Далее, если вдруг дяденька заявился к Вам, и * Комментарий автора.

Положения гражданского кодекса актуальны на момент написания статьи.

как и различные голографические фенечки и каракули на них лицензией не являются.

Далее, Вы не обязаны хранить упаковку от носителя

программного

продукта.

Иногда

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

«О

лицензировании

деятельности»,

наряду

с

отдельных

законами

видов

местных

областей, автономий и краев к ПО не имеет никакого

домашний

отношения.

пользователь

Так

что,

вроде

чистенький,

но

бы,

есть

Федерации как демократическому государству.

Не являются нарушением исключительного

модели

от носителя с программным продуктом, равно

одна мелочь – все это относится к Российской

5. Юридическая сторона вопроса* Ст.

поставляется с каждой копией Windows (и не

Российская Федерация (как и США впрочем)

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

народа.

выглядеть

так,

Соответственно

выскопоставленное

как

его

лицо

выскопоставленном кресле.

закон

будет

прокомментирует в

не

менее

Пока что бороться за авторские права нужно, потому что правительство хочет вступить во Всемирную торговую организацию (а не потому

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

Вашу вину). Поэтому если на Вас завели дело по нелицензионному использованию программного продукта

в

домашних

условиях,

весьма

желательно обзавестись своим адвокатом, иначе есть

реальные

шансы

схлопотать

немалый

штраф, а то и вовсе угодить на нары. В реальной жизни

встречались

попытки

привлечь

к

ответственности за нелицензионный Ubuntu, так то.

Что касается предпринимателей и коммерческих

организаций – извольте раскошелиться, и я с

этим полностью согласен. Если с программного продукта

получается

прибыль,

будь

любезен,

поделиться ей с автором программы. Вот только пираты ориентируют свою продукцию в основном на домашний компьютер…

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

СОДЕРЖАНИЕ

12


ПРО

6.

ПОЧЕМУ СЫР В МЫШЕЛОВКЕ БЕСПЛАТНЫЙ

№8 (ноябрь) 2010

граммист

Пираты

выгодны

производителям

программного обеспечения Еще

как

выгодны

это

ходячая

реклама.

Практический каждый, у кого есть компьютер, знает о Windows. А о линуксе знают далеко не

все, потому что продавать его не особо удобно, каждый

при

альтернативу

желании

может

бесплатно.

скачать

Учитывая

пункт

5,

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

Internet

За

что

Explorer’a

компания

можно

Microsoft

и

пострадала – Евросоюз посчитал не правомерным

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

Согласно мнениям защитников коммерческого программного

обеспечения

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

попытка

переложить

все

с

больной

головы на здоровую – сами форумы трекеров, как правило, не содержат незаконного контента. Они имеют только информацию о том, где этот самый

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

сети.

предоставляют

Иными

возможность

словами

трекеры

информационного

обмена и не более того. Это все равно, что обвинять

топор

в

убийстве

Раскольниковым

старухи-процентщицы – аналогия очень точная. Кроме

того,

расположении бесплатного

пользователь

трекеры и

софта

хранят

вполне

и

должен

информацию

доступного

программ,

легально

за

о

и

которые

оплатить

производителю его скромный и кропотливый труд.

понятия:

многие

FREEWARE

путают

два

означает

обеспечение,

а

важных

свободное

вовсе

не

бесплатное. И хотя часто это одно и тоже, freeware покупать, совершенно не возбраняется. Здесь

мы

программное

программное

обеспечение

обеспечение

использование,

права

установку

это на

неограниченного

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

т.д.,

которого

авторскими

юридически

правами.

Как

защищены

видите,

это

совершенно не означает, что Вы получаете все эти

прелести

бесплатно.

программное

Многое

обеспечение

свободное

свободно

лишь

отчасти. Например, Вы можете себе позволить все

вышеупомянутое,

получения

прибыли

(не

но

только

только

не

в

для

домашних

условиях). Как только Вы захотите извлечь из программы

прибыль

результаты

(например,

работы

продавать

данной

программы),

Почему

производитель

раздает

свой

труд

бесплатно? Это совершенно очевидно – чтобы получить

прибыль.

Современному

человеку

трудно привыкнуть к тому, что абсолютно все

коммерческие организации преследуют только одну

цель

извлечение

прибыли

из

своей

деятельности, очень уж сильна маркетинговая

составляющая (мы условились писать честно – очень

уж

сильно

остальное

пользователя,

нам

как-то

низкая

пудрят

цена

мозги).

удобство на

Все

работы

программный

продукт или вообще ее полное отсутствие и прочее

все

деятельности совершенно

это

не

побочные

организации.

обязательно

эффекты

При

в

от

этом

денежном

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

прошлых лет подсказывает нам, что браузер Опера стояла на каждом сотом компьютере в

мире (около 30% российских компьютеров в 2009

году, по мнению самих авторов Оперы) и на каждом 10-м телефоне тоже (80% мобильных устройств

в

России,

по

мнению

авторов

рекламная компания, торгующая своим громким

всего,

программное

программное

браузера). Но мало кто знает, что Опера – это

Халява, сэр! Прежде

Свободное

готовьтесь платить лицензионные отчисления.

О трекерах бедных замолвите слово распространения

бесплатное.

рассмотрим

именно

обеспечение,

а

свободное

не

только

именем. акциях

с

устройств

Опера

зарабатывает

и

сотовыми

Apple,

«Безлимитный

на

производителями

Интернет

с

совместных

мобильных

операторами.

Оперой»,

«Опера

Мини теперь и на IPhone» как нельзя лучше

способствует привлечению внимания к новому товару,

или,

например,

к

поддержанию

угасающего интереса к новомодному гаджету.

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

СОДЕРЖАНИЕ

13


ПРО

ПОЧЕМУ СЫР В МЫШЕЛОВКЕ БЕСПЛАТНЫЙ

№8 (ноябрь) 2010

граммист

Списку рекламных акций, в которых принимала

например, некоторые серверные решения. Бери,

любая

да грамотно его настроить может не каждый, а

участие данная компания, может позавидовать IT-фирма,

Потребляя

включая

продукты

и

монополистов.

Опера,

пользователь

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

фирмы-компаньоны

получают

увеличение продаж своих продуктов, а Опера получает

денежные

ассигнации

с

фирм-

компаньонов. Все довольны, все улыбаются.

да пользуйся. Но вот установить серверное ПО, кто это сделает лучше самого создателя? А там и новая

версия

программе. Лишь бы счет был вовремя оплачен.

свободное

они

либо

занимаются

сбором

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

деятельностью.

Этим

грешат

практически все поисковые системы, хоть тот же

Google. Набирая в строке поиска свой запрос, пользователь автоматически получает рекламу (и

не какую-нибудь, а согласно набранной строке, то

есть

скромный Google.

контекстную),

а

статистический

Информация

обывателя,

(рекламщика), Учитывая

маленький.

о

бесценна а

значит,

миллиарды Кроме

также

вносит

вклад

том,

что

на

нее

для

в

интересует

маркетолога

Googl’a,

того,

свой

копилку

есть

спрос.

спрос

Google

не

читает

содержимое Ваших почтовых ящиков на gmail и

не скрывает этого. Цели все те же – выявить предпочтения

пользователей

с

целью

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

программном

класс

заработка**

обеспечении

на

свободном

основан

на

технической поддержке. Так распространяются, ** Комментарий автора.

Существует еще один довольно-таки экзотичный способ заработка на свободном

программном

обеспечении

это

отстаивание

прав

прописанных в лицензии на свободное ПО. Дело в том, что многие

коммерческие фирмы в силу своей жадности не гнушаются нарушать

права пользователей и правообладателей. Согласно большинству лицензий

на

свободное

программное

обеспечение,

если

Вы

использовали фрагмент из программы в своих денежных целях, то

немного

суток готов выслушать все, что Вы думаете об их

обеспечения,

программного

надо

Зато приятный женский голос в любое время

Далее

свободного

тоже

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

Есть фирмы, которые более просты в плане распространения

поспеет,

сопутствующие

товары,

здесь

пользователя обязательно нужно подсадить на и

бесплатное

программное

обеспечение. Пользуйтесь на здоровье. А вот

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

обработки фотографий? Новый набор кистей? Шаблоны для создания неповторимых баннеров?

Не вопрос, но надо немного доплатить. Разброс цен может быть очень большим в зависимости от степени

полезности

дополнения.

Ряд

фирм

совершенно бесплатно готовы предложить Вам свои

дистрибутивы

операционных

систем,

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

ПО,

биллинговые

системы,

специализированное программное обеспечение (что-нибудь

вроде

системы

учета

на

промышленных предприятиях и т.д.). Иногда само

свободное

выступает

в

роли

программное

обеспечение

сопутствующего

товара

например, есть неплохая утилитка для фото- и видеомонтажа,

но

работает

она

только

с

цифровыми видеокамерами Sony, что по задумке должно

камеру.

подтолкнуть

пользователя

купить

Также есть еще один интересный денежный момент. Это благодарность пользователей или donate.

Иногда,

люди

благодарят

авторов

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

соображений.

Дело

это

зависит от многих факторов, и рассчитывать на добровольные

пожертвования

в

качестве

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

основного заработка не стоит, однако, один из

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

время

Однако многие коммерческие софтверные компании основывают работают их программы. Судебные иски же на такие компании приносят алчность

миллионы и

долларов,

желание

переведутся еще не скоро.

благо

бесплатно

человеческая

поэксплуатировать

скупость, других

создателей линукса Линус Торвальдс в свое получил

не

плохие

подношения,

исчисляемые сотнями тысяч долларов. А все потому, что коммерческий Unix обошелся бы

фирмам в разы дороже. Делайте революционный софт, господа!

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

СОДЕРЖАНИЕ

14


ПРО

граммист

ПОЧЕМУ СЫР В МЫШЕЛОВКЕ БЕСПЛАТНЫЙ

№8 (ноябрь) 2010

23 октября 2010 вступил в силу «налог на чистые болванки».

*** Комментарий автора.

фонограмм и аудиовизуальных произведений в личных целях» в

неожиданно,

Постановление «О вознаграждении за свободное воспроизведение

О качестве российских дорог ходят легенды. Зима как всегда придет

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

впервые.

Отчисления

в

пользу

авторов

вышеописанные

произведений,

а

цифровые

камеры,

все

виды

Теперь

и

DVD-плееры

и

так

банкнотами,

банковскими

карточками,

далее.

жетонами,

что

работает

у

интернет-провайдеров

У

экспертов

что

музыку,

На

купивших

мобильный

телефон,

не

совсем

счет

смежным

правам

Ахмеда

понятно.

Тагибова.

несколько дней назад. Так или иначе, по оценкам экспертов, миллионов в год.

Несмотря на то, что явление пиратства по сути

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

пользу.

Да,

крупные компании терпят немалые убытки, но я

совершенно не уверен, что все то, что они потеряли,

было

бы

обложено

налогом,

и

очередь

является

внимания

акцентировать

Анализ

негативное и является отражением некоторых оно

свою

Заключение

странно,

в

Статистика http://www.itbestsellers.ru/news/

правообладатели будут в результате нового закона получать до $200

ни

что

Росохранкультура тянет с ответом, хотя обещала определиться еще

это

фирмы.

на

Ресурсы

два: Российский союз правообладателей Никиты Михалкова и по

коммерческие

пользователя.

разные

поступок, который еще не совершен. Известно, что претендентов общество

пугать

функциональности, что не может не радовать

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

Российское

может

больше

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

искусственной

и пестрых окошек производитель должен все

Ведь мы все слушаем

фильмы.

попытку

гарантом качества. Теперь помимо ярких кнопок

вопрос распределение

смотрим

не

обеспечения,

вызывает

разную

на

здоровой конкуренции на рынке программного

некоторых

средств.

рынка

Свободное программное обеспечение приводит к

собранных

программного

не так велика, она увеличивается из года в год,

условиях». Это значит, что, например, со стоимости сетевого того,

свободного

явления. И хотя на данный момент доля freeware

оборудования, не предназначенного для использования в домашних –

пользе

интересовало, что и привело к возникновению

подпадает. Также исключение сделано, для «профессионального

правообладатели 1% отчислений не получат.

и

длительного времени получал не то, что его

а

также телефонным автоответчикам – эта техника под сборы не

оборудования

халатность

монополизации. Пользователь на протяжении

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

о

реакцией

телевизоры, черно-белые видеомагнитофоны, оптические диски, DVD-диски

элементарные

обеспечения – можно считать это защитной

носителей

информации (не только цифровые, но и аналоговые), цветные флэш-накопители,

есть

покупку хлеба в следующем месяце.

вопросы. В этот список попали компьютеры всех типов, сотовые и телефоны,

факты

каждого евро пенсионер получил себе право на

Однако перечень товаров облагаемой техники у многих вызывает домашние

запастись

от пиратства.

налогом для производителей и импортеров в 1% от стоимости. 40% авторам

успеют

безалаберность, а не отсутствие финансирования в связи с ущербом

издавать хоть какие-то звуки или показывать видео, будет обложена достанется

не

деньги на социальные программы есть и с пиратами. А все

Отныне вся домашняя и персональная техника, которая может

средств

вновь

запас в виде стабилизационного фонда, то есть, говоря проще,

так как не был разработан порядок выплат. И вот теперь он есть.

собранных

города

Однако, кризис показал, что Российская Федерация имела немалый

Гражданским кодексом. Однако до сих пор эта норма не работала,

исполнители и изготовители получат по 30%.

северные

прорванной теплоцентрали. Перечислять можно до бесконечности.

при

воспроизведении музыки в личных целях были предусмотрены

всех

и

топливом для ТЭЦ. Этой зимой опять кто-нибудь получит ожоги из

с

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

detail.php?ID=16719 рынка

свободного

программного

обеспечения http://www.opennet.ru/docs/RUS/ fss_history2 Центр

технической

поддержки

http://support.microsoft.com/?ln=ru

Microsoft

Мнения о переходе на 1С новой версии http://u4t.ru/7vs8.shtml Свободное

программное

обеспечение

http://ru.wikipedia.org/wiki/%D0%A1%D0%B2%

D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D 0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D

0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0

%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0 %B5%D1%81%D0%BF%D0%B5%D1%87%D0% B5%D0%BD%D0%B8%D0%B5

СОДЕРЖАНИЕ

15


ПРО

ЭКСПЛОЙТЫ. АНАЛИЗ СОСТАВА ПРЕСТУПЛЕНИЯ

№8 (ноябрь) 2010

граммист

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

используем

by Sparky ustyugova90@mail.ru

программное

обеспечение

со

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

Введение

Соответственно, при нахождении уязвимости в

Необходимо

отметить,

что

количество

компьютерных преступлений в России растет. По данным Главного информационного центра МВД

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

возможность

использовать

уязвимость массово.

эту

России в 2009 году было совершено 7053 тыс.

В УК РФ существует 28 глава, предполагающая

УК РФ [1].

совершение компьютерных преступлений (272-

правонарушений попадающих под статью 272* В последнее время все большую популярность при

совершении

приобретают

компьютерных

эксплойты.

Это

преступлений

компьютерные

программы, фрагменты программного кода или последовательности

команд,

применяемые

проведения

уязвимости

в

вычислительную

программном

для

систему

[2].

использующие

обеспечении атаки

и

на

Популярность

применения эксплойтов связана с тем, что мы * Статья 272 УК РФ:

1. Неправомерный доступ к охраняемой законом компьютерной информации,

то

есть

информации

на

машинном

носителе,

в

электронно-вычислительной машине (ЭВМ), системе ЭВМ или их сети,

если

это

деяние

повлекло

уничтожение,

блокирование,

модификацию, либо копирование информации, нарушение работы

наступление 274

уголовной

статьи).

ответственности

Сегодня

мы

за

проанализируем

возможность применения статьи 272 УК РФ к компьютерным эксплойты.

преступлениям,

Сначала

нужно

использующим

провести

анализ

состава преступления. Это необходимо, для того чтобы

выявить

общественно

преступления.

признаки,

опасное То

применения

характеризующие

поведение

есть,

статьи

к

о

в

качестве

возможности

конкретному

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

включает

в

себя

следующие

компоненты: объективная сторона, субъективная сторона, объект и субъект.

ЭВМ, системы ЭВМ или их сети, - наказывается штрафом в размере

Состав преступления. Статья 272 УК РФ

размере заработной платы или иного дохода осужденного за период

от двух до пяти месяцев, либо исправительными работами на срок от

Объект преступления: отношения, возникающие

двух лет.

которые

от двухсот до пятисот минимальных размеров оплаты труда или в

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

своего служебного положения, а равно имеющим доступ к ЭВМ, системе ЭВМ или их сети – наказывается штрафом в размере от пятисот до восьмисот минимальных размеров оплаты труда или в

размере заработной платы или иного дохода осужденного за период

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

в

сфере

охраны

компьютерной

регулируются

информационных

ФЗ

«Об

технологиях

информации, информации, и

информации» от 27 июля 2006г № 149-ФЗ.

защите

Объективная сторона преступления: для того, чтобы

сформировать

определение

неправомерного доступа, нужно ответить на ряд

вопросов. Необходимо-ли для признания доступа неправомерным

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

преодоление

некоторых

СОДЕРЖАНИЕ

16


ПРО

ЭКСПЛОЙТЫ. АНАЛИЗ СОСТАВА ПРЕСТУПЛЕНИЯ

№8 (ноябрь) 2010

граммист

преград?

Или неправомерным доступ будет

признаваться

даже

тогда,

когда

информация

«Об

информации

находится на общедоступном компьютере? Согласно

статье

6

информационных информации»,

ФЗ

технологиях

обладатель

и

защите

информации,

если

иное не предусмотрено федеральными законами, вправе разрешать или ограничивать доступ к информации,

определять

порядок

такого доступа.

и

условия

Также из статьи 9 указанного ФЗ следует, что безусловным

характером

пользуется

правовой

информация,

охраны

относящаяся

к

государственной тайне, тайне следствия, личной и

семейной

тайне,

тайне

телефонных

также

персональные

переговоров, переписки, почтовых, телеграфных и

иных

сообщений,

данные

граждан

изобретения,

промышленного

а

и

сведения

полезной образца

до

о

сущности

модели

или

официальной

публикации информации о них.

В результате под неправомерным доступом к

совершившим

данное

преступление

с

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

Особенности

квалификации

предусмотренного

преступления,

статьей

272

УК

РФ,

совершенного группой лиц по предварительному сговору

или

организованной

группой,

отличаются от изложенных в статье 35 УК РФ. Субъективная

сторона

не

преступления:

характеризуется виной в форме прямого умысла. Косвенный умысел и неосторожная форма вины

могут иметь место по отношению к наступлению вредных последствий неправомерного доступа. Также

необходимо

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

к

отметить

момент

осуществление

информации,

уничтожение,

модификацию,

копирование

либо

важное

окончания

неправомерного

повлекшего

нарушение

ее

блокирование,

работы

ЭВМ

(систем ЭВМ, их сети). Если этого не произошло, преступление считается не оконченным.

компьютерной информации – следует понимать

Экспойты. Есть-ли примеры?

информации

Эксплойт (англ. exploit, эксплуатировать) – это

несанкционированное

собственником

ознакомление

лица

с

данными,

содержащимися на машинных носителях или в ЭВМ,

и

имеющих

соответствии

уровень

защиты

в

с законодательством РФ. Кроме

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

законом

неправомерность

доступа

установленного

порядка

характеризуется

еще

информации.

Если

информации,

согласие

порядок

доступа

к

ней

и

потребителя

нарушением

доступа

нарушен

к

информации, к

установленный

охраняемой ее

этой

законом

собственника

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

элементами

не

объективной

стороны данного состава являются последствия: удаление,

копирование

модификация,

информации,

ЭВМ (систем ЭВМ, их сетей).

блокирование

нарушение

и

работы

Субъект преступления: вменяемое физическое

лицо, достигшее 16-летнего возраста. Частью 2 статьи

272

преступления

УК

РФ

установлено

специальным

совершение

субъектом,

компьютерная программного команд,

кода

программа, или

фрагмент

последовательность

использующие

уязвимости

в

программном обеспечении и применяемые для

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

над системой (повышение привилегий), так и нарушение [1].

ее

Приведем

функционирования

пример

(DoS-атака)

двух

эксплойтов,

использование которых отлично иллюстрирует

возможность применения данной статьи УК РФ к компьютерным

преступлениям,

1.

приводящий

эксплойты.

Эксплойт,

памяти,

в

сознательно

браузере

помещен

к

Mozilla

использующим

повреждению Firefox

владельцем

домена

был

на

сайт. Пользователь, используя Mozilla Firefox, зашел на данную web-страницу, что привело к нарушению работы браузера. Субъект, объект и субъективная

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

сторона

данного

действия

СОДЕРЖАНИЕ

17


ПРО

ЭКСПЛОЙТЫ. АНАЛИЗ СОСТАВА ПРЕСТУПЛЕНИЯ

№8 (ноябрь) 2010

граммист

соответствует субъекту, объекту и субъективной

действие

Объективная

действие приводит к модификации информации,

стороне состава преступления статьи 272 УК РФ. соответствует

сторона

данного

объективной

действия

стороне

не

состава

преступления статьи 272 УК РФ. Хотя действия данного эксплойта приводят к: •

блокированию

информации

(действия

данного эксплойта привели к ограничению и временному

закрытию

доступа

к

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

информационным

ресурсам,

так

как

выполнение данного эксплойта приводит к •

программ,

баз

Выводы Проанализировав ряд экспойтов можно сделать следующие выводы: •

Данный

произошло

эксплойт

не

нарушение

данных

производит

никаких

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

будут

другим

проникать

как •

запущены

приготовление

копированию, блокированию информации и нарушению работы ЭВМ (систем ЭВМ, их сети).

квалифицировано,

Субъект,

используя

SQL-инъекцию,

умышленно получил доступ к паролю и e-mail другого

пользователя,

затем

произвел

модификацию данной информации с целью ее дальнейшего использования.

используются попадающее

преступление,

эксплойты,

под

необходимо

как

статью

отметить,

что

не

стороной состава преступления статьи 272 УК

РФ. Объективная сторона данного действия будет совпадать

с

объективной

стороной,

так

как

собственник информации, а именно владелец данного

интернет

магазина,

разграничил

доступ к информации о пользователях, а именно информацию об их паролях и e-mail, то данное

преступление, УК

если

РФ.

Но

эксплойт

охраняются

законом,

то

применение

эксплойта не попадает под статью 272 УК РФ.

действия

быть

находящимися в открытом доступе и эти данные

совпадает с объектом, субъектом и субъективной

данного

котором

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

Библиографический список

сторона

в

может

272

Как и в предыдущем случае, объект, субъект и субъективная

совершению

осуществляющей неправомерный доступ к

управлением БД.

Следовательно,

эксплойт является вредоносной программой,

Следовательно,

этой

компьютере

к

преступления.

2. Пользователь имеет интернет-магазин. Данные

Собственник

на

приводящие к модификации, уничтожению,

правонарушение,

MySQL.

в

того, он производят определенные действия,

попадающее под статью 272 УК РФ.

СУБД

К

информации, хранящейся на ЭВМ. Кроме

вытекает, что данное действие не может быть

разграничил доступ к данным, хранящимся в

ЭВМ.

описанных

использование эксплойта можно расценивать

состава преступления статьи 272 УК РФ. Из этого

о продажах и клиентах хранятся в БД под

шлюзом,

вредоносным

в

последствий

пострадавшего.

действия не соответствует объективной стороне как

лишь

программы, которые при помощи эксплойта

ЭВМ. Соответственно объектная сторона данного

квалифицировано

позволяющим

всего

статье 272 УК РФ приведут уже вредоносные

работы

действий по ознакомлению лица с данными,

является

наступлению

ситуации, так как после выполнения данного браузера).

эксплойт

программам

действительно имеет место быть в данной эксплойта

как

находящуюся на материальном носителе.

нарушению работы ЭВМ (нарушение работы отдельных

квалифицированно

а именно внесение изменений в базу данных,

блокированию работы браузера); как

будет

неправомерный доступ к информации. Данное

Статистика компьютерных преступлений в России

http://www.securitylab.ru/news/213781.php • •

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

07/06/10 Exploit

security)

Classification/Shellcode

06/06/2010

(computer

http://inj3ct0r.com/exploits/10991

Богомолов М.В. Уголовная ответственность за

СОДЕРЖАНИЕ

18


ПРО

граммист

ЭКСПЛОЙТЫ. АНАЛИЗ СОСТАВА ПРЕСТУПЛЕНИЯ

№8 (ноябрь) 2010

неправомерный доступ к охраняемой законом компьютерной информации http://pu.boom.ru/ •

book/index.html#soder 06/06/2010

Мосин О.В. Компьютерная преступность в России.

Как

с

ней

бороться?

http://zhurnal.lib.ru/o/oleg_w_m/cdocumentsand

несанкционированного •

01/05/10

Федеральный закон от 27 июля 2006 г. № 149ФЗ.

ответственности за преступления в сфере компьютерной

• • • •

http://www.lawmix.ru/comm/4715 04/06/2010

Сайт Федеральная служба по техническому и экспортному

• • •

контролю

(ФСТЭК

России)

Уголовного

права

http://www.fstec.ru 07/06/10 Словарь-справочник

http://www.info-law.ru 20/05/10 Конституция 06/05/10

Доктрина

Российской

РФ

http://www.constitution.ru

информационной

Президентом •

информации

безопасности

Федерации,

утвержденная

Российской

Федерации

сентября 2000 г. № Пр-189 ГОСТ

Р

50922-2006.

Защита

9

информации.

Основные термины и определения.

Закон Российской Федерации от 05.03.1992 № 2446-1. О безопасности

Рекомендации по стандартизации Р 50.1.056 – 2005

Техническая

защита

информации.

Основные термины и определения Руководящий положение

по

документ.

организации

Временное

разработки,

изготовления и эксплуатации программных и

технических средств защиты информации от несанкционированного

доступа

в

вычислительной

Гостехкомиссия

автоматизированных системах и средствах •

России, 1992

Руководящий

документ.

несанкционированного информации.

техники.

Термины

Защита

и

информации,

информационных

** Комментарий редакции. Европейский

союз

намерен

ужесточить

меры

по

борьбе

с

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

инициативе Еврокомиссии вне закона будет объявлена разработка, использование

и

хранение

вредоносного ПО. В странах ЕС

будут

введены

новые,

более строгие наказания за киберпреступления и любую деятельность, связана

с

шпионских

нанесением

которая

использованием программ

или

повреждений

компьютерным сетям.

По словам комиссара ЕС по внутренним делам Сесилии Мальмстрем (Cecilia

Malmstrom),

законодательный

Европа

подход

к

должна

разработать

киберпреступлениям,

единый

так

как

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

слишком мягкими наказаниями. «Мы намерены усложнить судебное преследование, законопроект

-

сообщила

отличается

она.

Внесенный

новыми

на

рассмотрение

предложениями

для

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

важных

объектов

инфраструктуры

от

хакерских

нападений. Так, она напомнила о самых значительных кибератаках

последних двух лет, в результате которых во Франции были экстренно посажены истребители, в Германии выведены из строя военные

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

предложение

Еврокомиссии

попадет

на

рассмотрение

Европейским парламентом и властями стран-участниц ЕС.

от

к

определения.

Гостехкомиссия России, 1992

Руководящий документ. Концепция защиты средств

вычислительной

автоматизированных

несанкционированного •

доступа

Об

технологиях и о защите и информации

upnostxwrossiirtf.shtml 07/06/2010

Российское законодательство об уголовной

к

Уголовный кодекс РФ http://www.ug-kodeks.ru

settingsolegmoidokumentykompxjuternajaprest •

доступа

информации. Гостехкомиссия России, 1992

техники

систем

доступа

информации. Гостехкомиссия России, 1992 Руководящий

вычислительной

документ. техники.

несанкционированного

и

от

к

Средства

Защита

доступа

от

к

информации. Показатели защищенности от

ПРАВОВЫЕ ВОПРОСЫ ИСПОЛЬЗОВАНИЯ ПО

СОДЕРЖАНИЕ

19


ПРО

ИНТЕРФЕЙС. ЧАСТЬ 3

№8 (ноябрь) 2010

граммист

Здравствуй, уважаемый читатель. Я очень долго собирался сесть за написание продолжения поднятой мною темы в прошлых номерах – «интерфейс». Размышляя, как бы продолжить рассказ, я даже и не думал, что пользователи сайта www.programmesforum.ru сделают мне неожиданный подарок и сами подскажут развитие темы. Дам тебе ссылку на ветку форума, в которой затронутая ранее мною тема была поднята для обсуждения http://www.programmersforum.ru/showthread.php? t=113167. Пользователи форума подарили мне тему для статьи, за что я их благодарю и начну свой рассказ... Александр Демьяненко

практически

by Grenles GRENLES@yandex.ru

в

двух

словах,

можно

уровня

кнопки

«Shift».

В

ширине и чуть больше 5 мм по высоте. Кнопки

озаглавить

тему

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

ширине

реальном измерении – это около 10 мм по

Функциональность и удобство использования Так,

по

развития,

перед

ним

встает вопрос: «Как сделать программу удобной

«для детей и девушек», потому что людям с

толстыми пальцами и мужчинам очень сложно

точно попасть по кнопке, не зацепив соседа. Бесспорно, – ноутбук создан для мобильности и

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

для использования и в то же время сделать легкодоступными

все

функции

программы?».

Практически решить эту задачу во все времена было

сложно.

И

вот

почему.

В

любой

современной программе реализованных функций

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

искать

компромисс

между

«важными» и «второстепенными» функциями и их отображением пользователю.

Рис. 1. Клавиатура ноутбка

Так вышло, что сама жизнь дала мне несколько

Для сравнения, приведу пример более удачного,

функциональности.

уменьшена (по сути, она и не нужна особо

примеров,

где

дизайн Я

даже

оказался поймал

выше

себя

на

мысли, что я уподобился сатирику Михаилу

Задорнову и стал искать вокруг себя «ошибки» дизайна

и

удобства

использования.

Приведу

найденные мною «ошибки», где дизайн оказался выше функциональности и удобства работы…

Ноутбук. Что может быть проще, мобильнее и

на мой взгляд, решения. Здесь кнопка «Shift» большой – не так уж часто ею пользуются, да и

всегда есть «левый» сосед). Благодаря этому

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

функциональнее? Его покупают в наше время

почти так же часто, как и микроволновые печи. И это нормально. По воле обстоятельств, мне пришлось

настраивать

один

ноутбук.

К

быстродействию и качеству картинки претензий у

меня

нет,

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

однако

работы

две

маленькие

вещи

подпортили

клавиши

управления

с

такой

техникой.

курсором буквально через пару минут работы

начали раздражать меня. Взгляните на рисунок 1:

четыре

кнопки

умудрились

разместить

практически по высоте одной кнопки «Ctrl» и

ОТДЕЛ ТЕСТИРОВАНИЯ

Рис. 2. Удачное расположение клавиш на клавиатуре ноутбука

СОДЕРЖАНИЕ

20


ПРО

ИНТЕРФЕЙС. ЧАСТЬ 3

№8 (ноябрь) 2010

граммист

Что тут сказать? Данные решения делаем не мы,

режим и обратно.

или иное решение – сказать сложно. Ясно одно –

Опять вопрос к разработчикам: «...почему так?».

начинка внутренностей ноутбука горчит ложкой

кнопка включения расположена либо в центре

а производители техники. Почему выбрано то

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

или

начинка.

Бывают

и

совпадения,

когда выбор уже стоит за толщиной кошелька. Еще

одна,

выплыла

весьма

при

специфическая,

использовании

проблема

клавиши

«Esc».

Казалось бы, – а тут что такого? Но, взгляните на фотографию, а

я попробую объяснить.

Сколько я видел ноутбуков, в большинстве своем ноутбука

над

функциональными

клавишами,

либо справой стороны (такое решение более удобное и логично). Я привел рисунок, где кнопки включения и навигации расположены справой

стороны,

но

тут

кроется

другой

подводный камень – уже очень близко кнопка

«del» (см. рисунок 4):

Над

кнопкой «Esc» расположена кнопка выключения ноутбука,

которая

еще,

по

совместительству,

является кнопкой перехода в ждущий режим (см. рисунок 3):

Рис. 3. Кнопка ESC Красота… почти. Я

Рис. 4. Кнопка выключения

работал с Windows

Раз уж я начал разговор о «кнопках» внешних

ки»

еще пару примеров разных решений размещения

7. Внешней «мышу

меня

не

было, а работать с ее

аналогом

ноутбуке

на

устройств и их функциональности, то приведу важных кнопок (см. рисунок 5):

мне

показалось

мед-

неудобным.

Поль-

ленным и ужасно зуясь тачпадом, я

обнаружил такую специфическую особенность

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

решил, что лучше перейду на клавиатуру, чем

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

скоростью,

пытаясь

попасть

указателем в нужный элемент. Итак, я работал с

окнами Windows 7 и, выходом «назад» было

Рис. 5. Передняя панель. Кнопка питания

нажатие «Esc». Не могу назвать себя особо

Самая главная кнопка

клавишами,

Самая главная кнопка включения компьютера –

аккуратным и метким товарищем при работе с клавиатуре. Попасть

в

особенно

маленькую

на

слегка

кнопку,

измененной

не

глядя

на

клавиатуру, сложно, поэтому я раз пять попадал в

кнопку

выключения

и

радостно

ждал

окончания процесса перехода ноутбука в спящий

ОТДЕЛ ТЕСТИРОВАНИЯ

это кнопка включения питания. Обычно она делается

самой

большой

кнопкой

и

это

правильно. Чаще всего системные блоки стоят под столом и чем больше кнопка, тем проще ее

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

СОДЕРЖАНИЕ

21


ПРО

ИНТЕРФЕЙС. ЧАСТЬ 3

№8 (ноябрь) 2010

граммист

нажимать

эту

кнопку

ногой

и

попадают.

Насколько это правильно, – не знаю, но решение сделать главную кнопку большой – правильное.

Но! Есть еще одна, тоже важная кнопка, хотя и

используемая реже – «Reset». Она позволяет мгновенно забыв

вызвать

обо

всем,

перезагрузку

что

компьютера,

происходило

до

обратную

операцию

оказывается

гораздо

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

даже

не

пальцем,

а

ногтем,

чтобы

закрыть лоток дисковода (см. рисунок 6):

этого

момента. Не часто, но эту кнопку приходиться

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

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

корпус черные кнопки) – кнопка «Reset» чуть

меньше «главной» кнопки, но тем не менее она сделана выпуклой с рельефной поверхностью и

нажимать ее тоже удобно (даже ногой), мало того,

она

расположена

значительно

ниже

главной кнопки. Это удобно, так как нажатия

Рис. 6. Вставляем диск

корпус белая контурная кнопка) главная кнопка

Конечно, можно программно вызвать закрытие

«Reset» этого не скажешь. Кроме того «Reset»

Commander», нажав на букву диска. Странно,

кнопок не спутаешь. На втором рисунке (черный

очень большая и это хорошо, а вот про кнопку

еще выполнена утопленной и весьма маленькой, чтобы ее нажать (проверено практически) надо

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

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

в

расположение

первом

случае

кнопок.

производители

решили, что пользователю решать: когда и зачем

ему нажимать сброс и это должно быть удобно, а вот

во

втором

производители нажатия

этой

случае,

решили

кнопки,

очень

усложнить

чтобы

похоже, задачу

пользователь

лишний раз подумал, – надо ли это ему.

лотка

дисковода,

например,

в

«Total

почему подобной операции нет в стандартном проводнике Windows, – вместо этого выдается сообщение «Вставьте диск в дисковод Х»? В

итоге, закрыть лоток не так просто, кнопка закрыта, попасть по ней сложно. Приходится искать

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

никакого

классический самый

мошенничества.

пример

стильный

и

Возможно,

(белый

дисковод),

модный,

зато

не

он

функционально более удобен – по крайне мере, кнопку закрывает лишь сам лоток и, чтобы заставить

его

заехать

назад,

надо

попасть

пальцами в кнопку ниже лотка, что гораздо проще первого варианта (см. рисунок 7):

Рис. 7. Удобное

расположение

Диски, ах эти диски…

кнопки на CD-

И, завершая тему внешних кнопок и удобства*

ROM-е

работы с ними, приведу еще один пример. Все мы

Что же ска-зать

вынимая их из дисковода. И вновь, сначала

как пользовате-

дисковод черного цвета. Конечно, это стильно и

ной

работаем

с

лазерными

дисками,

вставляя

и

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

начать работу с диском. Заставить выехать диск просто – нажимаем кнопку и все. А вот сделать

ОТДЕЛ ТЕСТИРОВАНИЯ

в

итоге?

лям

Нам,

электронтехники,

продают вещи и вместе с ними

готовые

реше-

СОДЕРЖАНИЕ

22


ПРО

ИНТЕРФЕЙС. ЧАСТЬ 3

№8 (ноябрь) 2010

граммист

возникло такое желание, а программа не

* Комментарий автора.

Как показывает мой опыт, удобной вещь могут сделать те, кто чаще

с нею работает. Дизайнер может сделать вещь красивой, и он действительно

это

сделает,

так

как

имеет

представления

о

и специфике использования вещи.

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

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

функционально.

утверждение

тоже

не

Но

и

всегда

обратное

верно.

90% пользователей предпочитают известные бренды, совершенно не зная аналогов или не видя необходимости их искать, считая, – чем

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

ответила его потребностям);

• •

известнее имя, тем лучше; 99%

всегда

будут

возмущаться

или

испытывать стресс, если им приходится от чего–то отвыкать или переучиваться;

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

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

Производители тоже люди и они имеют свои

Посткриптум

в дизайне. О, если бы это было только так, – нет

Таких псевдонаучных фактов можно приводить

дизайнеров, чтобы сделать вещь более красивой,

их нужно знать и учитывать при разработке

предпочтения и пристрастия, которые выражают же!

Производители

зовут

и

нанимают

и те делают ее таковой.

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

Мудрые дизайнеры делают

надо представлять перед

вещь еще и удобной, а не

собой

просто красивой штучкой. К

сожалению,

не

всем

и

удобную

вещь.

Это

программ, вещей

и

а

касается не

не

техники,

и

с

пользователей

возможностей

используют

известных

им

5–10%

программ,

потому что больше им не надо, или они не

знают о других возможностях, или они просто •

не знают, что им надо еще; 85%

пользователей

никогда

не

читают**

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

полный

Пользователь

обычный

среднестатистический

компьютер

и

это

гражданин,

который знает ответ на вопросы: «что такое для

чего

он

нужен?».

Умеет

анализировать и делать выводы на тему «что к чему?». Пользователь – это НЕ программист, а человек

из

другой

сферы

человеческой

деятельности и именно с этой точки зрения он

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

всего удобного и умного помощника в решении своих задач, а не очередной источник проблем.

не видят в этом необходимости, используя

Вот таким получился сегодняшний рассказ про

что такая документация есть;

надеюсь, интереснее.

метод «научного тыка», или просто не знают •

что

ошибочно.

подтвержденные статистически: 80–90%

думать,

чайник или «лузер», – это

Итак, факты, почти проверенные, но не всегда •

стоит

пользователь

только

которыми мы работаем.

и

точки зрения. Но, вовсе

удается сделать красивую утверждение

пользователя

думать о продукте с его

55% всегда недовольны тем, как сделана

программа и тем, что она работает не так, как

интерфейс. В следующий раз будет больше, и,

они того от нее ожидают (при этом не факт,

** Комментарий редакции.

текстовый редактор не обязательно должен

эксплуатации выполнены отвратительно, просто для галочки, чтобы

что программа должна это делать! Например проигрывать музыку, но у пользователя вдруг

ОТДЕЛ ТЕСТИРОВАНИЯ

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

СОДЕРЖАНИЕ

23


ПРО

WINAPI ГРАФИКА. PANIC BUTTON

№8 (ноябрь) 2010

граммист

Здравствуйте, уважаемые читатели журнала «ПРОграммист» от Клуба ПРОграммистов. Прочитав данную статью, Вы получите представление о навыках создания «чистых» WinAPI приложений и управления графикой в бесплатной среде разработки Lazarus... Алексей Шишкин

Давайте

by Alex Cones http://flsoft.ru

решим

эту

проблему,

хотим,

чтобы

она

ела

много

памяти

WinAPI.

Ситуация первая. Итак, давайте представим две

3. Состав: яблочное пюре, сахар...

несколько

Что нам потребуется для данной задумки:

ситуации,

улучшить

и

процессорного времени – сотворим ее на чистом

1. Что и для чего... жизненные

создав

собственную кнопку «Panic». Но так, как мы не

которые наше

помогут

нам

виртуальное

пространство, в котором мы живем (см. рисунок 1):

GNU ObjectPascal IDE «Lazarus» [1];

Изображение кнопки.

Лично я использую изображение из коллекции

своей панели быстрого запуска [2] (см. рисунок Рис. 1. Именно здесь мы и проводим жизнь Вообразим себе рабочее место ИТ-сотрудника. Теперь представим себя на его месте. Работа работой, но, иногда, так хочется отвлечься. Руки

2):

Рис. 2. Используйте изображение

нужных размеров, но не забудьте, что оно должно иметь формат bmp

сами собой тянутся к аське. Да не к той, что

Запустим Lazarus. Как обычно он предложит нам

пятнадцать, с нехорошим предчувствием слышим

Зайдем в [Проект] → [Убрать из проекта...] и

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

Ситуация вторая. А теперь вообразим себе детскую комнату – стол и компьютер, в котором

создать

новый

проект,

уберем

из

проекта

ручки двери...

uses

Звук

поворачиваемой

необходимо

срочно

очистить

рабочий стол, свернув все окна. Для этого, как Вы

знаете,

существует

кнопка

на

панели

быстрого запуска, под обыденным названием

«свернуть все окна». Но, есть две проблемы: • •

{$mode objfpc}{$H+}

cthreads,

Думаю, Вы уже уловили сходство ситуаций. В случаях

Теперь,

{$IFDEF UNIX}{$IFDEF UseCThreads}

2. Приготовимся к старту обоих

unit1.pas.

unit.

[Вид] → [Модули...]: program Project1;

сайты.

новый

избавившись от формы, откроем файл проекта

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

откроем

она имеет очень малые размеры;

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

ОТДЕЛ ТЕСТИРОВАНИЯ

{$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset Forms, LResources;

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF} begin {$I project1.lrs} Application.Initialize; Application.Run; end.

СОДЕРЖАНИЕ

24


ПРО

WINAPI ГРАФИКА. PANIC BUTTON

№8 (ноябрь) 2010

граммист

Теперь закроем окно редактирования unit1, так как он нам не понадобится и мы его исключили из проекта. А теперь приведем <project1.lpr> в следующий вид:

Handle

Bitmap : HbitMap;

{$mode objfpc}{$H+}

// Текстура // Битмап (обратите внимание // не TBitMap а HBitMap)

Width

Uses Windows;

: LongInt;

// Ширина текстуры

Height : LongInt;

// Высота текстуры

End;

Begin

TBuffer = Record

End.

этих

нехитрых

манипуляций

создадим

новый юнит: [Файл] → [Создать юнит]. И удалим у

него все модули из секции Uses. После этого кнопку «Сохранить все». Сохраним модуль как UNTForm, а сам проект как pncbtn. 4. Создание

// Буфер вывода

DC

: HDC;

// Контекст буфера

Tex

: TTexture;

// Текстура буфера

End;

TWarehouse = Record

подключим к нему модуль Windows. Нажмем на

// Склад текстур (полезно иметь)

Buffer : TBuffer;

// Буфер

Button

// Кнопка

: TTexture;

End;

Теперь опишем необходимые переменные:

Итак, приступим к самой программе. Для этого в

секции Type юнита UNTForm опишем следующие типы:

Var

Application : TApplication; // Зачем? А так удобнее!

Type

TImage = Record

// Изображение на форме

Handle : HWND;

// Хендл изображения

DC

// Контекст устройства

: HDC;

End;

TForm

// Хендл приложения

End;

TTexture = Record

Program Project1;

После

: HWND;

Form : Tform;

// Форма

Warehouse : TWarehouse;

// Склад

Настало время заняться изображением кнопки: я возьму изображение 64 х 64 и помещу его в папку

с

проектом

«Button.bmp». =

Record

// Форма // Хендл формы

Теперь

программы

займемся

с

самим

именем кодом

программы (данный код располагается в юните UNTForm):

Handle

: HWND;

Left

: Integer;

// Этой процедурой мы будем выводить буфер на экран

Top

: Integer;

Procedure DrawB;

Width

: Integer;

Begin

Height

: Integer;

Image

: TImage;

// Для нашего ур-я знаний – это самый быстрый способ рисования // Изображение

BitBlt(Form.Image.DC,

End;

0, 0, 800, 600, Warehouse.Buffer.DC, 0, 0, SRCCOPY); End;

TApplication = Record

// Приложение

WinClass : TWndClass; // Класс приложения

// Этой процедурой мы будем рисовать текстуру на буфере

MSG

Procedure Draw(Var T : TTexture; X,Y : Integer);

: TMSG;

// Сообщение для отработки

ОТДЕЛ ТЕСТИРОВАНИЯ

СОДЕРЖАНИЕ

25


ПРО

граммист

WINAPI ГРАФИКА. PANIC BUTTON

№8 (ноябрь) 2010

Var Loc : HDC;

CreateWindowEx(0, 'TpanicForm’, '',

Begin

WS_POPUP,

// Оно будет без бордюра и

// Создадим контекст

// невидимо

Loc := CreateCompatibleDC(Warehouse.Buffer.DC);

Form.Left,

// Его отступ слева

// Применим его к текстуре

Form.Top,

// Его отступ справа

SelectObject(Loc, T.Bitmap);

Form.Width,

// Его ширина

// Нарисуем его на буфере

Form.Height, // его высота

BitBlt(Warehouse.Buffer.DC,

0, 0,

X, Y, T.Width, T.Height, Loc, 0, 0, SRCCOPY);

Application.Handle, Nil);

// Освободим контекст DeleteDC(Loc);

Form.Image.Handle :=

End;

CreateWindow('Static', '' ,// Создадим изображение на форме // (TImage в VCL)

// Эта процедура позволит нам определить размеры

WS_CHILD Or SS_BITMAP Or

Procedure VirtualDraw(Var Source : Ttexture);

WS_VISIBLE, // Оно видимое

Var Bit : BitMap; // изображения, которое в нее загружено

0, 0,

Begin

Form.Width,

// Размеры по размерам формы

// Получим всю информацию о изображении

Form.Height,

GetObject(Source.Bitmap, SizeOf(Bit), @Bit);

Form.Handle, // Родителем укажем форму

// Запомним высоту

0,

Source.Height := Bit.bmHeight;

Application.Handle, Nil);

// Запомним ширину

SetClassLong(Form.Handle, GCL_HBRBACKGROUND,

Source.Width := Bit.bmWidth;

CreateSolidBrush($FF00FF));

End; // Закрасим фон формы розовым цветом – он будет прозрачным // Эта процедура грузит битмап из файла

SetWindowLong(Form.Handle,

Procedure LoadHB(FileName : PChar; Var Tex : Ttexture);

GWL_EXSTYLE,

Begin

GetWindowLong(Form.Handle,

Tex.Bitmap := LoadImage(GetModuleHandle(Nil), FileName,

GWL_EXSTYLE) Or WS_EX_LAYERED Or

IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

WS_EX_TOOLWINDOW);

VirtualDraw(Tex); // Узнаем параметры текстуры End;

В

// Предыдущей командой мы убрали кнопку с панели задач и дали

секции

процедуры:

Interface

разместим

следующие

// ему право иметь прозрачные цвета SetLayeredWindowAttributes(Form.Handle, $FF00FF, 0,

Procedure DrawB;

LWA_COLORKEY); // прозрачный цвет

Procedure Draw(Var T : TTexture; X,Y : Integer);

// розовый ($BBGGRR)

Procedure LoadHB(FileName : PChar; Var Tex : Ttexture);

Итак,

процедуры

работы

с

графикой

мы

написали. Теперь напишем процедуры создания и обслуживания формы: Procedure CreateMainWindow;

// Создадим контекст изображения Form.Image.DC := GetDC(Form.Image.Handle); // И создадим контекст буфера

// Создадим главное окно

Begin Form.Handle :=

ОТДЕЛ ТЕСТИРОВАНИЯ

Warehouse.Buffer.DC := CreateCompatibleDC(Form.Image.DC); Warehouse.Buffer.Tex.Bitmap := CreateCompatibleBitmap(Form.Image.DC, // Создадим буфер

СОДЕРЖАНИЕ

26


ПРО

граммист

WINAPI ГРАФИКА. PANIC BUTTON

№8 (ноябрь) 2010

Form.Width, // размеры = размерам form

Procedure RegisterApp; // Регистрация приложения в системе

Form.Height);

Begin

VirtualDraw(Warehouse.Buffer.Tex);

// «Виртуально» нарисуем

Application.Handle := GetModuleHandle(nil);

// буфер, узнаем размеры

With Application.WinClass do Begin

// Применим текстуру буфера к нему

Style := CS_HREDRAW Or CS_VREDRAW; // Даем приложению право

SelectObject(Warehouse.Buffer.DC, Warehouse.Buffer.Tex.Bitmap); End;

// прозрачности и отрисовки lpfnWndProc

:= @WindowProc;

// Задаем обработчик формы

hInstance

:= Application.Handle;

Procedure MoveOnTop; // Переместим форму поверх всех окон

hbrBackground := COLOR_BTNFACE + 1;

Begin

lpszClassName := 'TPanicForm';

SetWindowPos(Form.Handle,

hCursor

:= LoadCursor(0, IDC_ARROW);

HWND_TOPMOST,

End;

Form.Left,

// процедура нужна для управления контролами Windows

Form.Top,

InitCommonControls;

Form.Width,

RegisterClass(Application.WinClass); // Зарегистрируем

Form.Height,

End;

SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOSIZE); End;

Procedure ShutDown; // Выключение приложения Begin

// Чтобы свернуть все окна просто эмулируем сокращение Win + D

// Уничтожим таймер

Procedure HideAll;

KillTimer(0, TimerVar);

Begin

// Уничтожим контекст буфера

Keybd_event(VK_LWIN,0,0,0);

// Нажали Win

DeleteDC(Warehouse.Buffer.DC);

Keybd_event(VK_D ,0,0,0);

// Нажали D

// Уничтожим контекст изображения

Keybd_event(VK_D ,0,KEYEVENTF_KEYUP,0);

// Отпустили D

DeleteDC(Form.Image.DC);

Keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0); // Отпустили Win End;

// Удалим класс из системы UnRegisterClass('TPanicForm', Application.Handle); // И самоуничтожимся

Procedure TimerProc(hwnd : HWND; uMsg, idEvent : UINT; dwTime : DWORD); StdCall; // Таймер

End;

Begin Draw(Warehouse.Button, 0, 0); // Нарисуем кнопку на буфере DrawB;

// Нарисуем буфер на экране

End;

LongInt): LongInt; StdCall;

// Обработчик

Begin Result := DefWindowProc(Hand, Mess, wParam, lParam); Case Mess Of : ShutDown;

WM_LBUTTONDOWN : HideAll; WM_PAINT

Не забудьте, что процедуры работы с окном

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

Function WindowProc(Hand, Mess :LongWord; wParam, lParam:

WM_DESTROY

ExitProcess(Application.Handle);

// При уничтожении уничтожимся // При нажатии – свернем все

: MoveOnTop; // При отрисовке – перенесем вверх

End; End;

ОТДЕЛ ТЕСТИРОВАНИЯ

функцию

InitCommonControls

ведь в модуле Windows ее нет.

Procedure InitCommonControls; External 'comctl32.dll' Name 'InitCommonControls';

Так

же

поместим

описания функций:

в

Interface

следующие

Procedure CreateMainWindow; Procedure TimerProc(hwnd : HWND; uMsg, idEvent : UINT; dwTime : DWORD); StdCall; Procedure RegisterApp;

СОДЕРЖАНИЕ

27


ПРО

№8 (ноябрь) 2010

граммист

WINAPI ГРАФИКА. PANIC BUTTON

Теперь опишем переменную:

Настало время поработать с файлом pncbtn.lpr!

TimerVar : UINT;

program pncbtn;

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

uses Windows,

5. Плошки и плюшки

UNTForm; // Подключим наш модуль

Все-таки, просто создав окно кнопки, мы кое-что упускаем

где

будет

располагаться

окно?

Давайте подумаем: лучшее место над кнопкой

«Пуск». Как рассчитать координаты? Да очень

просто! Для этого возьмем разрешение экрана

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

(см. рисунок 3). Итак, создадим необходимую процедуру:

Procedure CalculatePos; // Расчет вертикальной позиции Var

R

: Rect;

H

: Handle;

W

: Integer;

{$mode objfpc}{$H+}

begin // Загрузим изображение LoadHB(PChar('button.bmp'), Warehouse.Button); // Возьмем размеры формы равные размерам изображения Form.Width := Warehouse.Button.Width; Form.Height := Warehouse.Button.Height; Form.Left := 0;

// Форма располагается слева

CalculatePos;

// Рассчитаем координаты

RegisterApp;

// Зарегистрируем приложение

CreateMainWindow; // Создадим окно // И покажем нашу кнопку на экране ShowWindow(Form.Handle, SW_SHOW);

// Создадим таймер для отрисовки

PH : Integer;

TimerVar := SetTimer(0, 0, 1000, @TimerProc);

Begin // Простое получение высоты экрана W := GetSystemMetrics(SM_CYSCREEN); // На всякий случай уберем мусор из R ZeroMemory(@R, SizeOf(R));

// 1000 – это интервал обновления таймера (мс), // чем он меньше – тем чаще он будет выполняться // Нам хватит и раза в секунду

// Теперь запустим цикл сбора сообщений

// Найдем хендл панели задач H := FindWindow('Shell_TrayWnd', Nil); // Получим размеры панели

While (GetMessage(Application.MSG, 0, 0, 0)) do Begin TranslateMessage(Application.MSG);

GetWindowRect(H, R);

DispatchMessage(Application.MSG);

// вычислим высоту

End;

PH := R.Bottom - R.Top; // И применим нашу «волшебную» формулу Form.Top := W - PH - Form.Height; End;

Не забудем ее экспортировать:

end.

7. Завершающий штрих Что

ж,

осталось

следующую

6. Заполнение проекта

один

маленький

штрих перед компиляцией – это обеспечить выключение

Procedure CalculatePos;

совершить

ShutDown.

кнопки. строку:

Добавим

в

WindowProc

WM_RBUTTONDOWN

:

Рис. 3. Формула расчета вертикальной позиции

ОТДЕЛ ТЕСТИРОВАНИЯ

СОДЕРЖАНИЕ

28


ПРО

граммист

WINAPI ГРАФИКА. PANIC BUTTON

№8 (ноябрь) 2010

Рис. 4. Нехило, учитывая, что оно написано на

Рис. 5. Почти прекрасно, но чего-то не хватает

чистом WinAPI

8. Свойства проекта

Вот теперь идеально. Думаю, что лучше теперь

Скомпилируем и запустим проект. Лично у меня он

запустился

и

прекрасно

исполняет

свои

сможет сделать только мастер ассемблера (см. рисунок

6).

Теперь

добавим

кнопку

в

функции – враг не пройдет. А если пройдет, то

ничего не увидит :) Но, кое-что мы упустили... Зайдите в папку с проектом и посмотрите на размер приложения (см. рисунок 4). Пройдем в

[Проект] → [Параметры проекта...]. Там удалим

из проекта иконку. И уберем галки с «Создавать

application bundle» и «Создавать Manifest файл». Так же уберем галки с «Главный модуль имеет Application.Title и Application.CreateForm». Пройдем

в

компилятора...].

[Проект] Там

выставим

[Параметры

следующие

параметры (возле каждого параметра в скобках стоит его обозначение): // Умное связывание

-O3

// Уровень оптимизации

-Ou

// Ненадежные оптимизации

-Os

// Приоритет размера над скоростью

-gl

// Показывать номера строк при компиляции с ошибками

-Xs

// Вырезать символы из исполняемого файла

-Xg

// Убирать отладочную информацию

-XX

// Умное связывание

-WG

// Графическое приложение

приложение

Заключение

(см.

Все! Теперь вас будет проблематично захватить

если Вы выполнили всю работу и сидите без поля, посматривайте – вдруг позади затаился шеф!

рисунок

5).

его на приложение со следующими параметрами:

ОТДЕЛ ТЕСТИРОВАНИЯ

врасплох. Но помните, главное – мера. Даже, дела, раскладывая пасьянс или удаляя шарики с

Почти идеально. Берем в руки UPX и натравляем --ultra-brute

автозагрузку – положим ярлык на нее в папку [Все программы] → [Автозапуск].

-CX

Скомпилируем

Рис. 6. Само совершенство

Ресурсы •

GNU

ObjectPascal

Коллекция

IDE

«Lazarus»

http://sourceforge.net/projects/lazarus/files авторской

запуска http://squary.ru

панели

быстрого

СОДЕРЖАНИЕ

29


ПРО

WMI. WЛАДЕНИЕ MАГИЧЕСКОЙ IНФОРМАЦИЕЙ. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

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

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

by Stilet www.programmersforum.ru

мы эту информацию и запрашиваем. Ну, а раз

/ Посвящается моему другу,

сисадмину, Вадиму Фареннику /

это база данных, согласитесь, было бы просто замечательно, если-бы работа с ней велась на

языке, привычном для многих (если не всех) СУБД – SQL.

Как бы не ругали Виндоус – это все таки могучая

Читаем дальше. Опа! Угадали. То-ли мы верно

полной

удобство…

операционная система, и если уметь владеть ей в мере,

она

настроенного

(из-за

станет

надежнее

незнания)

плохо

Линукса,

к

примеру. Я веду к тому, что в винде уже встроены

механизмы

удаленного

администрирования. Например, это «Удаленный

рабочий стол». Не Радмин, но уже неплохо – стандартный. А мы сегодня поговорим о другом

механизме. О механизме, позволяющем пройтись

по операционке аки по таблицам базы данных – это WMI…

почему

это,

что

самая она

технология.

может?

Что

Заглянем

это, в

Википедию [1]. Это инструментарий управления

Виндоусом. Уже обнадеживает. Три эти слова подразумевают

любом

случае,

для

получения

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

пользователем программы непосредственно во время работы самой программы.

или иной доступ к таблицам и объектам базы

Итак, предлагаю начать с того момента, где эта

В

информации используется язык запросов WQL,

Отличненько. По логике, в SQL описывается тот

Мы начинаем КВН упоминается

догадались, то-ли Микрософт просчитал заранее

возможность

контроля

за

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

данных, но в случае с СУБД программисту известно о том,

к каким объектам в БД у него

либо

программист

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

сам

знает,

какими

финтами обладает его база данных. Как же быть

в случае с WMI? Кто скажет: какова структура

таблиц? Ой, пардон, речь-то шла о классах… какова структура классов WMI и вообще, что они из себя представляют?

Читаем дальше: «WMI* представляет собой набор

Вот эту информацию можно почерпнуть в MSDN

открывает

с MSDN-ом, могут набрать в хелпе в поиске WMI,

классов, содержащих свойства, доступ к которым операционной установках».

информацию системе,

Особенную

динамическому

их

изменению

о

компьютере,

параметрах

важность этой

и

уделили

информации,

поэтому доступ к ней происходит посредством запросов. Получается, что Виндовс выступает в

ЛАБОРАТОРИЯ

[2]. Кстати, счастливые обладатели Visual Studio

* Комментарий редакции. lshw

в

линуксе.

Также

в

большинстве

дистрибутивов

можно

пользоваться данными из каталога /sys Для этого достаточно обычных sh-скриптов.

СОДЕРЖАНИЕ

30


ПРО

и

WMI. WЛАДЕНИЕ MАГИЧЕСКОЙ IНФОРМАЦИЕЙ. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

получить

ту

же

информацию.

Ну,

предположим, у нас нет такого хелпа (хотя я лично для себя запасся им), и нам придется

напрягать Интернет. Ничего. Не так сложно

выйдя по ссылке [2], попасть на одну из ветвей, описывающих все это благо, с названием «WMI Service Management Classes», а уж на ней можно выйти на WMI Classes, где собственно описаны все классы, которые можно получить запросом**.

Ну, да ладно. Билл им судья. Я на всякий случай приведу ссылку, по которой точнее можно выйти на список классов [3]. Не знаю, что с ней случится через год-два, но на момент написания статьи она была актуальна.

Давайте посмотрим, что за информацию нам предлагает

Микрософт…

430

классов.…

Не

кисло. Такое впечатление, что о системе, о ее

состоянии на момент запроса можно узнать всевсе.

Это

хорошо.

администратора

Такая

иногда

ценной.

информация

для

оказывается

очень

Ладно. Что может эта загогулина мы теперь знаем. А как получить эти самые классы? То есть объекты, или что там у них… интерфейсы? Вот

тут

немного

придется

мыслить

неравномерно. Думаю, многим привычно, что указатели на объекты возвращают конструкторы

класса. Однако, в случае с WMI это не совсем

так. Здесь бал правит особый провайдер (все-таки получение

информации

взаимодействия

с

происходит

операционкой

через

путем

язык

запросом, а стало быть, должен быть «черный ящичек», WBEM.

обрабатывающий

Механизм

этот

эти

запросы)

представляет

СОМ

сервер, который можно использовать в своих программах,

предварительно

инстанцию.

Это

делается

заполучив

его

стандартными

методами загрузки СОМ сервера. Например, в Делфи

это

функция

CreateOleObject,

которая

** Комментарий автора.

Уточню, указатели на которых WQL. Вообще поиск на MSDN гнилой, и постоянно выводит не туда куда надо. Поначалу если

набрать WMI в поиске полезет документация о MS SQL, и ничего нормального

кроме

Микрософтовцы

любят

нее.

Никакой

нагнать

пурги

конкретики.

поверх

растений,

поискали, понимаешь ли, подснежники под снегом…

ЛАБОРАТОРИЯ

Впрочем, чтоб

*** Комментарий автора.

Кто работает в Си с интерфейсами знает, кто не знает, поясню – это класс,

возвращающий

динамического

указатель

списка.

После

чего

на

очередной

нужно

вызвать

элемент метод

перемещения на следующий элемент списка, и так до конца этого динамического списка.

вызывает ole32.dll,

и

CoCreateInstance возвращает

провайдер, от которого, запрос,

классы.

можно

из

библиотеки

указатель

на

объект-

скормив ему WQL

получить

указатели

на

WMI

Его механизм открывает набор-энумератор***. Таким

образом,

проходя

в

цикле

по

динамическому списку, получаем указатели на

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

WMI, как плоскую таблицу, где имена свойств – это имена полей, а их содержимое… нет, не

записи, а запись. Один экземпляр класса – одна

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

перечисляет

список

объектов,

запрошенного класса, а второй перечисляет поля объекта с информацией.

Что еще нужно знать о WMI? То, что эта технология

позволяет

не

только

получать

информацию о системе, но и вызывать команды управления

системой.

То

есть

классы,

полученные энумерацией, имеют методы, вызов

которых приведет к выполнению на целевой машине неких, подлежащих ему действий. Не думайте,

что

я

описался,

назвав

локальный

компьютер целевым. WMI позволяет проводить все эти операции с любым хостом Windows в

сети, лишь бы имелись административные права на подключение к целевой машине.

Итак, пора написать программку, которая будет нашим телескопом в локальной сети. Show must go on… Ради интереса, предлагаю небольшой холивар. Да, да... Вот такой вот я нехороший провокатор.

Предлагаю написать программу на двух языках – Делфи и Си. В качестве компиляторов я взял Delphi 6 (на мой взгляд, самая лучшая версия

Делфи) и Visual Studio 2010. Не потому, что

СОДЕРЖАНИЕ

31


ПРО

WMI. WЛАДЕНИЕ MАГИЧЕСКОЙ IНФОРМАЦИЕЙ. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

VS2008 или VS6 хуже, а просто у меня нет их под рукой.

procedure SetSQL2(const Value: String);

Для начала давайте определимся со стратегией.

procedure SetPassword(const Value: String);

procedure SetLogin(const Value: String);

Чтобы получить набор данных от WMI нам нужно

Public

следующее:

//************************************** // Функция для циклов. Выдает номер последней записи

запустить СОМ сервер, провайдер WMI.

приконнектить его к целевой машине;

// Функция поиска записи по имени поля

пройтись

//**************************************

• • •

точнее, WbemLocator – это имя провайдера; заставить его выполнить запрос; энумератором

записей;

по

А

Function HighObject:Integer;

Function Find(AFieldName,AValue:String):TWMIRecord;

коллекции

// Свойство, получающее по номеру запись из набора

пройтись энумератором по коллекции полей

Property Item[i:Variant]:TWMIRecord read GetItem; default;

каждой записи.

Constructor Create(AOwner:TComponent); Destructor Free;

Мы, кстати, реализуем механизмы получения

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

главным.

Для

этого

Первый Его

предлагаю

назовем

выделить

TWMI.

задача

принять

Он

published

два

// Свойства Логина и пароля. Чтоб подключится к компьютеру и

будет

// получить информацию нужны привилегии администратора

запрос,

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

Property Login:String read FLogin write SetLogin;

типа

// Имя машины к которой подключаемся

перебрав его записи, создать список объектов TWMIRecord.

отвечать

за

Этот

получение

второй

данных

класс из

Property Password:String read FPassword write SetPassword;

будет

полей

Property Host:String read FHost write SetHost;

переданной ему записи (записи передаются в

// Путь к таблице с данными

виде объекта) либо по имени, либо по номеру

Property Root:String read FRoot write SetRoot;

поля. Опять таки и тут без энумерации не

// Свойство, принимающее строку запроса

обойтись

Ладушки.

// и инициализирующее его выполнение

Начнем.

Сначала

опишем

класс. Листинг 1 и 2 показывает, как он может выглядеть в Делфи и Си. Листинг 1 (Делфи): TWMI=class(TComponent)

Property SQL:String read FSQL2 write SetSQL2;

главный

end; //******************************************

Листинг 2 (С++): class TWMI

private

{

// Список объектов-записей

private:

FRecords:TObjectList;

// Обьект-провайдер, через который можно будет приконнектится

FSQL: String;

// к компьютеру

FRoot: String;

IWbemLocator *loc;

FHost: String;

// обьект, которому будем скармливать запрос, и получать

FSQL2: String;

// записи

FLogin: String;

IWbemServices *serv;

FPassword: String;

// поле, хранящее наш запрос

procedure SetHost(const Value: String);

string FQuery;

procedure SetRoot(const Value: String);

// энумератор записей

function GetItem(i: Variant): TWMIRecord;

IEnumWbemClassObject* enum_Record;

ЛАБОРАТОРИЯ

СОДЕРЖАНИЕ

32


ПРО

граммист

WMI. WЛАДЕНИЕ MАГИЧЕСКОЙ IНФОРМАЦИЕЙ. ЧАСТЬ 1

№8 (ноябрь) 2010

// список, который будет хранить объекты-записи

inherited;

list<TWMIRecord> RecList;

FRecords:=TObjectList.Create;

// функция, активирующая запуск провайдера

FHost:='.';

bool RunLocatorInstance();

FRoot:='root\cimv2'; end;

// функция, активирующая подключение к хосту bool ConnectToWBEM(); // процедура, создающая новыйй обьект-запись

destructor TWMI.Free;

// в ходе энумерации

begin FRecords.Free;FRecords:=nil;

void CreaRecord(IWbemClassObject *O);

end;

public: TWMI(void);

Листинг 5 (на Си):

~TWMI(void); // Функция, открывающая набор данных // по переданному ей запросу

TWMI::TWMI(void)

bool SetQuery(string wql);

{

// Функция, получающая запись по ее номеру TWMIRecord* Item(int i);

loc=NULL;

};

CoInitialize(0);

На всякий случай хочу сказать, что для Сишного кода нужны инструкции. Листинг 3:

}

TWMI::~TWMI(void) {

#pragma once

CoUninitialize();

#pragma comment(lib, "wbemuuid.lib")

RecList.clear();

#include <comdef.h>

}

#include <WbemIdl.h> #include "TWMIRecord.h"

Здесь

#include <string>

хедер,

который

стоит

класс, отвечающий за получение и хранение

полей записи, переданной ему. Все остальное – стандартный набор. Я не буду их описывать, ибо их описание вполне можно найти на MSDN или в хелпе.

описать

конструкторы

и

деструкторы главных классов. Листинг 4 (на Делфи):

constructor TWMI.Create(AOwner: TComponent);

ЛАБОРАТОРИЯ

и

в

случае

с

Си

конструкторе)

и

случае с Делфи, инициализация будет не здесь, а

описать – TWMIRecord.h. Он описывает наш

begin

свойства,

Инициализируются

сбрасывается (в деструкторе) СОМ библиотека. В

единственный

можно

интересного.

инициализируется

using namespace std;

Теперь

мало

главные

#include <list>

Здесь

serv=NULL;

в коде обработки запроса. На всякий случай, чтоб

не

было

недомолвок,

скажу,

что

обработчики свойств Login, Password, Host, Root

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

полю

класса,

отвечающему

за

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

на

эти

свойства

и

нажмите

CTRL+SHIFT+C – будут созданы стандартные тела обработчиков – именно их я и имею ввиду. Самое

главное

обработки

для

этого

запроса.

сконцентрирована

вся

класса

Именно

магия

работы

метод с

здесь

WMI.

СОДЕРЖАНИЕ

33


ПРО

граммист

№8 (ноябрь) 2010

WMI. WЛАДЕНИЕ MАГИЧЕСКОЙ IНФОРМАЦИЕЙ. ЧАСТЬ 1

Давайте посмотрим, как она выглядит в листинге 6 (на Делфи):

// Если присоединение прошло успешно то можно // скармливать запрос if not VarIsClear(objWMIService) then begin

//****************************************** procedure TWMI.SetSQL2(const Value: String);

// Скормим запрос WQL нашему провайдеру

var

Records:=objWMIService.ExecQuery(FSQL2,'WQL',0,id);

// Переменная провайдер. подключается к хосту, // Через нее будем получать объект для обработки запросов

// Он вернет объект записей. Ну если конечно вернет

objSWbemLocator,

if not VarIsClear(Records) then begin

// Переменная объекта обработки запросов

//**************************************

// Ей будем скармливать запрос и ее же

// В случае когда все удачно, инициализируем

// энумератором будем получать записи

// энумератор для прохода по записям

objWMIService,

// Список Записей

// Сервисные переменные. Нужны для

Enum:= IEnumVariant(IUnknown(Records._NewEnum));

// получения энумераторов Records,o1,o2: OleVariant;

// Приготовим список для наполнения объектами,

i:Cardinal;

// обрабатывающими переданные им записи

// Интерфейс, который будет являться посредником

FRecords.Clear;

// между провайдером и объектом запросов id:IDispatch;

// и пройдемся энумератором, пока он

// Энумератор для прохода по записям

// не достигнет конца коллекции записей

Enum:IEnumVariant;

// или точнее пока очередная запись выбрана успешно

// Переменная класса, который будет обрабатывать

while (Enum.Next(1, o1, i) = S_OK) do begin

// переданную ему запись

// Создадим объект - запись

r:TWMIRecord;

r:=TWMIRecord.Create; // внеся его в список

begin

FRecords.Add(r);

FSQL2 := Value;

// И заставим его пройтись по полям,

// инициализируем СОМ модель

// переданной ему записи

CoInitialize(0);

r.Enum(o1); end;

// Получаем объект провайдера WMI, Локатор, если говорить

//**************************************

// по микрософтовски

// после чего приберем мусор. Набор мы уже получили

objSWbemLocator:=

// так что можно отключаться

CreateOleObject('WbemScripting.SWbemLocator');

Records:=Unassigned; end;

// Если он успешно получен, то можно далее с ним работать if not VarIsClear(objSWbemLocator) then begin

objWMIService:=Unassigned;

// Присоединяемся к хосту, получив интерфейс для

end;

// отработки запросов objWMIService:= objSWbemLocator.ConnectServer(Host, Root, FLogin, FPassword, '','',0,id;

ЛАБОРАТОРИЯ

objSWbemLocator:=Unassigned; end; // и освободить ресурсы СОМ машины CoUninitialize; end;

СОДЕРЖАНИЕ

34


ПРО

№8 (ноябрь) 2010

граммист

Добавлю,

что

у

WMI. WЛАДЕНИЕ MАГИЧЕСКОЙ IНФОРМАЦИЕЙ. ЧАСТЬ 1

класса

TWMIRecord

предусмотрен метод Enum, которому передается

ULONG uReturn = 0;

полям, получая из них значения. Листинг 7

// приготовим список, хранящий

объект записи. Он инициализирует проход по

hres=S_OK;

(теперь в С++):

// объекты записей RecList.clear(); // и прокатимся по энумератору

bool TWMI::SetQuery(string wql){

while(enum_Record){ // Переменная для результатов СОМ механизмов // получим очередную запись

HRESULT hres;

hres=enum_Record->Next( // результат выполнения запроса.

// указав что мы будем ждать до

// он будет подаваться на выход метода, дабы

// последнего,

// программист знал, отработал ли метод успешно

// выбирается запись

// или не отработал

WBEM_INFINITE,

bool res=false;

// проходя по одной записи за

пока

на сервере

// итерацию, 1, // Если Локатор запустился нормально

// передавая ее в переменную

if(RunLocatorInstance()){

// вышеописанную нами для этого &Obj,

// И присоединился к хосту

// и получая ответ "сколько

if(ConnectToWBEM()){

// записей пройдено", короче 1

// Можно скармливать провайдеру

&uReturn);

// запрос, не забыв преобразовать типы :)

// Если же всетки мы достигли

hres=serv->ExecQuery(bstr_t("WQL"),

// конца набора, вернется 0

bstr_t(wql.c_str()),

// пройденных записей. Придется

WBEM_FLAG_FORWARD_ONLY |

// прервать цикл

WBEM_FLAG_RETURN_IMMEDIATELY,

if( uReturn==0) break;

NULL,

// А пока записи прибывают будем

&enum_Record);

// составлять на них опись, // протокол, сдал-принял...

// Если запрос скормлен, и провайдер отработал его

// отпечатки пальцев :)

// правильно можно идти далее. Предидущей функцией

CreaRecord(Obj);

// был получен энумератор записей, который

}

// позволит сделать проход по ним // по прошествии цикла будем считать что функция

if(!FAILED(hres)){

// успешно отработала, соот-но вернем позитивный ответ // Обьявим переменную - запись. В нее на итерации

res=true;

// будет подаваться очередная запись

}

IWbemClassObject *Obj;

// и освободим нашего провайдера и его сервис

// и переменную, в которую будет

serv->Release();

// подаваться сколько записей

}

// выбрано. На итерациях это

loc->Release();

// значение будет равно 1,

}

// ведь мы будет проходить по

return res;

// каждой записи :)

ЛАБОРАТОРИЯ

};

СОДЕРЖАНИЕ

35


ПРО

Здесь

WMI. WЛАДЕНИЕ MАГИЧЕСКОЙ IНФОРМАЦИЕЙ. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

применены

Листинг 8:

методы,

описанные

выше.

принципе,

Создается русски,

здесь

пояснять

инстанция

особо

провайдера,

запускается

для

механизм

bool TWMI::RunLocatorInstance(){

нашей

WMI

нечего.

говоря

по-

программы (аналог

CreateOleObject('WbemScripting.SWbemLocator'),

HRESULT hres;

примененной

bool rt=false;

происходит

hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER, IID_IWbemLocator,(LPVOID *)&loc);

мной

в

подключение

Делфи к

варианте)

хосту,

и

учитывая

логин и пароль пользователя. Если логин и

пароль отсутствуют, берется аккаунт текущего сеанса. Если уж по правде-то, текущий контекст

if(!FAILED(hres)){ hres =

В

безопасности, т.е. с чьими правами запущена

CoInitializeSecurity(

программа.

NULL, -1,

// COM authentication

NULL,

// Authentication services

NULL,

// Reserved

RPC_C_AUTHN_LEVEL_DEFAULT,

// Default authentication

RPC_C_IMP_LEVEL_IMPERSONATE,// Default Impersonation NULL,

// Authentication info

EOAC_NONE,

// Additional capabilities

NULL

// Reserved

); rt=(!FAILED(hres))?true:false; }

Будем

рассчитываем,

что

администратор

что

запуск

это

всея

будет

сети.

Если

запускать

отсутствует

указание хоста – подключение идет к нашей машинке.

Почему я выделил в Сишном классе эти функции подключения отдельно? Захотелось так. Мне

показалось, что слишком много в Си писанины, и я

не

хотел

загромождать

метод

запроса

лишним

кодом,

это

функции

как-то

срослись

в

обработки

бы

выглядело

некрасиво. Казалось бы сложным. На Делфи эти сожалению,

return rt;

считать,

программы будет от текущего сеанса. Мы ведь

в

Си

мне

две

не

строчки,

удалось

так

к

же

аккуратно написать их, может потому, что я

}

плохо

знаю

Си,

или

потому

что

HRESULT hres; BSTR bUser=NULL,bPassword=NULL; BSTR bHost=L"ROOT\\CIMV2"; if(Host!=""){ bHost=L"\\\\"+_bstr_t(Host.c_str())+L"\\ROOT\\CIMV2"; } hres=loc->ConnectServer(

интерфейсами... Да и работа со строками в Делфи попрозрачнее будет...

Впрочем, это не важно. Ну и сюда же следует приписать

реализацию

процедуры,

создания

класса для обработки записи. Листинг 9: void TWMI::CreaRecord(IWbemClassObject *O){

bHost, // Хост с веткой WMI

// создаем новый объект, скормив ему

// User name. NULL = current user

// переданную строку

(Login!="")?_bstr_t(Login.c_str()):bUser,

TWMIRecord *r=new TWMIRecord(O);

//

// Помещаем его в список строк

User password. NULL = current

(Password!="")?_bstr_t(Password.c_str()):bPassword, 0,

// Locale. NULL indicates current

NULL,

// Security flags.

0,

// Authority (e.g. Kerberos)

0,

// Context object

&serv);

// pointer to IWbemServices proxy

return (!FAILED(hres))?true:false;

ЛАБОРАТОРИЯ

Делфи

действительно удобнее описывать работу с СОМ

bool TWMI::ConnectToWBEM(){

};

в

RecList.push_back(*r); };

Энумерация

по

полям

записи

будет

инициирована конструктором. Опять таки, в Си я

описал создание класса в отдельную процедуру

не по каким-то особым причинам, а потому что просто так захотелось. Запросто эти две строчки можно поместить в энумерацию SetQuery.

СОДЕРЖАНИЕ

36


ПРО

Так,

WMI. WЛАДЕНИЕ MАГИЧЕСКОЙ IНФОРМАЦИЕЙ. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

набор

нему.

краткую. Учеников это часто путает, появляется

объектов TWMIRecord. Надо же как-то получать

форму инструкции в каких короткую». Ответ-то

Теперь

получили.

нужен

Прокатились

механизм,

проходя

по

по

списку

выбранные данные. Посмотрим, как это можно сделать в листинге 10 (на Делфи):

вопросы на

«В

самом

каких

деле

случаях

прост

формы

по

рукам

нужно

проехаться

этим

сами мало понимают в программировании. Это

большая беда всей нашей системы обучения, но,

begin Result:=nil;

увы... законы подлости диктуют свою игру.

if VarIsOrdinal(i) then // Если переданный номер записи не

Продолжение следует...

// вылезает за рамки списка // получим ее

The Чтиво

if (i>=0)and(i<FRecords.Count) then

Result:=TWMIRecord(FRecords[i]);

end;

Эта функция повешена на свойство: Property Item[i:Variant]:TWMIRecord read GetItem; default;

Делфи,

могу

заверить,

что

возможность объявлять свойство для класса по умолчанию

две

борзописцам – преподавателям. Сразу видно, они

var ii:integer;

зная

эти

длинную

равнозначны. Кто как хочет, пусть так и пишет. Линейкой

function TWMI.GetItem;

Хорошо

писать

очень

полезно.

Достаточно

в

Ресурс вики http://ru.wikipedia.org/wiki/WMI

MSDN http://social.msdn.microsoft.com/Search/ ru-RU?query=WMI&ac=8

MSDN. Win32 Classes http://msdn.microsoft.

com/en-us/library/aa394084%28v=VS.85%29 .aspx

Марк

Русинович.

Management 2000

Interface.

Внутри

Windows

Magazine/RE,

05,

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

оно

вызовется,

так

как

программист руками его вызвал в коде. Например, Listbox.

У

многим

него

есть

известен

свойство

строки]. Вызывают его так:

будто

Дельфийский

Items[номер

ListBox.Items[такой-то] Это дает строку по указанному номеру. Но далеко не все знают, что при написании такого на самом деле Делфи воспринимает это указание

как ListBox.Items.Strings[такая-то], потому, что Strings описана, как свойство по умолчанию для

поля Items, да еще и с указанием индексации. Согласитесь, удобнее не писать Items.Strings, раз среда позволяет это. Код становится короче и красивее.

скором времени мы получим мощнейший

Кстати некоторые нерадивые авторы методичек на этом деле спекулируют. В одних методичках длинную

продолжает

активно развивать WMI, и в

Post Scriptum

пишут

Microsoft

форму

ЛАБОРАТОРИЯ

обращения,

в

других

области

которого

обширны…

инструмент,

применения

очень

и

очень

СОДЕРЖАНИЕ

37


ПРО

РАБОТА С NETLINK В LINUX. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

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

компонент ядра, с которым пользователь может

by Oleg Kutkov elenbert@gmail.com Итак,

Netlink

представляет

из

общаться посредством обычных сокетов. Для

работы с netlink существует особое семейство себя

особый

компонент Linux ядра. С ним можно общаться через обычный сокет передавая и принимая сообщения,

сформированные

Что же дает нам netlink?

особым

образом.

(название

изменившегося

интерфейса и что именно произошло), таблиц • • • • •

маршрутизации, файрволла;

управлять всеми таблицами маршрутизации;

управлять параметрами сетевых интерфейсов; управлять параметрами файрволла; управлять ARP таблицей; реализовать

взаимодействие

со

модулем в ядре.

своим

Кроме этого Netlink позволяет нам отказаться от устаревшего

унифицировать

вызова код,

ioctl,

так

сокета

как

упростить все

и

операции

выполняются посредством стандартного сокета.

netlink-a

является

средствами.

iproute2,

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

наиболее

ценным

источником можно считать две статьи в Linux

journal и Doxygen- документацию. В этой статье я постараюсь

приподнять

завесу

рассказать как можно больше.

тайны

и

Архитектура Netlink Как уже говорилось выше, Netlink – это особый

ЛАБОРАТОРИЯ

Тип или

доставку

это

диаграммным

сделать

и

сообщений, всеми

хоть

не

и

доступными

поток байт, содержащий один или несколько заголовков,

представленных

структурой

nlmsghdr, а так же связанных с ними данными, которые

называются

«полезной

нагрузкой»

(playload). Сообщение, во время доставки, может быть разбито на несколько частей. В таких

случаях каждый следующий пакет помечается флагом

NLM_F_MULTI,

целый

набор

а

последний

флагом

NLMSG_DONE. Для разбора сообщений имеется заголовочном

макросов,

определенный

файле

netlink.h.

что

существует

Там

определено все прочее, связанное с Netlink.

реализует*

администрирования

сокета.

SOCK_RAW

Каждое сообщение netlink представляет собой

утилита

пришедшая на смену утилитам ifconfig, route и

нового

выбирать

необходимо

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

Надо

надежность. Именно Netlink использует мощная

создании

его

SOCK_DGRAM, для протокола, в данном случае,

Гарантируется быстрая работа кода и его общая

английском.

при

AF_NETLINK,

следует

старается

получать уведомления об изменении сетевых интерфейсов

указывать

гарантирует

С помощью Netlink мы можем: •

протоколов

сказать,

в

же

отдельная

библиотека для работы с netlink – libnl. Она netlink

особый

сокетами

и

методов.

уровень

абстракции

предоставляет

над

множество

Создание сокета netlink * Комментарий автора.

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

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

изменений

и

в

приложениях,

использующих

эту

библиотеку. Я один раз напоролся на такой сюрприз, поэтому мы

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

СОДЕРЖАНИЕ

38


ПРО

граммист

РАБОТА С NETLINK В LINUX. ЧАСТЬ 1

№8 (ноябрь) 2010

Объявление netlink сокета выглядит так: socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);

SOCK_RAW – тип сокета,

NETLINK_ROUTE – семейство Netlink протокола. зависимости от того, что мы именно хотим интересные

Netlink.

параметры

Приведем

наиболее

(полный

список

параметров можно посмотреть в документации): •

NETLINK_ROUTE – получать уведомления об изменениях сетевых

таблицы

маршрутизации

интерфейсов

использоваться

(так

для

же

изменения

и

может всех

параметров вышеперечисленных объектов);

__u16 nlmsg_type;

// тип содержимого сообщ-я (об этом ниже)

__u32 nlmsg_seq;

// порядковый номер сообщения

__u32 nlmsg_pid;

// идентификатор процесса (PID), // отославшего сообщение

};

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

// размер сообщения, с учетом заголовка

__u16 nlmsg_flags; // различные флаги сообщения

Где: AF_NETLINK – протокол Netlink,

получить

__u32 nlmsg_len;

NETLINK_USERSOCK – зарезервировано для

Поле nlmsg_type может указывать на один из стандартных типов сообщений: •

NLMSG_NOOP

NLMSG_ERROR – сообщение с ошибкой, и в

NETLINK_FIREWALL – служит для передачи IPv4

пакетов

из

сетевого

пользовательский уровень; NETLINK_INET_DIAG

сокетов;

фильтра

мониторинг

на

NLMSG_DONE – сообщение с этим флагом

должно завершать сообщение, разбитое на

Структура nlmsgerr:

inet

struct nlmsgerr { int error;

от системы Selinux;

NETLINK_NETFILTER – работа с подсистемой сетевого фильтра;

NETLINK_KOBJECT_UEVENT сообщений ядра.

получение

// отрицательное значение кода ошибки

struct nlmsghdr msg; // заголовок сообщ-я, связ-го с ошибкой

NETLINK_SELINUX – получать уведомления

типа

несколько частей.

фильтра;

такого

nlmsgerr (о ней чуть ниже);

NETLINK_NFLOG – ULOG сетевого/пакетного

сообщения

секции полезных данных будет структура

определения пользовательских протоколов;

игнорируются;

};

Сообщения могут быть одного или нескольких (различные

типы

объеденяются

операции логического или – |) типов:

с

помощью

Далее созданные сокет можно использовать для

NLM_F_REQUEST – сообщение, запрос чего

функции send и приема сообщений с помощью

NLM_F_MULTI – сообщение, часть сообщения

отправки сообщений, с помощью стандартной recvmsg.

Сообщения Netlink Как уже выше сообщалось – каждое netlink

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

Заголовок

структурой nlmsghdr: struct nlmsghdr {

ЛАБОРАТОРИЯ

сообщения

представлен

• • • •

либо;

разбитого на части; NLM_F_ACK

NLM_F_ECHO

подтверждения;

сообщение, эхо

запрос,

запрос обычное

направление – запросы из уровня ядра на пользовательский уровень; NLM_F_ROOT возвращает сущности;

некую

NLM_F_MATCH

данный

таблицу,

запрос

найденные соответствия;

тип

запроса

внутри

некой

возвращает

все

NLM_F_ATOMIC – возвращает атомарный срез некой таблицы;

СОДЕРЖАНИЕ

39


ПРО

NLM_F_DUMP

РАБОТА С NETLINK В LINUX. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

NLM_F_MATCH.

аналог

NLM_F_ROOT

|

NLM_F_REPLACE – заменить существующий

NLM_F_EXCL

не

заменять,

объект уже существует;

если

такой

NLM_F_CREATE – создать объект, если он не существует;

NLM_F_APPEND – добавить объект в список к уже существующему.

Для идентификации клиентов (на уровне ядра и на

пользовательском

уровне)

существует

специальная адресная структура – nladdr:

{

// маска групп получателей/отправителей

};

nl_pid

это

уникальный

адрес

сокета.

Для

маску

следует

группы,

которую

Различные

группы

могут

быть

Основные группы определены в заголовочном файле netlink. Пример некоторых из них: •

RTMGRP_LINK уведомления интерфейсах

• •

об

эта

группа

изменениях

в

(интерфейс

добавился, опустился, поднялся);

получает сетевых

удалился,

RTMGRP_IPV4_IFADDR – эта группа получает уведомления об изменениях в IPv4 адресах (адрес

удален);

был

добавлен

или

RTMGRP_IPV6_IFADDR – эта группа получает уведомления об изменениях в IPv6 адресах интерфейсов

клиентов в ядре он всегда равен нулю. Для

клиентов на пользовательском уровне он равен

netlink

объединены с помощью логического или – |.

unsigned short nl_pad; // поле всегда заполнено нулями

__u32 nl_groups;

битовую

контексте.

AF_NETLINK

// идентификатор процесса

сокета

желает прослушивать приложение, в данном

sa_family_t nl_family; // семейство протоколов –

для

интерфейсов

struct sockaddr_nl

pid_t nl_pid;

bind()

указывать

которой представляет номер группы netlink. При вызове

Дополнительные флаги: аналогичный объект;

nl_groups – это битовая маска, каждый бит

(адрес

удален);

был

RTMGRP_IPV4_ROUTE получает

уведомления

добавлен эта

об

или

группа

изменениях

таблице маршрутизации для IPv4 адресов; RTMGRP_IPV6_ROUTE получает

уведомления

эта

об

группа

изменениях

таблице маршрутизации для IPv6 адресов. После

уникальным, поэтому тут вы можете натолкнутся

нему можно получить с помощью макросов, о

на

идентификатор

проблему,

несколько

когда

должен

попытаетесь

netlink-сокетов

в

быть

создать

многопоточном

приложении: при создании нового сокета будет возвращаться ошибка «Operation not permitted».

Для обхода данного ограничения следует nl_pid присваивать значение данного выражения:

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

будет

заниматься

ядро,

но

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

ЛАБОРАТОРИЯ

всегда

которых будет рассказано далее. Макросы Netlink •

NLMSG_ALIGN

округляет

размер

значения, выровненного по границе; NLMSG_LENGTH –

принимает

в

качестве

параметра размер поля данных (payload) и значение

сообщения netlink до ближайшего большего

возвращает

Присваивать значение идентификатора следует

до того, как будет вызван bind() для сокета. Так

nlmsghdr

расположен указатель на блок данных. Доступ к

pthread_self() << 16 | getpid();

заголовка

в

идентификатору процесса, владеющего сокетом. Каждый

структуры

в

выровненное

размера

для

по

записи

nlmsg_len заголовка nlmsghdr; NLMSG_SPACE

возвращает

границе

в

поле

размер,

который займут данные указанной длины в пакете netlink; NLMSG_DATA указатель

на

данные,

возвращает

связанные

переданным заголовком nlmsghdr;

с

СОДЕРЖАНИЕ

40


ПРО

РАБОТА С NETLINK В LINUX. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

NLMSG_NEXT – возвращает следующую часть

сообщения, состоящего из множества частей.

// небольшая вспомогательная функция, которая с помощью макрасов

nlmsghdr

// атрибутов rtattr

Макрос

принимает в

следующий

сообщении,

заголовок

состоящем

из

множества частей. Вызывающее приложение должно

проверить

наличие

заголовке nlmsghdr флага;

NLMSG_DONE

функция

в

не

текущем

// netlink разбирает сообщение и помещает блоки данных в массив

void parseRtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len) { memset(tb, 0, sizeof(struct rtattr *) * (max + 1));

возвращает

while (RTA_OK(rta, len)) {

значение NULL при завершении обработки

сообщения. Второй параметр задает размер

if (rta–>rta_type <= max) {

уменьшает это значение на размер заголовка

}

оставшейся части буфера сообщения. Макрос

tb[rta–>rta_type] = rta;

сообщения;

если

сообщение

не

было

NLMSG_PAYLOAD

разборка прошла успешно;

усечено

возвращает

и

его

размер

данных (payload), связанных с заголовком nlmsghdr.

} }

int main() { // создаем нужный сокет int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);

От теории к практике

if (fd < 0) { printf("Ошибка создания netlink сокета: %s",

Ну что же. Думаю, что я достаточно помучал Вас теорией

:)

запутанным

Может

или

быть

не

что-то

понятным

(char*)strerror(errno));

показалось

return 1;

постараюсь

}

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

// читаем атрибут

rta = RTA_NEXT(rta,len); // получаем следующий атрибут

NLMSG_OK – возвращает значение TRUE (1),

// пока сообщение не закончилось

давайте-ка

приложение,

напишем

которое

уведомления

об

будет

целый

будет

изменениях

небольшое в

получать сетевых

struct sockaddr_nl local;

// локальный адрес

char buf[8192];

// буфер сообщения

struct iovec iov;

// структура сообщения

интерфейсах и таблице маршрутизации! Ниже

iov.iov_base = buf; // ук-м buf в кач-е буф.сообщ-я для iov

объектов, я о них обязательно расскажу, но обо

memset(&local, 0, sizeof(local)); // очищаем структуру

всем

введен

по

порядку...

интерфейсов):

ряд

новых

Исходный

структур

код

и

(монитор

iov.iov_len = sizeof(buf);

local.nl_family = AF_NETLINK; // указываем семейство протокола local.nl_groups = RTMGRP_LINK |

* мониторинг сетевых интерфейсов и таблицы маршрутизации

RTMGRP_IPV4_ROUTE; local.nl_pid = getpid();

#include <stdio.h> #include <memory.h> #include <net/if.h> #include <arpa/inet.h> #include <sys/socket.h> #include <linux/rtnetlink.h>

ЛАБОРАТОРИЯ

// группы

// в качестве идентификатора // указываем идентификатор

*/

#include <errno.h>

// указываем

RTMGRP_IPV4_IFADDR | // необходимые

/* * monitor.c

// указываем размер буфера

// данного приложения

// структура сообщения netlink – инициализируем все поля struct msghdr msg; { msg.msg_name = &local; // задаем имя – структуру локального адреса msg.msg_namelen = sizeof(local);// указываем размер msg.msg_iov =&iov;

СОДЕРЖАНИЕ

41


ПРО

РАБОТА С NETLINK В LINUX. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

continue;

// указываем вектор данных сообщения }

msg.msg_iov len=1; // задаем длину вектора

// смотрим тип сообщения

}

if ((h–>nlmsg_type == RTM_NEWROUTE) || // если это изменения if (bind(fd, (struct sockaddr*)&local, sizeof(local)) < 0)

{

(h–>nlmsg_type == RTM_DELROUTE)) {

// роутов – печ.сообщ-е

printf("Произошли изменения в таблице маршрутизации\n");

// связываемся с сокетом printf("Ошибка связывания с netlink сокетом: %s",

// в остальных случаях начинаем более детально разбираться } else {

(char*)strerror(errno)); close(fd);

char *ifUpp;

// состояние устройства

return 1;

char *ifRunn;

// состояние соединения

struct ifinfomsg *ifi;

// указатель на структуру,

}

// содержащюю данные о сетевом // подключении

// читаем и разбираем сообщения из сокета while (1) { // после вызова bind() мы можем принимать сообщения

// массив атрибутов соединения, IFLA_MAX определен в

// для указанных групп

// rtnetlink.h

ssize_t status = recvmsg(fd, &msg, MSG_DONTWAIT);

struct rtattr *tb[IFLA_MAX + 1];

// небольшие проверки // получаем информацию о сетевом соединении в кором

if (status < 0) { if (errno == EINTR || errno == EAGAIN) {

// произошли изменения

usleep(250000);

ifi = (struct ifinfomsg*) NLMSG_DATA(h);

continue;

// получаем атрибуты сетевого соединения parseRtattr(tb, IFLA_MAX, IFLA_RTA(ifi),

}

h–>nlmsg_len); printf("Ошибка связывания приема сообщения netlink: %s", (char*)strerror(errno));

// проверяем валидность атрибута, хранящего имя // соединения if (tb[IFLA_IFNAME]) { // получаем имя соединения

continue;

ifName = (char*)RTA_DATA(tb[IFLA_IFNAME]);

}

} // провряем длину адреса, мало ли :)

// получаем состояние флага UP для соединения

if (msg.msg_namelen != sizeof(local)) {

if (ifi–>ifi_flags & IFF_UP) {

printf("Некорректная длина адреса отправителя");

ifUpp = (char*)"UP"; } else {

continue;

ifUpp = (char*)"DOWN";

}

} // собственно разбор сообщения

// получаем состояние флага RUNNING для соединения

struct nlmsghdr *h; // указатель на заголовок сообщения

if (ifi–>ifi_flags & IFF_RUNNING) {

for (h = (struct nlmsghdr*)buf; status >= (ssize_t)sizeof(*h); )

ifRunn = (char*)"RUNNING"; } else {

{ // для всех заголовков сообщений int len = h–>nlmsg_len;

// длина всего блока

int l = len – sizeof(*h);

// длина текущего сообщения

char *ifName;

// имя соединения

ifRunn = (char*)"NOT RUNNING"; }

if ((l < 0) || (len > status)) { printf("Некорректная длина сообщения: %i", len);

ЛАБОРАТОРИЯ

char ifAddress[256];

// сетевой адрес интерфейса

СОДЕРЖАНИЕ

42


ПРО

граммист

№8 (ноябрь) 2010

РАБОТА С NETLINK В LINUX. ЧАСТЬ 1

struct ifaddrmsg *ifa; // указатель на структуру содержащую

Компиляция: gcc monitor.c –o monitor. Запуск:

// данные о сетевом интерфейсе struct rtattr *tba[IFA_MAX+1] // массив атрибутов адреса

// получаем данные из соединения ifa = (struct ifaddrmsg*)NLMSG_DATA(h); // получаем атрибуты сетевого соединения parseRtattr(tba, IFA_MAX, IFA_RTA(ifa), h–>nlmsg_len); // проверяем валидность указателя локального адреса if (tba[IFA_LOCAL]) {

// получаем IP адрес

inet_ntop(AF_INET, RTA_DATA(tba[IFA_LOCAL]), ifAddress, sizeof(ifAddress)); }

switch (h–>nlmsg_type) { // что конкретно произошло case RTM_DELADDR: printf("Был удален адрес интерфейса %s\n", ifName);

Пояснения к программе

break;

case RTM_DELLINK: printf("Был удален интерфейс %s\n", ifName); break;

Как

обещал

появились

новые

структуры.

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

case RTM_NEWLINK: printf("Новый интерфейс %s, состояние интерфейса %s %s\n", ifName, ifUpp, ifRunn); break;

case RTM_NEWADDR: printf("Был добавлен адрес для интерфейса %s: %s\n", ifName, ifAddress); break; }

struct iovec { void *iov_base;

// буфер данных

__kernel_size_t iov_len;

// размер данных

};

Эта структура служит хранилищем полезных данных, Полю

передаваемых

iov_base

байтовый

}

через

присваивается

массив.

Именно

в

сокеты

netlink.

указатель

этот

на

байтовый

массив будут записаны данные сообщения: // выравниваемся по длине сообщения (если этого не сделать – // будет очень плохо, можете проверить :))

struct msghdr { void

status –= NLMSG_ALIGN(len);

int

// получаем следующее сообщение

// адрес клиента (имя сокета)

msg_namelen;

// длина адреса

struct iovec *msg_iov;

h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len));

// указатель на блок данных

__kernel_size_t msg_iovlen; // количество блоков данных

}

void

// немножко спим, что бы не очень грузить процессор

*msg_control;

// магическое число для проток., // не исп.в данных случаях

usleep(250000);

__kernel_size_t msg_controllen;

} close(fd);

*msg_name;

// закрываем дескриптор сокета

return 0; }

ЛАБОРАТОРИЯ

unsigned

msg_flags;

// длина пред.поля данных

// флаги сообщения

};

Эта

структура

непосредственно

передается

СОДЕРЖАНИЕ

43


ПРО

РАБОТА С NETLINK В LINUX. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

через сокет. Она содержит в себе указатель на

сокет и проверяем успешность его создания.

блоков, а так же ряд дополнительных флагов и

переменных и заполнение структуры локального

блок

полезных

полей,

данных,

пришедших,

по

платформы BSD:

количество

большей

данных

части,

с

ifi_family;

// тип устройства

int

ifi_index;

// индекс интерфейса

unsigned int

ifi_flags;

// флаги устройства

unsigned int

ifi_change;

// маска смены, зарез-но

устройства,

его

семейства,

типа,

Так

объявляем

же

RTMGRP_LINK,

RTMGRP_IPV4_ROUTE.

структуру

сообщения

и

После

этого

на

групп.

Можно

Далее

следует

мы

сообщения

принимать

становимся

для

указанных

сообщения

бесконечный

цикл

через

приема

сообщений из сокета. Так как принимаемый блок данных может иметь несколько заголовков и ассоциированных с ними данных – начинаем

перебирать, с помощью netlink макросов все принятые

данные.

Каждое

новое

сообщение

Теперь можно разбирать собственно сообщение.

{ ifa_family;

// Тип адреса (AF_INET или // AF_INET6)

ifa_prefixlen; // Длина префикса адреса (длина // сетевой маски) ifa_flags;

// Флаги адреса

unsigned char

ifa_scope;

// Область адреса

int

ifa_index;

// Индекс интерфейса, равен

};

адреса,

служит

интерфейс:

для

назначенного

представления на

сетевой

и идем к следующему сообщению. А если нет – начинаем детально разбираться. Объявляются данных

отвечает

вспомогательная

функция

parseRtattr. Она использует макросы Netlink и заполняет указанный массив всеми атрибутами из

блока

данных

ifaddrmsg. После

того

структуры

как

мы

ifinfomsg

получили

или

массивы,

заполненные атрибутами – можем работать с

Доступ к каждому атрибуту осуществляется по его

{ unsigned short rta_len;

// Длина опции

unsigned short rta_type;

// Тип опции

для

Все

индексы

файлах

прокомментированы.

В

определены netlink

данном

используем следующие индексы:

}

служит

индексу.

заголовочных

/* данные */

хранения,

какого–либо параметра соединения или адреса. Пояснения к коду

После запуска программы мы создаем netlink

ЛАБОРАТОРИЯ

таблицей маршрутизации – печатаем сообщение

этим значениями, анализировать их, печатать.

struct rtattr

структура**

за сообщение к нам приехало. Если оно связано с

все необходимые данные. За получение этих

// аналог-му полю в ifinfomsg

структура

Смотрим на поле nlmsg_type и выясняем, что же

массивы опций rtattr, куда будут складываться

unsigned char

Эта

подписаться:

расположено по указателю struct nlmsghdr *h.

struct ifaddrmsg

сетевого

хотим

сокет.

Эта структура используется для представления

Эта

которые

подписанными

};

unsigned char

адреса. Тут мы указываем группы сообщений, на

bind().

// и всегда равно 0xFFFFFFFF

индекса и флагов:

необходимых

происходит связывание с сокетом, с помощью

// семейство (AF_UNSPEC)

unsigned short ifi_type;

unsigned char

объявление

связываем с ней один блок данных. После этого

{

сетевого

происходит

RTMGRP_IPV4_IFADDR,

struct ifinfomsg

unsigned char

Далее

случае

в

и

мы

** Комментарий автора.

Как можно было догадаться – существует разделение на сетевые

устройства (линки) и сетевые интерфейсы (адреса). Оба параметра являются

указателями

представляют

собой

идентифицирующим

на

единое

соответствующие

параметром

сетевое

является

уникален и назначается ядром Linux.

структуры

устройство. индекс.

Он

и

Общим

всегда

СОДЕРЖАНИЕ

44


ПРО

РАБОТА С NETLINK В LINUX. ЧАСТЬ 1

№8 (ноябрь) 2010

граммист

IFLA_IFNAME – индекс атрибута с именем

интерфейса;

Для

адресом.

Находится

IFA_LOCAL – индекс атрибута с локальным IP

После

всего

этого,

мы

обладаем

полной

печатать информацию на экран. Как видите ничего страшного.

При

браузере движке

заходе

специальным

рассмотрели

все

основные

структуры и написали наглядный пример. На

сформированную страницу у злоумышленника появляется возможность

заполучить

хотел

завершить

первую

часть.

Корпорация Google заявляет, что в версии Android 2.2 Froyo этой уязвимости уже нет. Но учитывая, что устройств со старыми

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

Надюсь, что Вам понравилось. Если есть, какие

А по данным http://opennet.ru в сети

то вопросы – с удовольствием отвечу.

зафиксирована

маршрутизации

и

научимся

специализированные

запросы.

выполнять

Будет

изучено

определения

своего

еще ряд структур и методик. Так же будет пример

собственного протокола и общение, с помощью

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

хочет учиться чему–то самостоятельно, думаю, пригодится полный RFC протокола Netlink [1], а так же статья в Linux journal [2]. До встречи на страницах журнала клуба ПРОграммистов!

Продолжение следует…

поражающая

не

только

управлением

Linux

Windows-

системы, но и машины, работающие под своего

и

MacOS

распространения

X.

Для

червь

использует социальные сети, такие как Twitter, Facebook и MySpace, публикуя в них под аккаунтом инфицированного пользователя

сообщения, склоняющие друзей к нажатию на ссылку, такие как

«…не ты ли это на данном видеоролике?». Ссылка

попытке

ведет

на

стилизованную

просмотра

видеоролика

под

на

YouTube

которой

страницу,

при

загружается

вредоносный Java-апплет jnana.tsa. Апплет эксплуатирует недавно найденную уязвимость в Java-плагине для выхода за пределы изолированного

окружения,

сохраняет

себя

системе

вредоносный

в

системе

и

продолжает цепочку вредоносных публикаций уже от имени новой жертвы.

Закрепившись

Литература

кроссплатформенная

модификация сетевого червя Koobface,

В следующей части мы изучим работу с таблицей

рассмотрен

на

образом

сессиях и прочее.

протоколе, бы

WebKit.

в

на

карты памяти, история посещений, кэш страниц, информация о

Итак, мы получили базовые знания о Netlink и я

она

2.1

уязвимость.

доступ к информации, используемой веб-браузером - содержимое

Заключение

этом

Android

построенном

информацией о том, что произошло и можем

его

Google

найдена

в

код

перехватывает

параметры входа в социальные сети и использует их для своего

RFC-3549 Linux Netlink as an IP Services

Kernel Korner - Why and How to Use Netlink

Protocol http://tools.ietf.org/html/rfc3549

Socket http://www.linuxjournal.com/article/7356

распространения. Кроме того, апплет периодически соединяется с

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

может быть использован для рассылки спама или участия в DDoSатаках.

В Linux вредоносный апплет копирует себя в домашнюю директорию

пользователя,

но не прописывает себя в файлы автозапуска, что, в Новая версия Linux Mint 10, с кодовым

отличие

от

2010. Данный дистрибутив базируется на

ограничивает

на

перезагрузкой

поведения

названием Julia, вышла в свет 12 ноября

данного червя в Windows,

Ubuntu и, по данным DistroWatch, является

работы

популярности в мире.

Эффективность

сегодняшний

день

третьим

по

Скачать новую версию можно на http://www.linuxmint.com/down load.php.

ЛАБОРАТОРИЯ

Linux-системы

время

его

первой

системы.

атаки

на

также

снижается отсутствием поставки по умолчанию Java в популярных Linux-дистрибутивах и оперативным выпуском обновлений.

СОДЕРЖАНИЕ

45


ПРО

граммист

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

№8 (ноябрь) 2010

Получение спектра в радиотехнике уже стало обыденным явлением. Появились как аппаратные высокоскоростные реализации, например от таких брендов как Tektronix, так и совмещенные варианты анализаторов на основе DSP процессоров или ПЛИС в промышленных или офисных компьютерах. Данным материалом мы начинаем цикл статей посвященных теме анализа спектра сигналов и их визуализации, для чего сегодня разработаем компонент, работающий с цифровым аудиопотоком, и освоим методику Фурьеанализа применительно к распознаванию DTMF... Сергей Бадло

можно подобрать ряд гармонических сигналов с

by raxp http://raxp.radioliga.com

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

Краткий экскурс… Спектроанализатор* наблюдения

распределения

и

любой

-

это

измерения

энергии

прибор

для

относительного

электромагнитных

колебаний в заданной полосе частот и бывает

суммы

характеру

анализа

частотно-амплитудных

и

цифровые,

скалярные

спектров)

и

(фазо-частотных спектров). Анализатор амплитуду

спектра

составляющих,

и

анализируемого параметром

способность,

т.е.

позволяет

частоту

входящих

сигнала.

является

а

векторные

определить

спектральных в

Важнейшим

наименьший

состав

его

разрешающая

интервал

по

частоте между двумя гармониками, которые еще

ординате

сигнала.

В

бесконечного

числа

гармонических

очевидны лишь на малых частотах, либо при использовании

аппаратно-программных реализаций»

по

(получение

равна

Рис. 1. «Преимущества софтовых вариантов

так и совмещенным. По способу обработки — аналоговые

времени

несинусоидального

общем случае, ряд Фурье записывают в виде

как параллельного или последовательного типа, различают

момент

исследуемого

составляющих разных частот (см. формула): U(t) = Uo + SUM ( Um * sin ( k * ω * t + φ ) ); где: k - номер гармоники;

kω - угловая частота k- ой гармоники;

ω = 2*pi/T - угловая частота первой гармоники; φ - начальная фаза сигнала; Uo - нулевая гармоника.

можно измерить.

Для выделения спектра в радиотехнике, как

1. Физический смысл или… для чего мы учим

Фурье (БПФ). БПФ — это быстрый алгоритм

математику

Вспомним курс математики [1-6]. Как вы знаете, периодическим сигналом называют такой вид воздействия, когда форма сигнала повторяется

через некоторый интервал времени T, который называется

периодом.

периодического

Простейшей

сигнала

формой

является

гармонический сигнал или синусоида, которая

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

общая

периодических

методика

исследования

негармонических

сигналов,

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

АРХИВ

правило, используется быстрое преобразование

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

В 1822 году Фурье опубликовал работу «Аналитическая теория

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

В

этой

работе

он

описал

метод

разделения

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

попытку

доказать

попытка

оказалась

неудачна,

возможность

разложения

в

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

фактически

стала

основой

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

то

есть

«классического»

такой

сигнал

спектра,

можно

представить

описываемого

f(ω).

в

виде

Именно

преобразование Фурье однозначно определяет соответствие между j(t) и f(ω) и лежит в основе Фурье-спектроскопии / Лит.

СОДЕРЖАНИЕ

46


ПРО

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

№8 (ноябрь) 2010

граммист

действий, меньшее чем O(N2), требуемых для прямого вычисления ДПФ.

Для чего нужно быстрое преобразование Фурье?

По

гармоники:

Допустим у нас есть периодическая функция

изменяющаяся по закону синуса x = sin(t) (см. рисунок

2).

колебания

Максимальная

равна

1.

Если

амплитуда

умножить

этого

его

на

в A раз: x = A*sin(t).

Период колебания равен 2pi. Если мы хотим увеличить

период

до

T,

то

надо

умножить

переменную t на коэффициент [0; 1]. Это вызовет растяжение

графика

по

горизонтали:

x

=

вычисляется

по

И, наконец, есть фаза, обозначаемая как φ. Она определяет сдвиг графика колебания влево. В результате

получается

сочетания

всех

этих

гармоническое

параметров

разложим

Xn

на

перемножим;

внесем множитель 1/N под знак суммы и перегруппируем элементы в две суммы:

Xn = ( 1/N ) * SUM ( Xk * [ cos ( 2*pi*k*n/N ) + j * sin ( 2*pi*k*n/N ) ] ) =>

=> ( 1/N ) * SUM ( ( Rek + j*Imk ) * [ cos (

2*pi*k*n/N ) + j*sin ( 2*pi*k*n/N ) ] ) =>

=> SUM ( ( Rek/N )* cos ( 2*pi*k*n/N ) – ( Imk/N ) * sin ( 2*pi*k*n/N ) ) +

+ j*SUM ( ( Rek/N )* sin ( 2*pi*k*n/N ) +

далее будем работать с функцией косинуса:

Выделим элементы, независимые от времени t, и

комплексное

синус и косинус действительного аргумента;

перейти от синуса к косинусу. Для удобства,

A * sin φ * sin ( 2pi*t/T );

каждое

разложим экспоненту по формуле Эйлера на

Если изменить фазу на 90 градусов, то можно

x = A * cos φ * cos ( 2pi/T ) -

исходной

= Re + j*Im;

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

Преобразуем по формуле косинуса суммы:

однозначно

мнимую и действительную составляющие Xn

колебание

x = A * cos ( 2pi/T + φ ) = A * cos ( ωt + φ );

фазу

действия:

которая

можно

и

И выполним над этой формулой следующие

круговой

частоте,

Im

Xn = ( 1/N ) * SUM ( Xk* e ^ ( j*2*pi*k*n / N ) );

формуле: ω = 2pi/T, где x = A*sin(ωt).

и

Теперь возьмем обратное преобразование Фурье:

A*sin(2pi/T). Как вы знаете, частота колебания

обратна периоду: f = 1/T. Также говорят о

Re

амплитуду

φ = arctg ( Im/Re ), A = sqrt ( Re^2 + Im^2 );

некоторый коэффициент A, то получим тот же

график (см. риснок 3), растянутый по вертикали

величинам

восстановить

( Imk/N ) * cos ( 2*pi*k*n/N ) );

Как видите, слева стоит действительное число Xn,

а

справа

две

суммы,

одна

из

которых

помножена на мнимую единицу j. Сами же

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

исходная

последовательность

действительной. Отбросим ее и получим:

была

обозначим их как Re и Im (действительная и

Xn = SUM ( ( Rek/N ) * cos ( 2*pi*k*n/N ) –

x = Re * cos ( 2pi*t/T ) – Im * sin ( 2pi*t / T );

Поскольку при дискретизации мы брали tn =

мнимая части):

Re = A * cos φ, Im = A * sin φ;

Рис. 2. Периодическая функция

АРХИВ

( Imk/N ) * sin ( 2*pi*k*n/N ) );

nT/N и Xn = F(tn), то можем выполнить замену: n

Рис. 3. Рост амплитуды

СОДЕРЖАНИЕ

47


ПРО

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

№8 (ноябрь) 2010

граммист

= tn*N/T. Следовательно, в синусе и косинусе вместо 2pi*k*n/N можно написать 2pi*k*tn/T. В результате получим:

Xn = F(tn) = SUM ( ( Rek/N ) * cos ( 2*pi*k*tn/N ) – ( Imk/N ) * cos ( 2*pi*k*tn/N ) );

Сопоставим

эту

гармоники:

формулу

с

формулами

для

x = A * cos ( 2*pi*t/T + φ ) = A * cos ( ωt + φ );

алгоритма

быстрого

(БПФ).

Входным

является

преобразования внутренний

Фурье

буфер

с

аудиоданными, частотой дискретизации 44100

герц и форматом 16 бит/семпл. Длина буфера

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

Внешние свойства и события компонента:

x = Re * cos ( 2*pi*t/T ) – Im * sin ( 2pi*t / T );

Следовательно, сумма представляет собой сумму

из N гармонических колебаний разной частоты, фазы и амплитуды:

property About

// Copyright :)

property DTMF_keys

// строка для генерации DTMF

property DTMF_volume

// установка амплитуды генерации

property DTMF_duration_ms // установка длительности генерации property FFT_point

F(tn) = SUM ( Ak * cos ( 2*pi*tn/Tk + φk ) ) =

// выбор кол-ва точек преобразования БПФ

property FFT_window // выбора типа сглаживающих окон

SUM ( Gk(tn) );

Далее будем функцию Gk(t) = Ak*cos(2pi*tk/T +

φk) называть k-й гармоникой. Амплитуда, фаза, частота и период каждой из гармоник связаны с коэффициентами Xk формулами:

property Key

// событие декодированных команд DTMF

property Spektra

// выдача спектра после БПФ

property DataOsc

// выдача «сырых» отсчетов с аудио-буфера

Результат работы компонента и типичный спектр сигнала

Xk = Rek + j * Imk;

DTMF

с

его

представлен на (см. рисунок 4):

Xk = N * Ak * e ^ ( j * φk );

распознаванием

Ak = ( 1/N ) * sqrt ( Rek^2 + Imk^2 ); φk = arctg ( Imk / Rek ); Tk = T/k;

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

состоит

в

том,

чтобы

представить

некоторый дискретный сигнал в виде суммы гармоник.

Параметры

каждой

гармоники

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

обратным.

При

обратном

преобразовании мы восстановим исходный или обработанный сигнал.

2. Описание компонента спектроанализатора Разрабатываемый компонент предназначен для построения спектра аудио-сигнала, кодирования

и декодирования двух-тоновых посылок DTMF

(Dual Tone Multi Frequency) и получения «сырых» отсчетов

в

использовать различных

реальном в

плеерах

времени.

системах

Его

можно

сигнализации,

аудио-видео

файлов

и

учебных программах работы со звуком. В основу работы

АРХИВ

компонента

положено

использование

Рис. 4. Визуализация сигнала. Типичный спектр сигнала DTMF

Практика. отладки

Разработка

ПО

и

средства

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

среда разработки TurboDelphi-Lite portable;

СОДЕРЖАНИЕ

48


ПРО

граммист

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

№8 (ноябрь) 2010

аудиокарта.

Type // установки для waveform

Вкратце, процедура (прямого) БПФ в компоненте будет включать в себя следующие шаги: •

берем из сигнала N выборок кратным степени

рассчитываем

2, т.е. 2^k; части

комплексное

заполняем

нулями,

значений;

БПФ,

мнимые

получаем

2N

амплитуду сигнала для каждой гармоники получаем,

складывая

квадраты

: Double;

dblAmplitudeL

: Double;

dblVolumeF

: Double;

end;

type Twindow = (dB_0,

получаем N значений, из которых значения

dB_72,

dB_67,

от 0 до (N/2-1) представляют наш спектр в от

0

до

половины

отбрасываем; для

адекватного в

представления

выборке

по

20lg(Ai/Amax), для напряжений;

формуле

при необходимости используем различные сглаживающие

окна

сигнала

для

во

взвешивания

временной

например Блэкмана-Харриса; добавляем

(подставку); результаты

порог

выводим

области,

чувствительности

в

качестве

события

компонента, например, используя series для подключения к TChart-у.

Разбор принципов генерации и декодирования

DTMF сигналов проведен в статье [6] и в данном

материале рассматриваться не будет. В листинге

приведен полный код компонента с подробными комментариями: unit DTMF;

interface

uses MMSystem, Windows, SysUtils, Messages, Classes, controls, extctrls, series, TeEngine, math;

type // тип данных wave- ind TData16 = array [0..127] of smallint; PData16 = ^TData16;

АРХИВ

dB_92); // функции окна-

частоты

пересчитываем в дБ, с учетом максимальной

входного

dblDataSlice

из суммы корень квадратный;

величины

: Double;

dB_54,

дискретизации, вторую половину (зеркалку)

dblFrequency

действительной и мнимой части и извлекая

области •

SINEWAVE = packed record

type Tkeys = procedure(Sender:TObject; key:string; a1,a2, f1,f2: double) of object; // выдача DTMF Tspektr = procedure(Sender:TObject; series: TbarSeries) of object; // выдача спектра TdataOsc = procedure(Sender:TObject; series: TfastlineSeries) of object; // сырой набор данных TDTMF=class(TComponent)

private fabout

: string;

fkey

: string;

fvol

: integer;

flen

: integer;

fcntp

: integer;

FOnKeys

: TKeys;

FOnSpektr

: TSpektr;

FOnDataOsc

: TDataOsc;

ftimer

: Ttimer;

ftimer2

: Ttimer;

tmr_en

: boolean;

fwindow

: twindow;

protected // передача строки DTMF для генерации procedure gen_dtmf(const Value: string); // выбор окна сглаживания procedure set_window(const Value: twindow); // установка к-ва точек БПФ procedure f_cntp(const Value: integer);

СОДЕРЖАНИЕ

49


ПРО

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

№8 (ноябрь) 2010

граммист

// инит-деинит работы с аудио

hwi2

: HWAVEIN;

procedure wcard;

hBuf

: THandle;

// события компонента

pnt

: PPointArr;

f_window

: smallint = 5;

// без сглаживания

fcntpp

: integer = 2048;

// к-во точек FFT

constructor Create(AOwner: TComponent); override;

signal

: string;

// декодированный DTMF

destructor Destroy; override;

a1,a2,

procedure ind(Sender: TObject); procedure ind2(Sender: TObject); public

f1,f2

published // внешние свойства компонента property About

: string read Fabout write setabout;

property DTMF_keys

: string read Fkey write gen_dtmf;

: double;

// частоты-

// кодер DTMF

property DTMF_volume : integer read Fvol write fvol default 100; property DTMF_duration_ms: integer read Flen write flen default 250; property FFT_point

// амплитуды-

: integer read Fcntp write f_cntp default 2048;

property FFT_window : twindow read fwindow write

waveOut

: hWaveOut;

outHdr

: TWaveHdr;

header2

: TWaveFormatEx;

pBuf

: tHandle;

pBuffer

: pointer;

Opened, lock

: boolean;

gl_key

: integer;

set_window; property Key

property Spektra : TSpektr read FOnSpektr write FOnSpektr; property DataOsc : TDataOsc read FOnDataOsc write FOnDataOsc; end;

генерацию

звука

в

= '1234567890*#abcd';

DTMF1: array [1..16] of integer = (697,697,697,770,770,770,852,852, 852,941,941,941,697,770,852,941); DTMF2: array [1..16] of integer= (1209,1336,1477,1209,1336,1477,1209,1336, 1477,1336,1209,1477,1633,1633,1633,1633);

var stp: boolean = FALSE; inwav, outwav

: TfastLineSeries;

spektr

: TbarSeries;

и

через

Waveform

Audio

Win32

waveOutOpen

-

устройство

вывода

сигнала;

открывает

Waveform

waveOutPrepareHeader подготовку данных.

буфера

для

-

API.

Нам

имеющееся audio

для

выполняет

операции

вывода

Далее зададимся законом модуляции, форматом вывода

PCM,

количеством генерации:

частотой

каналов

и

дискретизации, длительностью

//----------------------------------------------------------// КОДЕР DTMF – генерация 2-х тонального сигнала //----------------------------------------------------------procedure stopPlay;

// декодер DTMF adr2

памяти

воспроизведение в среде Windows осуществляют

const // таблица соответствия частот DTMF

: pWaveHdr;

BufHead1,BufHead2 : TWaveHdr; bufsize

: integer;

header

: TWaveFormatEx;

АРХИВ

Обычно,

понадобятся следующие функции:

procedure Register;

keys

implementation

: TKeys read FOnKeys write FOnKeys;

begin WaveOutReset(WaveOut); WaveOutClose(WaveOut); GlobalUnlock(pBuf);

СОДЕРЖАНИЕ

50


ПРО

граммист

№8 (ноябрь) 2010

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

if intPosition=3 then begin

GlobalFree(pBuf)

// Byte 2

end;

lngTemp := lngWord; procedure PlayBuffer(h: hwnd; SampleRate: integer; Bits: Byte; Buffer: array of byte);

// Mask off byte and shift right 24 bits. // Mask

-> 2130706432 = &H7F000000

var Err: integer;

// Shift -> Divide by 16777216

begin

lngTemp := Round((lngTemp and 2130706432)/16777216);

with header2 do begin

intByte := lngTemp; end else if intPosition=2 then begin

wFormatTag

:= WAVE_FORMAT_PCM;

nChannels

:= 1;

// Byte 2

nSamplesPerSec

:= SampleRate;

lngTemp := lngWord;

wBitsPerSample

:= Bits;

lngTemp := Round((lngTemp and 16711680)/65536);

nBlockAlign

:= nChannels * (wBitsPerSample div 8);

intByte := lngTemp;

nAvgBytesPerSec := nSamplesPerSec * nBlockAlign; cbSize

:= 0;

end else if intPosition=1 then begin // Byte 1 lngTemp := lngWord;

end;

// Mask off high byte and shift right 8 bits. if Opened = true then stopPlay;

// Mask

err:= WaveOutOpen(addr(waveOut), 0, @header2,h, 0,

// Shift -> Divide by 256

CALLBACK_WINDOW); if Err <> 0 then Exit; pBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, length(Buffer)); pBuffer := GlobalLock(pBuf);

-> 65290 = &HFF00

lngTemp := Round((lngTemp and 65290)/256); intByte := lngTemp; end else begin // Byte 0 intByte := lngWord and $FF; end;

with outHdr do begin

result:= intByte end;

lpData

:= PBuffer;

dwBufferLength

:= length(Buffer);

dwUser

:= 0;

dwFlags

:= 0;

dblVolume: array of double; var Freq:

dwLoops

:= 0

array of Smallint; Seconds: Double; var FreqBuffer: variant);

end;

procedure toneGenerate(lngSampleRate: integer; intBits: byte;

// создание WAVEFORM var i, j : integer;

err:= WaveOutPrepareHeader(waveOut, @outHdr, sizeof(outHdr));

lngLimit, lngData : longint;

if Err <> 0 then Exit;

lngSamples, lngDataSize : integer;

copyMemory(pBuffer, @Buffer, length(Buffer));

dblDataPtL, dblWaveTime,

err:= WaveOutWrite(waveOut, @outHdr, sizeof(outHdr));

dblSampleTime, dblFrequency: Double;

if Err <> 0 then Exit

tmpBuf : array of byte; intSineCount : Smallint;

end;

SineWaves : array of SINEWAVE; function sel_byte(lngWord: Longint; intPosition: Smallint): byte;

begin setLength(SineWaves, length(freq));

var lngTemp: Longint; intByte: byte; begin

АРХИВ

for i:=0 to length(freq) - 1 do begin with SineWaves[i] do begin

СОДЕРЖАНИЕ

51


ПРО

граммист

№8 (ноябрь) 2010

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

dblAmplitudeL:= 0.25;

tmpbuf[2*i]

dblFrequency := freq[i]; // задаем F генерации WAVEFORM

tmpbuf[(2*i)+1] := sel_byte (lngData, 1);

dblVolumeF

:= sel_byte(lngData, 0);

end

:= dblVolume[i]

end;

end

FreqBuffer:= tmpBuf

end;

end; intSineCount := length(SineWaves)-1; // передача строки DTMF для генерацииfor i:=0 to intSineCount do begin dblWaveTime := 1 / SineWaves[i].dblFrequency;

procedure tdtmf.gen_dtmf(const Value: string); begin

dblSampleTime := 1 / lngSampleRate;

fkey:= value;

SineWaves[i].dblDataSlice := (2*Pi)/

if fkey<>'' then tmr_en:= true // запрещаем ген-ю, если пусто

(dblWaveTime/dblSampleTime);

end;

end; // генерация одиночного DTMF с переборомlngSamples := round(Seconds/dblSampleTime);

procedure TDTMF.ind2(Sender: TObject);

lngDataSize :=

var Freq: array [0..1] of smallint;

Round(lngSamples*(intBits/8));

SetLength(tmpBuf, lngDataSize);

Buffer:array of byte;

if intBits=8 then lngLimit := 127

dblVolume: array [0..1] of double; SoundBuffer: variant;

else lngLimit := 32767;

i: integer; for i:=0 to lngSamples-1 do begin if intBits=8 then begin

begin if tmr_en then begin

// -------------------------------------------------------

inc(gl_key);

// 8 Bit Data

if gl_key > length(fkey) then begin

// -------------------------------------------------------

gl_key:= 0;

dblDataPtL := 0;

tmr_en:= false;

for j:=0 to intSineCount do

fkey:= ''

dblDataPtL := dblDataPtL + (sin(i*SineWaves[j].dblDataSlice)*

// если перебрали все – останов

end else for i:= 1 to length(keys) do if keys[i]= lowercase(fkey[gl_key]) then begin

SineWaves[j].dblAmplitudeL*

Freq[0]:= dtmf1[i]; // задаем частоты-

SineWaves[j].dblVolumeF);

Freq[1]:= dtmf2[i];

lngData := round(dblDataPtL*lngLimit)+lngLimit;

dblVolume[0]:= fvol / 100;

tmpBuf[i] := ExtractByte(lngData, 0);

// задаем уровень громкостиdblVolume[1]:= fvol / 100;

end else begin // ------------------------------------------------------// 16 Bit Data

// создание WAVEFORM-

// -------------------------------------------------------

toneGenerate(22050, 8, dblVolume, Freq, flen/1000, SoundBuffer);

dblDataPtL := 0;

buffer:= SoundBuffer;

for j:=0 to intSineCount do

PlayBuffer(0,22050, 8, Buffer) // воспроизведение-

dblDataPtL := dblDataPtL + (sin(i*SineWaves[j].dblDataSlice)* SineWaves[j].dblAmplitudeL*

lngData

АРХИВ

end end

SineWaves[j].dblVolumeF);

end;

:= Round(dblDataPtL*lngLimit);

// END DTMF KODER -------------------------------------------

СОДЕРЖАНИЕ

52


ПРО

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

№8 (ноябрь) 2010

граммист

Как быть с обработкой в реальном времени? Воспользуемся API функцией WaveInOpen, чтобы

b[i]:= 0

получить доступ к текущему аудиоустройству.

end;

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

FFT(a, b, k, f_window, 1);

// получение спектра

for i:=0

// отсекаем зеркалку

Также заведем два буфера BufHead1 и BufHead2, данных.

отсчетов,

Размер т.к.

разрешение

погрешность

буфера

нам

по

при

не

определим

в

требуется

частоте,

определении

3000

высокое

допустимую

DTMF

будем

задавать доверительным интервалом по частоте. Частоту

дискретизации

зададим

типичную

(максимальную) для большинства аудиокарт в 44100

Гц,

16

бит

на

канал.

После

чего,

передадим полученный набор данных в нашу

процедуру БПФ и строим спектр как обычно. Причем, заметьте, основное время тратится не на обработку данных и БПФ, а на набивку в

series. Поэтому, если вам дорого время и вы

хотите максимально увеличить размер буфера для

повышения

разрешения

по

частоте,

то

to k div 2-1 do begin

// получаем модуль из Re и Im d:= sqrt(a[i]*a[i] + b[i]*b[i]); // приведение к дБ и нормирование d:= 20*log10(d/k + 0.000001) -25; // -25дб это подставка, чтоб убрать фоновые шумы // по спецификации ITU-T для DTMF // уровень шума (SNR) на уровне 15 дБ seriesout.Add(d) end end;

// получение аудиоданных и построение спектра-

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

procedure waveInProc2(hwi: HWAVEIN;

series):

var i

TChart (именно этим обусловлено использование

uMsg,dwInstance,dwParam1,dwParam2: DWORD);stdcall;

//----------------------------------------------------------// ДЕКОДЕР DTMF + СПЕКТРОАНАЛИЗ //----------------------------------------------------------procedure FFTQuad(seriesin,seriesout: TChartSeries; max:integer); // max- точечное БПФ var a,b

: array of double;

i,k : integer; d

: real;

begin

if Seriesin.yValues.count = 0 then exit; k:= Seriesin.YValues.Count; while (k>1) and (power(2, i)<max) do begin k:=k div 2; inc(i)

temp

: pWaveHdr;

a,f,cntval

: double;

begin if (uMsg=WIM_DATA) and (stp) then begin temp:= adr2; // получаем указатель на данные с буфера 1/2 if adr2= @bufhead1 then adr2:= @bufhead2 else adr2:= @bufhead1;

// собственно сами данные data16:= PData16(temp.lpData);

if (not lock) then try inwav.Clear; outwav.Clear; spektr.Clear; // подчищаем for i := 0 to BufSize - 1 do begin

end;

k:= ceil(power(2, i)); SetLength(a,k); // инициализируем массив Re, Im SetLength(b,k); to k-1 do

begin

АРХИВ

: PData16;

inwav.add(data16^[i]) // набиваем из аудиобуфера

end;

a[i]:=

data16

if stp then WaveInAddBuffer(hwi,adr2,SizeOf(TWaveHdr));

i:=0;

for i:=0

: integer;

Seriesin.YValue[i];

// ПОЛУЧЕНИЕ СПЕКТРА FFTQuad(inwav, outwav, fcntpp);

// обработка спектра и 2-x проходный поиск --a1:= -1000; cntval:= header.nSamplesPerSec / outwav.YValues.Count;

СОДЕРЖАНИЕ

53


ПРО

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

№8 (ноябрь) 2010

граммист

for i:= 0 to (outwav.YValues.Count)-1 do begin

except end end else Exit

a:= outwav.YValues[i]; f:= i * cntval; // получение истинной частоты гармоники

end;

if a>=0 then spektr.AddXY(f,a) else spektr.AddXY(f,0);

// отсекаем отриц-е амплитуды

// инициализация-деинициализация получения аудио-данных

// частота для max 1- гармоники

procedure TDTMF.wcard;

if a > a1 then begin a1:= a; f1:= f end

const rbuf = 6; var BufLen : word;

end;

buf

a2:= -1000; for i:= (outwav.YValues.Count)-1 downto 0 do begin

: pointer;

begin

a:= outwav.YValues[i];

stp:= not stp;

f:= i * cntval;

try

// частота для max 2- гармоники

if stp then begin // старт

if (a > a2) and (a<>a1) then begin a2:= a; f2:= f end

BufSize:= rbuf *500; with header do begin

end;

wFormatTag:= WAVE_FORMAT_PCM; // --------------------------------------------------------

nChannels := 2;

// каналов

// ИДЕНТИФИКАЦИЯ DTMF

nSamplesPerSec:= 44100;

// дискретизация, Гц

// --------------------------------------------------------

wBitsPerSample:= 16;

// бит

// по спецификации ITU-T на DTMF доверительный интервал

nBlockAlign:= nChannels * (wBitsPerSample div 8);

// должен быть не более 1.5%, но мы зададимся чуть больше,

nAvgBytesPerSec:= nSamplesPerSec * nBlockAlign;

// чтобы учесть разброс характеристик и небольшое заданное

cbSize:= 0;

// разрешение анализатора спектра по частоте (размер буфера

end;

// 3000, см. выше) WaveInOpen(Addr(hwi2), WAVE_MAPPER,

signal:= '';

addr(header),integer(@waveInProc2),

for i:= 1 to 16 do begin

0,CALLBACK_FUNCTION);

// 1 амплитуда >2 if (DTMF2[i]*0.96<f1) and (DTMF2[i]*1.04>f1) and (DTMF1[i]*0.96<f2) and (DTMF1[i]*1.04>f2) then begin

BufLen:= header.nBlockAlign * BufSize; hBuf:= GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen);

signal:= keys[i];

Buf:= GlobalLock(hBuf);

break

with BufHead1 do begin lpData:= Buf;

end; // 1 амплитуда >2

dwBufferLength:= BufLen;

if (DTMF1[i]*0.96<f1) and (DTMF1[i]*1.04>f1) and

dwFlags:= 0;

(DTMF2[i]*0.96<f2) and (DTMF2[i]*1.04>f2) then begin

end; with BufHead2 do begin

signal:= keys[i];

lpData:= Buf;

break

dwBufferLength:= BufLen;

end;

dwFlags:= 0;

end;

end; spektr.Title:= 'DTMF('+ signal +'):

' +

format('A1= %.2n',[a1]) + formatfloat(' [0 Hz]

', f1) +

format('A2= %.2n',[a2]) + formatfloat(' [0 Hz]', f2);

АРХИВ

adr2:= @BufHead1; waveInPrepareHeader(hwi2, Addr(BufHead1), sizeof(BufHead1)); waveInPrepareHeader(hwi2, Addr(BufHead2),sizeof(BufHead2)); WaveInAddBuffer(hwi2, addr(BufHead1), sizeof(BufHead1));

СОДЕРЖАНИЕ

54


ПРО

№8 (ноябрь) 2010

граммист

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

Inwav

:= tfastlineseries.Create(nil);

end else begin // cтоп

Outwav

:= tfastlineseries.Create(nil);

WaveInReset(hwi2);

Spektr

:= tbarseries.Create(nil); // визуально удобнее-

WaveInUnPrepareHeader(hwi2, addr(BufHead1),

spektr.Marks.Visible:= false;

WaveInStart(hwi2)

sizeof(BufHead1)); WaveInClose(hwi2);

ftimer:= ttimer.Create(self);

GlobalUnlock(hBuf); GlobalFree(hBuf);

ftimer.Enabled

:= false;

end

ftimer.interval

:= 200;

//

ftimer.ontimer

:= ind;

except end

ftimer.Enabled

:= true;

ftimer2:= ttimer.Create(self);

end;

ftimer2.Enabled

:= false;

//-----------------------------------------------------------

ftimer2.interval

:= 350;

// СОБЫТИЯ КОМПОНЕНТА

ftimer2.ontimer

:= ind2;

//-----------------------------------------------------------

ftimer2.Enabled

:= true;

// в принципе содержимое можно перенести в процедуру // waveInProc2(), но хотелось гибкости //-----------------------------------------------------------

wcard // инициализация получения аудиоданных end;

procedure TDTMF.ind(Sender: TObject); destructor TDTMF.Destroy;

begin // блокируем очистку, БПФ и декод-е DTMF на время выдачи

begin

lock:= true;

stopplay; // запрещаем генерацию DTMF

inwav.SeriesColor := rgb(0,0,255); // синий цвет серии

wcard;

spektr.SeriesColor:= rgb(255,0,0); // красный-

ftimer.Free; ftimer2.Free;

// спектр

inwav.Free; outwav.Free; spektr.Free;

if Assigned(FOnSpektr) then FOnSpektr(self, spektr);

inherited

// сырые данные (осциллограф)

// деинициализация аудио

end;

if Assigned(FOnDataOsc) then FOnDataOsc(self,inwav); // декодированный DTMF

// выбираем окно сглаживания-

if (signal<>'')and(Assigned(FOnKeys)) then

procedure TDTMF.set_window(const Value: twindow);

FOnKeys(self, signal, a1, a2, f1, f2); lock:= false

begin fwindow:= value; case value of

end;

dB_0 //----------------------------------------------------------// СЕРВИС-МОДУЛЬ (СКЕЛЕТ) //-----------------------------------------------------------

: f_window:= 5;

// без сглаживания

... end end;

constructor TDTMF.Create(AOwner: TComponent); // регистрируем на вкладке RAMEDIA --------------------------

begin inherited Create(aowner);

procedure Register;

fvol

:= 100;

begin

flen

:= 250;

Fcntp

:= fcntpp; // по default 2048 точек БПФ

fwindow

:= dB_0;

Fabout

:= 'Badlo Sergey';

АРХИВ

RegisterComponents('RAMEDIA', [TDTMF]) end;

end.

СОДЕРЖАНИЕ

55


ПРО

граммист

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

№8 (ноябрь) 2010

Рис. 5. Создаем пакет и инсталлируем его Осталось проверить работоспособность нашего модуля.

Для

этого,

выбрав

в

меню

«File/New/Package - Delphi for Win32», создадим пакет на основе модуля <dtmf.pas> и установим его (см. рисунок 5). Создав

новый

проект

«File/New

Application»,

перенесем наш компонент на форму. После чего, станут доступными его свойства и методы (см.

procedure TForm1.DTMF1Key(Sender: TObject; key: String; a1, a2, f1, f2: Double); var s: string; begin CAPTION:= ' Тестовый спектроанализатор. Декодер-кодер DTMF (' + key + ')'; s:= key + format(' - A1= %.2n',[a1])+ formatfloat(' [0 Hz]

рисунок 6).

Также нам понадобится TChart (визуализация), TMemo

(декодированные

посылки)

и

TEdit

',f1) +

format('A2= %.2n',[a2])+ formatfloat(' [0 Hz]',f2); memo1.Lines.add(s); chart1.Title.Text[0]:= 'Декодирован ' +s

(строка ввода команд генерации) (см. рисунок 7).

end;

компонента:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key:

Теперь напишем следующий код в событиях

Char); begin if key=#13 then dtmf1.DTMF_keys:= edit1.Text end;

procedure TForm1.DTMF1Spektra(Sender: TObject; series: TBarSeries); begin

Рис. 6. Задаем параметры

АРХИВ

series1.Assign(series) end;

СОДЕРЖАНИЕ

56


ПРО

граммист

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

№8 (ноябрь) 2010

Рис. 7. Тестовая форма и события компонента После чего, запустив проект на компиляцию, введем строку для генерации. Нажав ENTER можем

наблюдать

спектр

сигнала

декодированные посылки (см. рисунок 8).

и

Данная методика, с добавлением анализатора файлов

WAV/MP3,

разработке

«SPEKTRA»

[7,

была

использована

многофункционального 8]

(см.

рисунок

9).

при ПО

Следует

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

ITU-T,

гармоник,

т.к.

не

например

учтен при

анализ

речевом

сигнале. Что это означает? Как вы наверняка знаете, человеческая речь и речь вообще, музыка

** Комментарий автора.

Именно за счет использования этой особенности речи в телефонной

и радиосвязи полоса пропускания канала ограничивается от 300 до 3400 Гц, что позволяет применить различные компандеры, системы частотного мультиплексирования. Причем, эти частоты приняты МСЭ-Т в качестве границ эффективного спектра речи.

характеризуются

большим

количеством

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

ложного

необходимо

и

детектирования

добавить

сравнивать

его

оценку с

DTMF этого

уровнями

определенных частот в спектре для речи и

музыки. Эти характерные частоты (форманты)**

Рис. 8. Окно тестового модуля спектроанализатора-кодера-декодера DTMF

АРХИВ

СОДЕРЖАНИЕ

57


ПРО

граммист

№8 (ноябрь) 2010

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

Рис. 9. Отсчеты и спектр сигнала DTMF. Буква «A»

АРХИВ

СОДЕРЖАНИЕ

58


ПРО

граммист

для

БПФ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ

№8 (ноябрь) 2010

речи

в

например

Practical Design Techniques for Sensor Signal

области 200-250 Гц и женский голос ближе к

DTMF

характерный

принципе

мужской

известны,

бас

сосредоточен

в

500-700 Гц.

Но это уже тема для отдельной статьи… Заключение Полные

исходные

тексты

спектроанализатора-кодера-декодера

компонента DTMF

и

ресурсы тестового проекта приведены в виде

ресурсов в теме «Журнал клуба программистов. Восьмой выпуск» или непосредственно в архиве с журналом. Ресурсы • •

AVR314:

Двутональный

DTMF

генератор

http://www.gaw.ru/html.cgi/txt/app/micros/avr/in dex.htm

MSP430: DTMF-Controlled http://www.gaw.ru/ html.cgi/txt/app/micros/msp430/index.htm

АРХИВ

Conditioning, Analog Devices, 1998 Detector

Data

Sheet,

http://www.miketdspsolutions.com/dtmf.pdf

2001

Рабинер Л., Гоулд Б. Теория и применение

цифровой обработки сигналов. – М., Мир, 1978

Л.А.Осипов. Обработка сигналов на цифровых процессорах.

Линейно-аппроксимирующий

метод. – М., Горячая линия - Телеком, 2001 Е.Бадло,

С.Бадло.

Спектроанализатор

Виртуальные своими

приборы.

руками.

Радиолюбитель, Минск, 2009, №3, с.32-36 • • •

http://raxp.radioliga.com/cnt/s.php?p=v3.pdf Ресурсы

анализатора

спектра

файлов

сигналов DTMF-FFT http://raxp.radioliga.com/

и

cnt/s.php?p=dtmf_res.zip

Ресурсы компонента спектроанализатора и

модуля кодирования и декодирования DTMF http://raxp.radioliga.com/cnt/s.php?p=fft.zip IDE

среда

TurboDelphi-Lite

portable

http://www.andyaska.com/?act=download&mod e=get&id=34

СОДЕРЖАНИЕ

59


ПРО

НЕВЫДУМАННЫЕ ИСТОРИИ СЕТИ AIRNET-БЕРДЯНСК

№8 (ноябрь) 2010

граммист

Звонит телефон ТП…

ТП: вы не можете подключаться к интернету, не

ние?

бесплатную сеть типа нашей.

- Здравствуйте, а сколько у вас стоит подключе- Бесплатно

провайдера

Д: ничего не знаю, включите мне контакт!!!

И короткие гудки.

...и далее в том же духе в течение 4 часов. В

Уже классика…

В сетевом чате сотрудник ТП и девушка, которая

уже 2 часа не может пройти регистрацию из 8 В

итоге

перенаправили

ее

в

помочь.

конечном

регистрацию

итоге и

девушка

теперь

любимом Вконтакте.

таки

счастлива

Как-то

чат,

в

прохожу

приезжих ноутами.

На

Первый: ого...

нашей

Первый:

возникли

чат

у

проблемы

с

моем

компьютере?!

Подхожу ближе, заглядываю на экраны. На

понимаете ситуацию. Вы сети,

период

у

нужно

ваться.

к

нас

3

одном

WiFi-

затем

Я:

сотрудник

я

вижу,

регистрацию,

что

вы

возможно

ребята,

шифрование,

Д: у меня нет никаких ТП:

че

VPN

ломаем? Там 128 бит

техподдержки этой сети. проблем!!!

на

сниффер.

зарегистриро-

Я

Wireshark,

втором тоже какой-то

тестовый

дня,

бес-

Второй: ага...

ТП: вы видимо не совсем подключились

подходе

брутить

полезно.

Д: ты кто и что делаешь в

с

Второй: ага...

вас

регистрацией?

на

парня

Д: я не поняла, это что? сетевой

по

слышу такой диалог...

ТП: а по-русски можно? сети,

своем

лавочке сидят два явно

Д: hi...

это

прошла

набережной,

Раннее

ТП: доброе утро.

ТП:

или

ТП: вы выходили в интернет через нашу сеть.

- Тю придурки...

утро...

какого-либо

вешаете?

- Тоже бесплатно.

чтобы

сеть

Д: ну, я же ходила в контакт! Что вы мне лапшу

- А потом?

пунктов.

используя

сложно-

вато. не

вам

можете

нужна

пройти

помощь?

Д: я и без всяких регистраций ходила в контакт, а

Второй: ага...

Первый (подозрительно): а ты откуда знаешь? Я: да, в общем, я его ставил...

теперь меня все время сюда кидает!!! ты что,

Звонок, беру трубку…

ТП: нет, я не хакер. В нашей сети кто угодно, на

паролем получил, но в интернет все равно не

хакер?

протяжении интернетом

пользоваться

регистрацию.

трех без

дней,

может

регистрации,

дальше

-

пользоваться но,

необходимо

чтобы

пройти

Д: я не хочу никаких регистраций!!!!! я хочу в

Пользователь: пускает! Я:

а

вы

ру?

Вконтакте

ЮМОР

VPN-подключение

операционную Однажды

Д: нет, а зачем?

зарегистрировался,

SMS

с

настроили?

Пользователь: я не понял! Может мне еще и

контакт!

ТП: вы подключены к какому-нибудь провайде-

я

систему

трафик

самому

нескольких

написать?

нарушителей

правил был перенаправлен с известной соцсети на

китайский

Google.

И

как

вы

думаете, что там стали делать эти пользователи

СОДЕРЖАНИЕ

60


ПРО

НЕВЫДУМАННЫЕ ИСТОРИИ СЕТИ AIRNET-БЕРДЯНСК

№8 (ноябрь) 2010

граммист

Вконтакте? Правильно, искать любимый сайт!

бытовой точке юзеров (при канале на инет 512

Звонит девушка…

все строго с торрентами, плюс еще куча сетевых

Д:

здравствуйте,

подскажите

ничего не нарушаю?

пожалуйста,

я

Я: а какое у вас имя пользователя?

Д: ой, а я не помню. Но ваша сеть нормально работает? Я

(быстренько

проверяю

доступность

самых

дальних точек и интернета): все нормально. Д: спасибо большое! с

троянов.

Точка

периодически

И снова телефонный разговор, звонит парень.

П: здравствуйте, а как мне подключиться к вашей сети?

ТП: сейчас регистрация приостановлена, следите

ТП... ТП:

нужно?

ТП: в каком районе П:

слушаю вас.

у

Почему-то

в

меня

ет

недель

низкая

ТП:

пару

любое

ТП:

вас

от

зафиксированы.

и

в

какому

ТП:

ТП: настоль-

к

ный компью-

Пользователь: Сейчас посмотрю... Tp-link! нас

в

сети

нет

хотспота

с

П: нет. таким

идентификатором. Вы подключаетесь к какой-то другой сети.

Пользователь: да? А я еще подумал, почему без VPN заработали торренты, но очень медленно... p.s.:

посмотрев

эту

сеть,

обнаружилось

следующее: до 30 одновременно работающих на

ЮМОР

вас

П: нет.

хотспоту

у

у

ноутбук?

вы подключаетесь? ТП:

хотел

спросить...

не

Подскажите,

уст-

П: да, я вот

подключения вас

за

ройство?

последние 2 недели

уст-

WiFi, что у

имя

странно,

почти

ройство

подскажите

Пользователь: ***

подой-

дет

скорость

из

тогда

вам

очень

пользователя.

с

хотспотов)

может быть дело? свое

адрес

одним

интернета, в чем ТП:

(называ-

рядом

проблема.

последние

вы

находитесь?

здравствуйте,

здравствуйте,

для

этого

телефон

Пользователь:

П: а что мне вообще

понять,

что это было... Звонит

пинги

и пытается качать.

полчаса

пытаюсь

падает,

ходят с потерями до 99%, но народ упорно висит

за сайтом.

Короткие гудки, я еще

килобит, без всяких излишеств типа QoS и VPN),

тер?

ТП: смартфон или КПК? П: нет.

ТП (после раздумий): PSP? П: а что это?

ТП: с какого устройства вы планируете подключаться к сети?

П (гордо): у меня BR-проигрыватель с WiFi! ТП в ступоре...

СОДЕРЖАНИЕ

61


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