Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
14.76 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

++++ BUY

>>m

 

 

 

 

coding

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

++++

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

++++

++++

++++

++++

++++

++++

++++

warning

Рекламаполностью законна! Но— незаконнокопирование всвойтвитчужого контента. Этогомы тебеделатьнесоветуем.

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

Исходяизэтого, заюзаемследующуюрегулярку:

<text>(.*)</text>.

ДляиспользованиярегулярныхвыраженийвPython подключиммодульсназваниемre ииспользуемегометод findall, которыйвозвратитмассив. Получимследующее:

++++

links

• Обовсехвозмож-

++++ностяхcURL читай наофициальном сайтеhttp://pycurl. sourceforge.net.

++++

http://apiwiki.twitter. com — документация API твиттера.

++++

www.python.org —

официальныйсайт

Python.

++++

http://python.su/ forum — полезный питоновскийфорум.

++ ++

++++

dvd

Надиске, кроме

++++исходниковинеобходимыхустановочных файлов, тынайдешьтакжевидео

++++автораобустановке инастройкесреды программирования.

import re

rez = re.findall("<text>(.*)</text>",data)

Алгоритмскриптаактивностибудеттакой:

беремудонорасамоепоследнеесообщение;

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

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

Осталосьразобратьещедваскрипта, которыесвязаныс ростомрекламнойсети, — тоесть, расширениемсписка друзей.

ТВИТТЕРЯНИН, ГДЕТЫ?

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

Добавление в друзья

Добавить в друзья пользователя, зная ID или логин URL: http://twitter.com/friendships/create/ id.format

Форматы результатов (format): xml, json Метод запроса: POST

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

Пример запроса: http://twitter.com/friendships/ create/bob.xml

Скрипт

имитации

активности

import re, sys, pycurl, StringIO #инициализация обьектов для посылки запросов data = StringIO.StringIO()

curl = pycurl.Curl()

#вместо donor нужно написать имя пользователя, которого нужно копировать curl.setopt(pycurl.URL,

'twitter.com/statuses/user_timeline/ donor.xml') curl.setopt(pycurl.WRITEFUNCTION,

data.write)

#запуск запроса на получения сообщений curl.perform()

#применение регулярки для выделения из текста лишь сообщений и сохранения их в маcсив donor

donor = re.findall("<text>(.*)</text>", data.getvalue())

#освобождаем буфер для следующего запроса data.truncate(0)

#вместо user пишем свое имя твиттера curl.setopt(pycurl.URL, 'twitter.com/statuses/user_timeline/user. xml')

curl.perform()

#поиск всех сообщений и сохранение их в маcсив my

my = re.findall("<text>(.*)</text>", data.getvalue())

#если последнего сообщения донора нет if donor[0] not in my:

#настраиваем запрос для отсылки сообщения curl.setopt(pycurl.URL,

'twitter.com/statuses/update.xml') #не забываем поменять имя и пароль curl.setopt(pycurl.USERPWD, 'name:passwd') curl.setopt(pycurl.POSTFIELDS,

'status=' + donor[0]) curl.setopt(pycurl.POST,1) curl.perform()

print 'one update posted' else:

print ‘no new updates’

#не забываем освободить память curl.close()

1)Поискпоимени.

2)Поискпоспискудрузей.

3)Случайныйвыбор.

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

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

++++

090

XÀÊÅÐ 04 /124/ 09

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>>

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

codingw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Питон всегда с улыбкой

мыхотимпродаватьмаечкиснарисованнойБритниСпирс. Ясноедело, нужнонайтиеетвиттеридостатьсписоктех, ктоегочитает. Разумеется, напервыхпорахтакойосновательныйтаргетингмырассматривать небудем, поэтомуврамкахстатьирассмотримтретийвариант— случайныйвыбор. ДляэтоголеземвAPI ивидим, что, пославGet-запрос наURL http://twitter.com/statuses/public_timeline.xml, мыполучим20

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

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

<screen_name>(.*)</screen_name>.

Получивсписокиз20 пользователей, нужнопопроситьихдобавитьнас вдрузья. Благо, существуеттакаянаукапсихология, ионаговорит, что, еслидобавитьпользователя, тоонсбольшойвероятностьюдобавитнас ибудетчитатьнашисообщения:).

ОпятьобратимсякAPI, вкоторомуказано, чтодлядобавлениявдрузьяне-

обходимопослатьPost-запроснаURL http://twitter.com/friendships/create/ spirit.xml, гдевместоspirit придетсявставитьимянужногоаккаунта. ПереводявсеэтонаPython, получимосновныестрочкидлядобавления вдрузья(остальноеможноподсмотретьнадиске):

curl.setopt(pycurl.URL, 'http://twitter.com/friendships/create/' + name + '.xml')

Наши стрелы в твиттере

curl.setopt(pycurl.USERPWD,'spiritua:passwd')

curl.setopt(pycurl.POST,1)

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

подозрительной его фотография в погонах, — Прим. Лозовского).

Обновление статуса (отсылка сообщения) пользователя

URL: http://twitter.com/statuses/update.format Форматы результатов (format): xml, json Метод запроса: POST

Параметры: status — обязательный параметр, который содержит текст нового статуса. Используйте URL-кодирование при необходимости. Длина текста должна быть не более 140 символов.

«РЕДИСКА» — ПЛОХОЙЧЕЛОВЕК

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

http://twitter.com/statuses/friends.xml

http://twitter.com/statuses/followers.xml

Витоге, получимследующийкод:

#настроим cURL на получение списка друзей curl.setopt(pycurl.URL,

'http://twitter.com/statuses/friends.xml')

curl.setopt(pycurl.USERPWD,’spiritua:passwd') curl.setopt(pycurl.WRITEFUNCTION, data.write)

XÀÊÅÐ 04 /124/ 09

091

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

++++ BUY

>>m

 

 

 

 

coding

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

++++

++++

++++

++++

++++

++++

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Удобное программирование в Eclipse

++++

++++

++++

++++

Питон всегда с улыбкой

++++

++++

Твиттер часто читают через

++++специальные программы

Логотип TweetTornado

++ ++ #запустим запрос curl.perform()

#сохраним результаты в переменную friends friends = data.getvalue()

++++#очистим буфер для следующего запроса data.truncate(0)

#получим список людей, которые читают нас curl.setopt(pycurl.URL,

++++'http://twitter.com/statuses/followers.xml')

curl.perform()

followers = data.getvalue()

++++Впеременныхfriends, followers будетхранитьсярезультатвформате xml, полученныйоттвиттера. Обработавихужезнакомойнамрегуляркой напоисктегов<screen_name>, получиммассивы:

++++ 092

friends = re.findall("<screen_name>(.*)</screen_name>", friends)

followers = re.findall("<screen_name>(.*)</screen_name>", followers)

Атеперьможноприступатькудалению, посылаязапросынаURL http:// twitter.com/friendships/destroy/spirit.xml. Врезультатедолженполучить-

сяпримерноследующийкод(полныйисходникрекомендуетсякуритьс нашегодиска):

#подключим библиотеку time для команды sleep import time

curl.setopt(pycurl.POST, 1) #цикл по всему списку друзей for friend in friends:

#проверка — читает ли друг нас if friend not in followers:

#если не читает — то для нас он не друг curl.setopt(pycurl.URL, 'http://twitter.com/friendships/destroy/’+ friend+'.xml')

curl.perform() #ждем 2 секунды time.sleep(2)

ВПУТЬ!

Мырассмотрелиосновныетезисысозданиярекламнойсетивтвиттере. Это— базовыйнабор, которогохватитнапервоевремя. Теперь самсможешьихрасширять, исходяизсвоихпотребностей, например, добавить скриптувозможностьработатьснесколькимиаккаунтамиилииспользоватьпрямыетекстовыесообщения, таргетингидругиезанимательные вещи. Предлагаюознакомитьсяспримеромизчастнойпрактикиодного злогохакера. Итак, послерегистрацииаккаунтаонустанавливаетфотографиюизаполняетвсеполявпрофиле. Далеенастраиваеткронназа- пускимитацииактивностигде-тоспериодичностьюв3 часа. Ждетнеделю и— добавляетвкронзапись, позволяющуюразв3 днязапускатьскрипт сначаланаочисткуот«редисок», азатем— наприглашение100 новых юзеров. Обаккаунтеонзабываетдотехпор, покаунегонесоберется где-то2000 фаловеров. Наэтомоностанавливаетскриптыроста, оставляя лишьимитациюактивности. Приблизительноразвнеделюразмещается рекламноеобъявление. z

XÀÊÅÐ 04 /124/ 09

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P

 

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

 

g

 

 

 

 

 

df

 

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

++++ BUY

>>m

 

 

 

 

 

 

BUY

 

 

 

 

 

 

coding

w Click

 

 

 

 

 

 

m

w Click

to

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

df

 

n

e

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

++++

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

++++

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

++++

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

АЛЕКСЕЙ ЧЕРКЕС

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/ ALEKSEY.CHERKES@GMAIL.COM /

 

 

 

 

 

 

 

 

 

 

 

 

++++

++++

++++

ПИТОНдляматерых хардкорщиков

++++

++++

++++

КуемассемблерныевставкивPython спомощьюкошерногоCorePy

Япостоянноиспользуювработеopen source программыинеперестаюудивляться, какиенеобычныепроектыпоройзарождаютсяв этойсвободнойсреде. Намойвзгляд, коммерческиеприложенияникогданебудутотличатьсятакимполетоммысли, каквсредеоткрытогоПО.

++++

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

++++ ниидвухязыковпрограммирования: ассемблераиPython’a. Такойтандем нечастовстречаетсянапрактике, ведьэтидваязыкарешаютабсолютноразныезадачи: ассемблермаксимальноприближенкаппаратуре, предоставляетпрограммистунаднейполныйконтроль, нопрограммиро-

++++

ваниенанем— долгое, иногданудноеикропотливоезанятие, требующее

 

нечеловеческойвнимательностиитерпения. Python, наоборот, проекти-

 

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

 

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

++++

двухподходоввыглядитедваливозможной. ВPython даженетпонятия

указателя, — тутвообщенеидетречиопрямойработеспамятью, ведьвсю грязнуюработувыполняеттрудолюбивыйgarbage collector! Атакиевещи, какдинамическаятипизацияифункции, являющиесяобъектамипервого

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

++++ ОБЩИЙОБЗОР

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

++++

проводитьмашинно-зависимуюоптимизациюPython-программ,которая

 

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

 

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

 

CorePy поддерживаетпроцессорыx86, x86_64 (споддержкойSSE),

++++

PowerPC (PPC32 иPPC64), VMX/AltiVec иCell SPU. Онможетработатьв

 

операционныхсистемахlinux иOS X. Microsoft Windows всписке почему-

 

тонезначится;).

ВЕСЬCOREPY МОЖНОРАЗБИТЬНАТРИОСНОВНЫХСЛОЯ:

1)Instruction Set Architectures (ISAs). Этобиблиотекиобъектов, кото-

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

(например, x86 иSSE).

2)InstructionStreams илипотокикоманд. Этоконтейнерыдляобъектовизпункта1. Отвечаютзахранениепоследовательностиинструкцийи завзаимодействиесоперационнойсистемойдляихисполнения.

3)Processors. Выполняютпотокикомандиотвечаютзапередачуи возвратаргументов. Возможносинхронноеиасинхронноевыполнение потоков.

Вначалеработыпрограммистунеобходимосоздатьодинизобъектов InstructionSream. Затемпустойпотоккоманднаполняетсядругими объектами, каждыйизкоторыходнозначноидентифицируетмашинную инструкциюиеепараметры. Наданномэтапеникакогокодареальноне создается! Мыпростоописываемнужнуюнампрограмму, наполняяколлекциюInstructionSream. Полученнаяпоследовательностьпередается наисполнениеклассу, представляющемуабстракциюпроцессора. ВнутренниемеханизмыCorePy парсятпереданныйнамиInstructionStream игенерируютнаегоосновереальныймашинныйкод. Теперьегоможно вызыватьпочтикакобычнуюфункцию, обращаяськнемучерезспециальныйинтерфейсклассаProcessor.

РУКИЧЕШУТСЯРАБОТАТЬ

Пришловремяиспытатьэтуштукувбоевыхусловиях! Давайреализуем какой-нибудьнесложныйалгоритмдвумяспособами: наассемблере

инаобычномPython, азатемсравнимобаметодапоскоростиработы

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

++++

094

XÀÊÅÐ 04 /124/ 09

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

NOW!

r

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NOW!

r

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

>>

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

codingw

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ТУТОПЯТЬВСЕМЕТОДЫ, НO N – МАЛО

 

 

ПРИОГРОМНЫХN (ДО16 ТЫСЯЧ) ЗАМЕТНО

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(0 < N <= 1000). АССЕМБЛЕРПАШЕТ

 

 

 

ЯВНОЕОТСТАВАНИЕASM-ВЕРСИИ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

БЫСТРЕЕВСЕХ!

 

 

 

 

 

ОТСТАНДАРТНОЙSORT

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.8

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

core

 

 

 

 

 

 

core

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.7

 

 

 

 

 

sort

 

 

 

 

 

 

psycho

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

trivial

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sort

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Timeline

-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Timeline

 

 

 

 

 

 

 

 

 

 

 

 

(log)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.1

 

 

 

 

 

 

 

 

-5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

200

400

600

800

1000

1200

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.0

 

 

 

 

 

 

 

 

ЛОГАРИФМОТВРЕМЕНИРАБОТЫВСЕХЧЕТЫ-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

2000

4000

6000

8000

10000 12000 14000

16000

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N

 

 

 

 

РЕХМЕТОДОВ. 0 < N <= 7000. ASM ПРЕВОСХОДИТ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ОБЫЧНУЮВЕРСИЮНАНЕСКОЛЬКОПОРЯДКОВ, НО

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

УСТУПАЕТСТАНДАРТНОЙSORT ИЗ-ЗАИСПОЛЬЗО-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ВЕРСИЯСPSYCO-ОПТИМИЗАЦИЕЙ

 

 

 

ВАНИЯПРИМИТИВНОГОАЛГОРИТМА

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

РАБОТАЕТБЫСТРЕЕ, НОКОМУ-ТОТАКОЙ

 

 

 

 

 

Title

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПРИРОСТПОКАЖЕТСЯНЕСУЩЕСТВЕННЫМ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

core

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pshyco

 

 

2

 

 

 

 

psycho

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

trivial

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

trivial

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sort

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(log)Timeline

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Timeline

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

-2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

-3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0

 

 

 

 

 

 

 

 

-4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

200

400

N

600

800

1000

 

0

1000

2000

3000 N 4000

5000

6000

7000

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

тельностьюцелыхчисел(этосамыйсложныйраскладдляпузырька,

 

трукцийвпривычномформате. Янесталупускатьхорошейвозможности

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

четырьмяметодами:

 

 

 

 

 

 

листингвформатеNASM. Наверное, егоможнодажескомпилировать

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

• Тупая, наивнаясортировка, реализованнаяначистомPython без

 

:). Глядянаобеврезки, тыбезтрудапоймешь, какработаетCorePy. Про

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

всякихпримочек;

 

 

 

 

 

 

модульPsyCo иболеевысокоуровневуюоптимизациюPython-программ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

• Тожесамое, толькосоптимизациейсредствамиPsyCo;

 

 

тыможешьпрочитатьвпредыдущемномереz.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

• Собственнаяреализациянаассемблере;

 

 

 

Какужебылосказано,CorePyподдерживаетнесколькопроцессорных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

• Стандартнаяфункцияsort, предоставляемаяинтерпретатором.

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Времяработызамеряетсяспомощьюмодуляtimeit. Собраннаястатис-

 

единственноймнезнакомой:).Программныемоделиотличаютсядруготдруга

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

тикаотраженанаграфиках. Онисгенерированыспомощьюбиблиотеки

 

восновномнаборамикоманд.Дляработыстемилиинымнаборомнеобходи-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PyLab — опенсорсовомубийцеMatLab. Самыйглавныйлистинг, содер-

 

моимпортироватьcorepy.arch.*.isa(вместо*подставьимяархитектуры).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

жащийCorePy-код, помещеннаврезке. Кромеосновныхкомпонент, в

 

Вэтихмодуляхнаходятсяобъекты, изкоторыхпотомкомпонуются

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

программы. ДляначалаработысоздайэкземплярInstructionStream (в

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

XÀÊÅÐ 04 /124/ 09

 

 

 

 

 

 

 

 

 

 

 

 

095

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

++++ BUY

>>m

 

 

 

 

coding

w Click

to

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

++++

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

++++Машинный код, со-

зданный CorePy на

++++основе нашего

# Platform: linux.spre_linux_x86_32 BITS 32

++++SECTION .text

 

 

global bubble_sort

 

 

bubble_sort:

 

 

 

 

PROLOGUE:

++++

push ebp

 

 

mov ebp, esp

 

 

push edi

 

 

push esi

++++

push ebx

 

BODY:

 

BEGIN_ALL:

 

mov esi, 0

++++

mov ecx, 0

 

BEGIN_LOOP:

 

mov edi, dword [ebp + 8]

 

mov eax, dword [edi + ecx * 4 + 0]

++++

mov ebx, dword [edi + ecx * 4 + 4]

 

cmp eax, ebx

 

jle LE

 

mov esi, 1

++++

mov dword [edi + ecx * 4 + 0], ebx

 

mov dword [edi + ecx * 4 + 4], eax

 

LE:

 

inc ecx

++++

cmp ecx, dword [ebp + 12]

 

je END_LOOP

 

jmp BEGIN_LOOP

 

END_LOOP:

++++

cmp esi, 0

 

jne BEGIN_ALL

 

EPILOGUE:

 

pop ebx

++++

pop esi

 

pop edi

 

leave

 

ret

++++

 

примереэтоcode). Затемспомощьюметодаadd внегозаносятсяконкретныекоманды, например:

++ ++

code.add(x86.mov(eax, 0)).

Мыдобавиликкомандамизcode операциюобнуленияeax. Примерно

++++ такисоставляетсявсяпрограмма. x86 — этопсевдонимдлясоответствующейISA. Длятогочтобывсевремянеписатьcode.add(команда), можно простовызватьфункциюx86.set_active_code(code) дляэкземпляра твоейISA. Послеэтоговсесоздаваемыеинструкциибудутавтомати-

++++

ческидобавлятьсякcode. Названияиструктурапараметровкоманд

 

полностьюсовпадаютсассемблернымианалогами, поэтомузапомнить

 

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

 

изcorepy.arch.x86.types.registers. Далеевпараметрахкомандпросто

++++

пиши, чтонужно: eax, bp ит.д. Здесьестьоднахитрость: регистры— это

 

обычныеобъекты. Поэтомудлянихможновводитьпсевдонимы. Впри-

 

мереяввелальтернативноеимяis_finish дляesi. Такойподходоблегчает

Код нашей функции на CorePy

import corepy.arch.x86.isa as x86 import corepy.arch.x86.platform as env

from corepy.arch.x86.types.registers import * from corepy.arch.x86.lib.memory import MemRef

code = env.InstructionStream() lbl_begin = code.get_label('BEGIN_ALL') lbl_loop = code.get_label('BEGIN_LOOP') lbl_le = code.get_label('LE')

lbl_end = code.get_label('END_LOOP') is_finish = esi # флаг завершения x86.set_active_code(code)

#Принимаем через стек два параметра: начальный адрес массива и максимальный допустимый индекс в нем code.add(lbl_begin)

x86.mov(is_finish, 0) x86.mov(ecx, 0) code.add(lbl_loop)

#Заносим в edi адрес начала массива

#Он всегда состоит из 4байтных целых чисел

x86.mov(edi, MemRef(ebp, 8))

x86.mov(eax, MemRef(edi, disp=0, index=ecx, 4) x86.mov(ebx, MemRef(edi, disp=4, index=ecx, 4)

#Если порядок сортировки нарушен...

x86.cmp(eax, ebx) x86.jle(lbl_le)

#меняем элементы местами x86.mov(is_finish, 1)

x86.mov(MemRef(edi, disp=0, index=ecx, 4), ebx) x86.mov(MemRef(edi, disp=4, index=ecx, 4), eax) code.add(lbl_le)

x86.inc(ecx)

x86.cmp(ecx, MemRef(ebp, 12)) # уже конец? x86.je(lbl_end)

x86.jmp(lbl_loop) code.add(lbl_end)

#Если не было ни одной перестановки, то массив отсортирован x86.cmp(is_finish, 0)

x86.jne(lbl_begin)

восприятие, какправило, сильнозапутанныхассемблерныхпрограмм. Механизмыадресациитрадиционносчитаютсясложнымаспектомв программированиинаассемблере. Действительно, x86 поддерживает несколькоеетипов: прямая, косвенная, базовая, индексная, сосмещениемит.д. Вэтихразновидностяхнемудренозаблудиться. ДляформированияуказателейнаячейкипамятиCorePy предоставляетудобный классMemRef (передаетсякакпараметрсоответствующимконструкторамкоманд), которыйможетзаметнооблегчитьработуиповысить визуальнуюнаглядностькода. Например: MemRef(0xABCD) — указатель наабсолютныйадрес, MemRef(rip, -1024) — указательнаячейкупамяти,

смещеннуюотносительноIP, MemRef(rsi, disp = 0, index = rcx, scale = 4)

— эффективныйадрес= base + (index * scale) + disp (индекснаябазовая адресациясосмещением). Последнийслучайиспользуетсявпримере.

++++

096

XÀÊÅÐ 04 /124/ 09

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>>

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

codingw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

абсолютнопрозрачнодляпрограммиста. Иногдаоченьудобноисполь-

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

CorePy, можновстретитьтакиеучасткикода:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

for i in xrange(0, 65): code.add(x86_isa.pop(edi))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Здесьвместотого, чтобызаниматьсяcopy and paste, разработчикинапи-

 

 

 

 

 

 

 

салицикл, которыйсоздает65 pop-инструкций, идущихдругзадругом. Я

 

 

 

 

 

 

 

думаю, развивэтуидею, можносделатьбиблиотекуудобныхмакросов—

 

 

 

 

 

 

 

ииспользованиестарогодоброгоasm’астанетещекомфортнее.

 

 

 

 

 

 

 

 

 

АНАЛИЗИРУЕМРЕЗУЛЬТАТЫ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

Мыполучиливыигрышоттысячидодесятитысячразпоскорости

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

элементоввмассивеэтототрывстановитсявсезаметнее. Награфикахс

 

 

 

 

 

 

 

четырьмякривымиявывелзависимостьлогарифмавременивыпол-

 

 

 

 

 

 

 

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

 

 

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

 

 

 

 

 

 

 

большимN (дотысячиидосемитысяч) — награфикахсдвумялиниями

 

 

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

 

 

 

 

 

 

 

 

выводятсяабсолютныевеличиныисравниваютсяметодысприблизи-

 

 

 

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

 

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

 

 

 

переходов. ОбъектыметоквCorePy создаютсяклассамиInstructionStream

 

времявыполненияPython-реализациисPsyCo-оптимизациейибез.

 

 

 

— выглядитприблизительнотак: lbl_loop = code.get_label(«LOOP»). Здесь

 

Видно, чтоPsyCo работает, новэтомтестеэффект, всеже, неслишком

 

 

 

lbl_loop — этоноваяметка, аcode — потоккоманд. Еслиуcode запросить

 

убедителен— кривыеидутпочтиоднаподдругой. Надругомграфике

 

 

 

ещеоднуметкусименем«LOOP», вернетсятотжеэкземпляр. Дляисполь-

 

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

 

 

 

зованиясозданнойметкиеенужнопоместитьвкод. Этооченьпросто:

 

реализации— sort работаетприблизительнонаодинпорядокбыстрее

 

 

 

code.add(lbl_loop) добавляетметкунатекущуюпозициювкоде. Концепция

 

 

 

 

 

 

 

 

 

 

снашимколичествомэлементов, нозаметнатенденциякувеличению

 

 

 

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

 

этогоразрыва. Связаноэтостем, чтовстроенныефункциипишутнаC, и

 

 

 

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

 

ониобычнооченьхорошооптимизированы. Иконечно, тамиспользует-

 

 

 

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

 

сяалгоритмсменьшейсложностью, чемn**2, какунашейbubble sort :).

 

 

 

тонавернякаобратилвнимание, чтоCorePy разделяеткаждуюфункцию

 

 

 

 

 

 

 

 

 

 

 

натричастиивводитпредопределенныеметки: PROLOGUE, BODY и

 

 

 

ПОДВЕДЕМИТОГИ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

EPILOGUE. Все, чтомыпишем, попадаетвглавнуючасть— BODY. Код

 

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

 

 

 

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

 

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

 

 

 

ниябинарногоинтерфейсамеждуфункциейивнешниммиром. Наличие

 

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

 

 

 

такойавтоматизации— ещеоднопреимуществоCorePy: теперьпро-

 

приведенацитатаодногоизпользователей. Онговорит, чтоCorePy опять

 

 

 

граммисттратитменьшесилнареализациюрутинныхвещей, такихкак

 

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

 

 

 

инициализациярегистраbp указателемнавершинустекаит.п.

 

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

 

 

 

CorePy используетстекдляпередачипараметроввфункции. Настороне

 

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

 

 

 

Python-кодадляэтогонужноиспользоватьспециальныйклассExecParams.

 

почтифеерическоеудовольствие:). Количествопрограмм, используе-

 

 

 

Унегоестьвосемьполей: p1, p2, ... , p8 — каждоесоответствуетодномуиз

 

мыхврабочемпроцессе, приэтомнеувеличивается. Тыпо-прежнему

 

 

 

восьмипараметров, которыеможнопередатьвфункцию. Такойобъект

 

работаешьсоднимPython-интерпретатором, азначит, ненужночитать

 

 

 

передаетсяэкземпляруклассаProcessor вовремязапускапроцедуры. Из

 

документациюкнезнакомымкомпиляторамидругимутилитам, которы-

 

 

 

ассемблерадоступкпараметрамосуществляетсяпостаринке: черезсме-

 

митыникогданепользовался(илипользовался, нодавно). Этоможет

 

 

 

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

 

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

 

 

 

первыйпараметрвeax, напишиследующее: x86.mov(eax, MemRef(ebp, 16)).

 

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

 

 

 

Длявозвратазначенийизфункцийиспользуетсярегистрспредопределен-

 

областях: встраиваемыеприложения, научныерасчеты, производство

 

 

 

нымименем. Обычноэтоgp_return. Разумеется, ассемблеримеетсмысл

 

игр— итакдалее. Отличнаятехнология! z

 

 

 

 

 

 

применятьдляобработкибольшихмассивовданных— тольковэтомслучае

 

 

 

 

 

 

 

 

 

 

 

можноувидетьповышениебыстродействия. Номногоинформациичерез

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

решение. Например, можнопользоватьсяклассомarray изстандартной

 

 

 

Запуск

 

 

 

 

 

 

 

библиотеки. ЭтообычныйдинамическийгомогенныймассивдляPython.

 

 

 

 

 

 

 

 

 

фективныприработесбольшимиблокамиоднотипныхэлементов. Ктому

 

 

нашей

сортировки

 

 

 

 

Средивстроенныхтиповестьтолькогетерогенныесписки, ноонинеэф-

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ассемблерногокода. Поэтомуипоявилсяклассarray — унегоестьметод

 

 

 

import corepy.arch.x86.platform as env

 

 

 

 

buffer_info(), возвращающийадресначаламассиваиколичествоэлементов

 

 

 

proc = env.Processor()

 

 

 

 

 

 

внем. Этотадресможноиспользоватьнапрямуюизассемблера, всвоем

 

 

 

params = env.ExecParams()

 

 

 

 

 

 

примереятакисделал. CorePy предоставляетпохожийклассспочти

 

 

 

def sort(array):

 

 

 

 

 

 

идентичныминтерфейсом— extarray. Вотличиеотстандартногоarray, он

 

 

 

bi = array.buffer_info()

# Подготовка параметров

 

 

 

 

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

 

 

 

params.p1 = bi[0]

# Начало массива

 

 

 

 

 

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

 

 

 

params.p2 = bi[1] — 1

# Количество элементов

 

 

 

 

Плюс, наLinux поддерживаетсятехнологияhuge pages, иееиспользование

 

 

 

proc.execute(code, params = params)# Запуск asm — кода!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

XÀÊÅÐ 04 /124/ 09

097

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

>>m

 

w Click

to

 

 

 

 

phreaking

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ЕВГЕНИЙ «VSHMUK» БЕЙСЕМБАЕВ

/ DIVER@EDU.IOFFE.RU /

ИНФРАКРАСНАЯ ЛЕНЬ

Управлятьспультаможнонетолькотелевизором

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

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

«Почемубынепоуправлятьсветомсегопомощью?» — подумаля.

Ивзялсязареализациюидеи.

>> phreaking

Конечно, впродажеестьнормальные, «цивильные» системыдистанционногоуправлениясветомвкомнатах. Обычноониидутвкомплекте,

— какчастиразрекламированного«умногодома». Номыжехакеры? Поэтомубудемделатьумныйдомсвоимируками, чтовразыдешевлеи интереснее.

ПУЛЬТ

Понадобитсянамвсегоничего: ИК-пульт(подойдетпрактическилюбой), микроконтроллер, ИК-датчикитакназываемыетвердотельныереле.

КцифровойножкеконтроллерапривесимИК-датчик, который, поймав изэфиранужныеданные, отошлетнарелеимпульсвключения/выключения. Начнемспульта. ЛюбойПДУдлянас, какэлектронщиков, имеетдве характеристики. Эточастотамодуляции, такназываемаянесущая, иметод кодированиясигнала. С частотой все просто — это то, насколько быстро «моргает» излучатель. Как правило, попадаются частоты 36 кГц, 38 кГц и 40 кГц. А вот с методами модуляции придется повозиться, так как каждый производитель использует свой протокол. Не факт, что метод кодирования, использовавшийся на моем пульте, подойдет к твоему. Лично я тыкал в кнопки и смотрел сигнал с приемника на осциллографе. У тебя осцильника может и не быть, но информация в интернете по протоколам разных производителей ищется очень легко. В любом случае — подробнее по ним читай далее, в отдельной главе. Незабудьпроверитьпультнапризнаки жизни, этосэкономитнемалонервов. Направьнанегообъективцифровой камерысвоегомобильникаипонажимайкнопочки. Матрицакамеры восприметизлучениеработающегопультакакярко-синее, почтибелое.

КОНТРОЛЛЕР

Схему я делал на оказавшемся под рукой Atmel AT91SAM7X128. Это очень крутой МК архитектуры ARM7. Главный его плюс — не нужен программатор: контроллер замечательно шьется через встроенный USB-порт. А вообще, «Атмелы» всегда славились продвинутой периферией в своих контроллерах. Поэтому советую приобрести хотя

бы один, поверь, для него найдется применение в любой задаче. Конкретно в нашем случае, такая примитивная функция, как расшифровка сигнала с пульта и воспроизведение некоторых действий, могла бы решиться намного более простым 8-битным контроллером, а использование AT91SAM7X — пушка в вопросе обстреливания воробьев. Но за дешевизной мы не гонимся, а гонимся за удобством программирования, наглядностью и переносимостью на другие проекты. Итак, контроллервнашейзадачедолжениметь, какминимум:

Одинлогическийвход, кудамыбудемподключатьИК-сенсор;

Одинлогическийвыход, гдебудетвисетьреледлявключениясветав комнате. Еслихочешьсделатьконтроллер«умнее», тонадосугеприде- лайкнемуЖК-дисплейсвыводимойинформацией(дляуправленияему понадобитсяещеоколо8-милогическихвыводов);

Изпериферии— одинтаймердлязамеразадержек.

ДАТЧИК

ТакжепонадобитсяИК-датчикнанужнуютебенесущуючастоту. Добываетсяонвмагазинахэлектроники, барахолкахиливстарыхтелевизорах/ видиках. Скореевсего, называтьсяонбудетVishay TSOP18XX (наXX кГц). Питаетсяот5 или3,3 В, внутриимеетвсенеобходимыефильтрыиусилители, анавыходотдаетуженормальныйлогическийсигнал, который можнобезпосредниковзаводитьналогическуюножкумикросхемы. ДатчиквыбирайсовместимымпонесущейчастотествоимПДУ. Настроенныйнадругуючастотутожебудетработать, нотолькоеслисветитьв неговупор. УмоегоSony RM-836 несущаяравна36 кГц, соответственно, исенсорякупилTSOP1836, — оннаиболеечастоиспользуемый.

РЕЛЕ

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

098

XÀÊÅÐ 04 /124/ 09

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

>>

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

phreakingw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

Таквыглядитнашерелесдвухсторонисоснятымрадиа-

Вотчтовиднонаосциллографе. Последовательностьчитается

 

 

тором. Радиаторстермопастой— длязадачтипа«руление

довольнолегко

 

 

пылесосом»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Светимпультомпрямовглаз

XÀÊÅÐ 04 /124/ 09

099

 

Соседние файлы в папке журнал хакер