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

 

 

 

 

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

>> codingto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Таблица релевантности частоты кадров

 

 

 

 

 

 

Нашкод

 

 

 

 

 

 

 

 

 

 

 

 

#include "DarkGDK.h" // заголовочный файл

 

 

 

 

 

 

void DarkGDK ( void ) //точка входа — главная функция

 

 

 

 

 

{

 

Запущенное демо-приложение

 

 

 

dbSyncOn( ); // берем перерисовку экрана под свой

 

 

 

 

 

 

контроль

 

структуры,атакжемеханизмыуправленияпамятью(ссылки,указатели,

 

 

dbSyncRate ( 60 ); // устанавливаем частоту

 

 

 

перерисовки экрана

 

etc),присущиеэтомуязыку.

 

 

dbRandomize ( dbTimer ( ) ); // инициализируем

 

 

 

 

 

 

счетчик случайных чисел

 

 

Инсталляция

 

 

for ( int i = 1; i < 50; i++ ) {

 

 

 

 

 

 

 

Надеюсь,тыужеустановилсебеVisualC++2008?Сразурассмотримпро-

 

 

dbMakeObjectSphere ( i, 1 ); // создаем сферу

 

цессинсталляциибиблиотеки.Внеместьнеожиданныемоменты.Во-пер-

 

 

dbPositionObject ( i, dbRnd ( 20 ),

 

вых,втвоейсистемеобязательнодолженбытьMicrosoftDirectX9.0SDK.

 

 

dbRnd ( 20 ), dbRnd ( 20 ) );

 

Послераспаковкиизапускаинсталляциинапервыйувиденныйвопрос

 

 

//позиционируем ее

 

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

 

 

 

 

организации.Следующийвопросиспрашиваетнашегоразрешенияхотя

 

 

dbScaleObject ( i, 100 + dbRnd ( 400 ),

 

быодинраззапуститьсистемуVisualC++.Советуюпроделатьэтодействие:

 

 

100 + dbRnd ( 400 ), 100 + dbRnd ( 400 ) );

 

ничегоплохонепроизойдет(хорошеготоже).Затем—смелоотвечай

 

 

// изменяем размер

 

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

 

 

dbColorObject ( i, dbRgb ( dbRnd ( 255 ),

 

безменя.

 

 

dbRnd ( 255 ), dbRnd ( 255 ) ) );

 

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

 

 

// устанавливаем цвет

 

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

 

 

dbSetObjectSpecularPower ( i, 255 );

 

Добавьих,проделавследующиедействия.Откройпапку,кудаустановлена

 

 

// устанавливаем отражающее свойство материала

 

студия,вней—подпапкуVC,затем—Expressи,наконец,—VCProject.У

 

 

dbSetObjectAmbient ( i, 0 );

 

меняполучилсятакойпуть:D:\Program Files\Microsoft Visual

 

 

// отключаем окружающий свет

 

Studio 9.0\VC\Express\VCProjects.Находясьвэтойпапке,создай

 

}

 

подпапку,названиекоторойбудетгруппойпроектоввстудии.Послечего,

 

 

dbPositionCamera ( 10, 10, — 20 );

 

ужевэтойпапке,создайещеодну,котораябудетподгруппойдлявизардов.

 

 

// позиционируем камеру

 

Яназвалихсоответственно:WizardsиDarkGDK.Теперьэтисамыевизарды

 

 

while ( LoopGDK ( ) )

 

надосюдаскопировать.Онинаходятсявпапке,кудаустановленаDark

 

 

{ // пока программа может работать

 

GDK—вподпапкахWizards,Files(вмоемслучаепутьтакой:D:\Program

 

 

dbText ( 0, 0, "Use the up and down arrow keys to

 

Files\The Game Creators\Dark GDK\Wizards\Files).Простоско-

 

 

move the camera");

 

пируйвсеимеющиесятамфайлывранеесозданнуюдиректорию. Можешь

 

 

// выводим текст

 

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

 

 

if ( dbUpKey ( ) ) // нажата ли клавиша ВВЕРХ

 

Ага,ошибка!Закрывайстудию.Сейчастыувидишь,каклегкоможноре-

 

 

dbMoveCamera ( 1 ); // перемещаем камеру

 

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

 

 

 

 

операционки;респекттебекакреальномуанглоязычномупацану,можешь

 

 

if ( dbDownKey ( ) ) // нажата ли клавиша ВНИЗ

 

смелопропуститьэтотабзац).Чтобыисправитьситуацию,создайвпапке

 

 

dbMoveCamera ( -1 ); // перемещаем камеру

 

пользователя(например,C:\Documents and Settings\имя юзера\)

 

 

 

 

следующиекаталогииподкаталоги: My Documents\Visual Studio

 

 

for ( int i = 1; i < 50; i++ )

 

2008\Dark GDK.ЗатемскопируйсюдасодержимоеподпапкиWizards\

 

 

dbRotateObject ( i, dbObjectAngleX ( i )

 

Projects тойпапки,кудаустановленабиблиотекаGDK.

 

 

+ 0.1, dbObjectAngleY ( i ) + 0.2,

 

Все,теперьпроектысоздаются,убедисьлично.

 

 

dbObjectAngleZ ( i ) + 0.3 );

 

 

 

 

 

 

//вращаем каждую сферу

 

 

Первое испытание

 

 

 

 

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

 

 

dbSync ( ); // перерисовываем экран

 

смотримнетолькофункциональностьсозданной«аппаратом»программы,

 

}

 

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

 

 

for ( int i = 1; i < 50; i++ )

 

крутойигрыфункциииметоды.

 

 

dbDeleteObject ( i ); // удаляем каждую сферу

 

ЗапустиVisualC++,еслиранееэтогонесделал.Создайновыйпроект.В

 

 

return;

 

окневыборашаблонадляпроектаразвернипунктWizards,вкоторомвыбе-

 

}

 

 

xàêåð 10 /118/ 08

107

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to BUY

 

>> coding

 

 

 

 

 

 

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

 

 

 

 

Dark BASIC с загруженным проектом

dvd

На диске лежит полный исходный код игры DarkRobot.

Для компиляции нужны: Visual C++ 2008 Express Edition, DirectX 9.0 SDK, Dark GDK.

info

Если тема тебя заинтересовала,

— сообщи об этом автору. Продолжим развитие хакерского игропрома!

links

Если в лом вставлять диск, можешь скачать исходник с — www.xakep.ru.

риподпунктDarkGDK—иерархиятакая,какоймыеесоздали. Тыувидишьтривозможныхзаготовки:DarkGDK—Game,Dark GDK—2DGameиDarkGDK—3DGame.Каждаягенерирует проектсоответствующеготипа.Таккакмыхотимсоздатьтрехмернуюигру,товкачествешаблонадлясвоейновойпрограм- мывыбериDarkGDK—3DGame.Послетого,какпроектбудет создан,откройегоисходныйкод,дваждыщелкнувнафайле Main.cpp вобозревателерешения.Сейчасмыприступимк исследованиюкода,сгенерированногомастером(смотрикод наврезке).

Рассмотрим код, или Разбор полетов

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

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

точкавходавпрограмму.ВDark-приложенияхнетфункции MainилиWinMain,затоестьтакая—DarkGDK.Свызовом следующейфункциимыкакбысообщаемсистеме,чтоберемпод свойконтрольперерисовкуэкрана(функция dbSyncOn).Далее вызываетсяфункция dbSyncRate спараметром60.Тоесть,мы хотим,чтобычастотаперерисовкиэкранаповозможностибыла равнаэтомузначению.Впараметрепередаетсямаксимальнаячастота,ноонанеобязательнобудеттакой.Всезависитот мощностикомпьютера,накоторомзапущенапрограмма.Затем идетфункция dbRandomize—инициализатормеханизмаслу- чайныхзначений.Онанужна,чтобыприкаждомпоследующем запускепрограммысновагенерировалисьзначения.Параметромдлянееслужитфункция dbTimer,котораявозвращает системноевремя,измеряемоевмиллисекундах,начинаясо стартаоперационнойсистемы.Вследующемциклемысоздаем иизменяемсвойстванесколькихсфер(вданномслучае—49). Поименамвызываемыхфункцийвидно,какиесвойстваони изменяют(нижемырассмотримихболееподробно).

Послециклавызываетсяфункция dbPositionCamera.Она проводитинициализациюкамеры,аименно—устанавливает еепозицию.Вкачествепараметровпередаемейкоординаты повсемтремосям.Затемначинаетсяосновнойциклпро- граммы.Условиецикла—функцияLoopGDK.Онавозвращает единицу,покапрограммаможетфункционировать,иноль

когдапроизошелкакой-тосбойилипользовательпросто

закрылприложение.Втелециклавызываютсянесколько функций.Намнадоихрассмотреть.Перваявызываемая здесьфункция dbTextвыводиттекст(переданныйвтретьем параметре)впозиции,заданнойпервымидвумяпараметрами(соответственно,координата x—первыйпараметр,иy

второй).Далееидутдваусловияпроверкинажатияклавиш «стрелок»:ВВЕРХиВНИЗ(функции dbUpKey и dbDownKey).

Врезультатевыполняетсяфункцияприближенияиотдаления камеры— dbMoveCamera.Вкачествепараметраейпере- даетсяшагперемещения—соответственно,положительное иотрицательноечисла.Потомначинаетсяцикл,которыйповорачиваетвсеранеесозданныесферыспомощьюфункции dbRotateObject.Ейпередаются:номеробъектаитрипараметра:углыповоротапосоответствующимосям.Ипоследняя вызываемаявциклеwhile функция(dbSync)перерисовываетокноприложениясовсемиимеющимисяобъектами. Послезавершенияцикланадоподчиститьзасобойресурсы, удаливвсеобъекты.Чтомыиделаемвциклеforпосредством специальнойфункции dbDeleteObject,которойвкачестве параметрапередаетсяномеробъекта.Ипоследнейстрочкой

возвращаемуправлениеоперационнойсистеме.

Ну,теперьоткомпильизапустипрограмму.Работает?Конечно, работает!Впечатлен?Взгляниещеразнакодипредставь, скольконадобыбылописатьпод«голый»DirectX,чтобы получитьтотжерезультат(смотрискриншот«Запущенное демо-приложение»).

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

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

Впроцессесозданиясферывфункцию dbMakeObjectSphere(вниманиенапервыйцикл!)переда- етсядвапараметра.Первый—циклическиувеличивающаяся переменнаяiивторой—константа1.Совторымпараметром всеясно(задаетразмерсоздаваемойсферы).Анапервомостановимся подробнее.Онзадаетимядляобъекта—кданному объектуможнобудетобращатьсяпоэтомуименинапротяжениивсейпоследующейпрограммы.Получаетсятакоевот числовоеимя,иэтоудобно—например,вкаждойитерации цикламожноприсваиватьименаобъектампопорядку,используядляэтогопеременнуюцикла(какврассматриваемой программе).Именанеобязательнодолжныидтипопорядку, но,следуяопределенномуряду,тыизбавишьсебяоттого, использовалнесколькоразодноитожеимя(число).Если такойэпизодбудетиметьместовпрограмме,тынедосчи- таешьсяобъектов—из-затого,чтопроизойдетперезапись старогообъектановым.Ситуациюможетусложнитьтотфакт, чтодляразныхтиповобъектовиспользуютсяодинаковые числа.Так,тыможешьсоздатьсферусименем«1»итекстуру стакимжеименем.Нозаморачиватьсясцифраминевсегда удобноиприятно.Поэтомуможнопростообъявитьконстанту, котораябудетименемдляопределенногообъекта,иприсвоитьейнужнуюцифру.Допустим,const int man = 1.Таким образом,объявленаконстанта manдляобъекта,соответствующегоэтомуназванию.Итыуженикогданезабудешь, кчемуотноситсяцифра«1».Затем,какяужеговорил,идут функции,настраивающиесвойствасферы.Перваяизних,

dbPositionObject,естественно,задаетпозицию.Ейпередаютсятакиепараметры:имяобъекта(цифра)итрирандомныхчисла,играющихролькоординатпотремосям.Каждоеиз этихчиселвозвращаетсяспомощьюфункции dbRnd (аналог пофункциональностиобъектаклассаRandomизC++).Функ- цияпринимаетпараметромзначение—пределотрезкачисел

108

xàêåð 10 /118/ 08

 

 

 

 

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

>> codingto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

Приложение запущено под дебагером

 

Игра DarkROBOT

 

 

 

 

 

 

dbLoadObject("skybox.x", skybox),которойпередаютсяимях-файла

 

отнулядоданного

значения.Изэтогоотрезка,собственно,ивыбирается

 

случайноечисло.

Следующаязатемфункция dbScaleObject изменяет

иимяобъекта(номер),загружаетсянебеснаяоболочка(skybox—gamedev-

 

размерсферы.Передаваемыеейпараметрыаналогичныпараметрамдля

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

 

 

предыдущейфункции(толькоздесь2 ой,3 ийи4 ыйпараметрызадают

внутренниесторонытекстурами(этозаднийплан).Последнийзагружаемый

 

размерпокаждойизосей).Функция dbColorObjectустанавливаетцвет.

изфайлаобъект—главныйперсонажввидеробота.Онтакжезагружаетсяиз

 

Параметрысо2 гопо4 ыйвлияютнаколичествосоставляющейцвета:

x-файла,вкотором,помимоинформацииобобъектеитекстурах,хранитсяани-

красный,синийизеленый,соответственно(режимRGB).

мация.Следовательно,онужеанимирован,инамнадотолькозагрузитьего

Дальшенасждутдвекрайневкусныефункции!Перваяизних—дляуправ-

ипроигратьанимацию.Отакойвозможностияужеупоминал.Послетого,как

 

ленияматериалами,автораядляуправленияосвещением.Вызовомэтих

объектбудетзагружен,вызываетсяфункция dbSetObjectSpeed(robot,

 

функцийвседелоиобходится—авспомни-качистыйDirect3D,скоторым,

120) стакими параметрами:имяобъекта,кудазагруженыданныеизфайла,

 

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

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

 

Итак,перваяизфункций— dbSetObjectSpecularPower —устанав-

изкоторыхповорачивает,авторая—перемещаетобъект.Последнийэтап

 

ливаетотражающиесвойстваматериалов.Еепараметры:этоимяобъекта,

инициализации—установкапозициииуглаповоротакамеры.

 

материалкоторогомыхотимустановить,иещезначение—мощностьотра-

Потомначинаетсяцикл,вкоторомвсесамоеинтересноеипроисходит.

 

жения.Втораяфункция— dbSetObjectAmbient—управляетокружа-

Первымделомздесьобъявляетсяпеременная;ейприсваиваетсязначение

 

ющимцветом.Здесьонпростоотключается(второйпараметр—0).Теперь

—высотаповерхностиландшафтавуказаннойточке.Высотавозвраща-

 

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

етсяфункциейdbGetTerrainGroundHeightстакимипараметрами:

 

приступитькпрограммированию.

объект(ландшафт)идвапараметра—соответственно,координатыXиZ

 

 

 

 

 

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

 

 

DarkRobot

условныйоператор:внемпроверяется,ненажаталинужнаяклавиша.Если

 

 

 

 

 

Нашразговорбудетнеполнымбезрассмотренияпримераработающего

нажата,—выполняютсядействия:перемещаютсяилиповорачиваютсяв

 

игровогодвижка.ПредлагаютебезагрузитьснашегодискаVC++проект

заданномнаправлениироботикамера.Также,принажатииклавиш,запус-

 

DarkRobot(илихотябызапуститьэкзэшник)ипосмотретьнареализован-

каетсяиостанавливаетсяанимацияробота;соответственно,функциями

 

нуюнанемзаготовкуигры,которуюядлятебяразработал.Обязательно

dbLoopObjectиdbStopObject,укоторыходинпараметр:имяобъекта,

 

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

чьейанимациейнадоуправлять.Функция dbPositionObjectпереме-

 

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

щаетобъект(внашемслучае—робота).Унееследующиепараметры:имя

 

Сначала—полеустановкичастотыперерисовки.Идетинициа-

объектаитрипозициипокаждойкоординатнойоси.

 

лизацияграфическогорежимафункциями dbSetDisplayModи

Следующаяфункция—наиболееаппетитная.Сеепомощьюможно«привя-

 

dbMaximiseWindow.Перваяизнихустанавливаетпараметрыэкрана(ей

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

 

передаетсяширина,высотаиглубина).Втораяфункцияпризапускепри-

передаваявфункциютакиепараметры:текущееположениероботапоосиX,

 

ложенияразворачиваетокнонавесьэкран(независимоотвыставленных

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

 

параметров).Затемидутфункции,выводящиетекстиперерисовывающие

положениироботапоосиZ,идалее—дистанцию,высоту,сглаживание

 

экран.Следующаяфункция(dbSetCameraRange)устанавливаетсвойства

траекториидвиженияиобрабатыватьилинетстолкновениякамеры.Подошла

 

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

очередьфункцииdbUpdateTerrain,неимеющейпараметровипростооб-

 

отображаемоесодержимоесцены.Все,чтовыходитзапределыплоскос-

новляющейландшафт.Замыкающаятелоциклафункция dbSync обновляет

 

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

содержимоеиперерисовываетэкран(этуфункциюмырассматривали).После

 

текстуры.Онибудутналоженыналандшафт,предварительнопройдя

циклавозвращаемуправлениеоперационнойсистеме.Разобравшисьскодом,

 

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

обязательнозапустииоцениигру(смотрискриншот«играDarkROBOT»).

 

Функциюзагрузкитекстурымырассмотреливыше.Затемидетблоккода,

 

 

 

которыйинициализируетистроитландшафт.Какяупоминал,вDarkGDK

Удачного старта!

 

естьфункциягенерированияландшафта dbSetTerrainHeightMap.Ей

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

 

передаются:имяобъекта—ландшафта—иимяфайла.Здесь-томыейи

ностейбиблиотекиDarkGDK.Однакотакойграндиознойцелиинестави-

 

пользуемся,загружаякартувысотизфайлаbmp.Затеммасштабируем,

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

 

освещаемитекстурируем(загруженнымиранеетекстурами).Заподроб-

оченьиоченьмного.Япоказаллишьодноизних.Спомощьюбиблиотеки

 

 

 

 

 

 

 

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

DarkGDKможновзятьудачныйстартнадорожкеигростроения.Еслиты

 

назагрузку*.x-файлов.ЭтоттипявляетсяроднымдляDirectX. Функцией

раньшенеразрабатывалигры,возможно,сейчассамоевремяначать. z

xàêåð 10 /118/ 08

109

%P D

 

quicksort:qsort(List)r

 

 

 

hang

e

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

d

 

 

F

 

 

 

 

t

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

to BUY

>> coding

items

%%df-xchanSort a list

w Click

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

o

 

 

.

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

 

 

 

e

 

 

-module(quicksort).

 

 

 

 

 

 

 

 

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

-export([qsort/1]).

 

 

 

 

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

 

 

 

 

qsort([]) -> []; qsort([Pivot|Rest]) ->

qsort([ X || X <- Rest, X <

Научныйбрутфорс

Y || Y <- Rest, Y >= Pivot]).

Знакомимся с Erlang — языком программирования для распределенных систем

%%Каждомуquicksort:qsort(Lisиз нас знакома проблема, когда пароль параноидально-настроен- ного юзверя никак не хочет поддаваться брутфорсу. И каждого, наверняка,

посещала мысль, что было бы здорово замутить под это дело распределен- %%ныеSortвычисления. Но тутaмало иметьlistсвой ботнет —ofнеобходимitemsсоответству- ющий инструментарий. Увы, большей частью он заточен под всякую науч-

ную пургу. Но что тебе мешает написать прогу для распределенного брута? -module(quicksort)Для этого есть прекрасный инструмент — язык Erlang! .

-export([qsort/1]).

Нафига мне новый язык?

Вопросневбровь,авглаз.Действительно,зачемизучатьновыйязык программирования,еслинастоящемуcoolхакеру,кромеAssembler/C,для счастьяничегоненадо?Атутраз—иещеодинязык!Всеверно—любую задачуможнорешитьспомощьюодноголишьассемблера.Трудозатраты приэтомбудуттакие,чтопочтилюбойпроектпревращаетсявхронический долгострой.Сдругойстороны,новыевысокоуровневыеязыкипрограммирования,вродеC#илиJava,позволяюточеньбыстрописатьпрограммный кодихранятвсвоемарсеналемногополезныхфишек,делающихжизнь кодераболеешоколадной.Тольковотсистемщик,пишущийдрайверили

модульядранаодномизтакихязыков,получитвыносмозгавdev/null.На- деюсь,тыпонял,кчемуяведу—длякаждоготипазадачестьсвоинаиболее эффективныеинструменты.

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

110

xàêåð 10 /118/ 08

 

 

 

 

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

>> codingto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Вот через это окно и добавляются новые Reference

Pivot])Официальный сайт мощнейшего++инструмента [Pivot] ++ qsort([

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

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

t)рекомендуютебеобратитьвниманиенаязыкErlang.

Дляначала—немногоистории.Erlangбылсозданвнебезызвестнойкомпа- нииEricsson.Ха,тыужедогадался,чтоозначаетназваниеErlang?«Конечно, этоEricssonLanguage!»Тольконеправты,гринго.Эрланг—этоимякрайне умногомужика,вчестькоторогоиназвалиединицуизмерениятелекоммуни-

кационноготрафика(Судя по имени, он настоящий викинг,—Прим.ред.). Erlangотноситсякфункциональнымязыкампрограммирования.Еслиутебя напочветупойпрограммыуниверситетскогообучениявыработалосьстой- коеотвращениеклямбда-выражениям,будьостороженипотребляйErlang оченьдозировановоизбежаниесоматических(дапроститменяредакторза упомянутыйвсуемедицинскийтермин)осложнений.Синтаксисязыкапохож наProlog.Иэтонеслучайно—именнокPrologуходятегокорни.

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

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

А как тут все устроено?

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

Запустить

 

 

 

Некоторыепроек-

 

 

 

 

Erlang-программу

 

 

 

ты,написанные

 

вокошках

 

 

 

наErlang

 

ЧтобызапуститьнавыполнениеErlang-программувобходдиало-

 

 

 

Yaws—оченьшустрыйиоченьнадежный,даещеинетребова-

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

 

 

 

тельныйкресурсамвеб-сервер(yaws.hyber.org).

лишьподсунутьинтерпретаторупаруключей:-noshell(подавляет

 

 

 

ЧатовскийдвижоквкрупнейшейсоциальнойсетиFacebook.

интерактивныйрежим)и-run,послекоторогонужнопоследова-

 

 

 

•СервердляJabber-сетейEjabberd(www.ejabberd.im).

тельноуказатьимямодуля,имяфункции,иопционально—пара-

 

 

 

•И,наконец,самыйизвестныйпроект—распределеннаябаза

метры,передаваемыефункциипризапуске.

 

 

 

данныхSimpleDB,накоторойработаетинтернет-гигантAmazon.

 

 

xàêåð 10 /118/ 08

111

%P D

 

 

r

quicksort:qsort(List)

P D

 

 

hang

 

 

 

 

r

 

 

 

hang

e

 

 

 

 

 

 

 

 

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

d

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

NOW!

o

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

to BUY

 

 

 

 

 

to

BUY

>> coding

 

 

 

 

 

 

 

 

 

%%df-xchanSort a list of items

 

 

df-x chan

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

g

.c

 

 

.

 

 

 

g

.c

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

 

 

 

 

e

 

-

-

<

Y

 

Веб-сайт проекта Erlang

 

 

%

 

языком.Техническиэтореализованотакже,какивЖабе—программа

засчетчегоэтосталоосуществимо:илипрограммы,написанныенаErlang,

 

 

 

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

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

 

 

Erlangотноситсякфункциональнымязыкам,забудьотакойглупости,как

дерами,иливErlangвстроенамощнаясистемаобработкиошибок?Какой

 

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

 

 

операцияприсваивания.Еепростонет!

быварианттынивыбрал,онбудетнеправильным.Согласнофилософии

 

 

Чтобыпередатьинформациюотодногопроцессакдругому,какяужеупо-

Erlang,еслипроцессупал,—тудаемуидорога.Исповедуетсяздоровый

 

 

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

ипрагматичныйпофигизм.Болеетого,процесс,вкоторомвозникли

 

 

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

Ондаженазывается«процесс-камикадзе»(Кстати, большую часть

 

%%СледующаяSort a list of items

 

сообщенияизсвоегопочтовогоящика.Возможноиспользованиефиль-

 

 

времени автор статьи работает программером в Японии и в

 

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

 

 

совершенстве владеет техникой сепукку и древним искусством

 

сообщений.

 

 

связывания женщин, так что можешь написать ему на эту тему,

 

 

фишка:сErlangтебенепридетсязаботитьсяоботловевсех

 

 

—Прим.ред.).

 

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

 

 

Тыскажешь:акакжедругиепроцессы,онижебудутпытатьсявзаи-

 

нуднаяпарочкаtry-catchосталасьзабортом.Атеперьпопробуйдогадаться,

 

 

модействоватьсупавшим«товарищем»!Нет,—еслипроцесспадает,

 

 

 

 

 

-module(qui-

 

 

 

 

 

 

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

 

 

 

 

 

 

погоревав,продолжаетжитьдальше.

 

 

 

 

 

 

Дальше!ПроцессывErlangизолированыдруготдруга.Азначит,прираспа

 

 

ИсторияErlang

 

 

 

 

 

 

взаимныеблокировки.Этожепростопраздниккакой-то!

 

 

 

 

 

 

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

 

 

 

 

 

 

Инаконец,парасловотом,какспомощьюErlangсоздаютсяраспределен-

 

 

 

 

 

 

 

 

Родинаязыка—лабораторияEricssonComputerScience

 

 

ныесистемы.Работающийэкземплярвиртуальноймашиныназывается

 

 

Laboratory(CSLab).Побольшомусчету,всеначалосьспотребнос-

 

 

узлом(Node).Каждыйузелзнаетосуществованиидругихузловнаэтойже

 

 

тинемногоусовершенствоватьязыкProlog,добавиввнегопод-

 

 

 

машинеиможетснимивзаимодействовать.Стемжеуспехомузелможет

 

 

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

 

 

взаимодействоватьисузлами,существующиминадругихмашинах,доста-

 

 

синтаксисом(который,впрочем,такиосталсяпохожимнасин-

 

 

точноскормитьемуадресудаленнойсистемы.

 

 

таксисProlog).Тогдажебыларазработанаивиртуальнаямашина

 

 

 

 

 

 

 

Erlang.Ав1998 м,черезвосемьлетпослесвоеговыходавбольшое

 

 

 

 

Где же мне его взять?

 

 

 

 

 

 

 

 

 

 

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

 

 

Еслитыдочиталдоэтогоабзаца,значит,темаподнятиясобственнойсисте-

 

 

открытойлицензией.

 

 

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

 

 

112

xàêåð 10 /118/ 08

xàêåð 10 /118/ 08

 

 

 

 

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

>> codingto BUY

 

 

 

 

 

 

m

w Click

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Erlang в интерактивном режиме

тебясейчасинтересуетбольшевсего?Наверняка,вопросы—гдедостать

ЧтобыподружитьEmacsиErlang,понадобитсяпакетerlang-mode.Не

Erlangискольколавандосовзанегопопросят.Начнусовторого.Возрадуй-

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

ся—Erlangбесплатен,дабудетблагословенRMS!

устанавливалмодынаEmacs,тонижедлятебянебудетничегонового.Если

В доступный для загрузки с сайта erlang.org дистрибутив входят: ком-

жетыновичоквэтомделе,товоттебеоченькраткаяинструкция:

 

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

 

 

 

Pivot]) ++ [Pivot] ++ qsort([

 

 

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

 

// Указываем путь к erlang-mode и загружаем

 

 

ментов OTP. Среди последних следует отметить Mnesia — написанную

 

erlang-start

 

 

полностью на Erlang распределенную СУБД с поддержкой репликации

 

(add-to-list ‘load-path ».....»)

 

 

данных и возможностью динамического изменения их схемы и обнов-

 

(require ‘erlang-start)

 

 

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

 

// типы файлов, для которых будет активирован мод

 

 

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

 

(add-to-list 'auto-mode-alist '("\\.erl?$"

 

 

данными полностью прозрачной для приложений — они работают

 

. erlang-mode))

 

 

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

 

(add-to-list 'auto-mode-alist '("\\.hrl?$"

 

 

на удаленном узле.

 

. erlang-mode))

 

 

Конечноже,мывыложилиинсталляционныйпакетErlangнанашемдиске,

 

// пути к erlang-окружению

 

 

итебенепридетсякачатьегоизСети.

 

(setq erlang-root-dir "/opt/local/lib/erlang")

 

 

ЕслижетыпрогуляешьсядоофициальногосайтаErlang,тосможешь

 

(add-to-list 'exec-path "/opt/local/lib/erlang/bin")

 

 

найтитамкакисходникиязыка(исобратьихподсвою*Nix-систему),таки

 

(setq erlang-man-root-dir "/opt/local/lib/

 

 

готовыйинсталляторподWindows.Крометого,Erlangвходитврепози-

 

erlang/man")

 

 

тариимногихLinux-дистрибутивовиможетбытьустановленбуквально

 

Если Emacs тебя пугает, есть другие, менее экстремальные решения.

 

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

 

 

Synaptic.Адептамкоманднойстрокитоженепридетсясебяутруждать

 

Например, ErliBird — среда Erlang-разработки, в основе которой

 

нечеловеческимиусилиями:все,чтотребуется—этоввестивтерминал

 

лежит платформа NetBeans. А кто у NetBeans числится в заклятых кон-

% quicksort:

 

строкуapt-getinstallerlang.

 

курентах? Правильно — Eclipse. И если существует сборка NetBeans

 

Еслитырешилпойтипутемнастоящихджедаев,тоустанавливайErlang

 

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

 

изисходников.Сложноготуттоженичего—распаковывайархив,азатем

 

инструмент найдется и у Eclipse. И действительно, ErlIDE — плагин

 

сотворизаклинание:

 

для Eclipse, позволяющий использовать Erlang-программистам эту

 

 

 

 

великолепную IDE.

 

 

./confogure

 

Веськайфобламываетодиннюанс.Деловтом,чтоErliBirdиErlIDE—еще

 

 

make

 

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

 

 

sudo make install

 

справкискажу,чтовозможностиEmacsсзапасомперекрываютвсесамые

 

 

 

 

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

 

 

 

 

Послеинсталляциинеплохобылобыпроверить,вселиунасполучилось.

 

наобузданиеэтогоскакуна,чемзаниматьсянетрадиционнымсексомс

 

Дляэтогонабирайвтерминалекомандуerl.Тыдолженувидетьбаннер

 

другимиIDE.

 

Erlang—что-товроде:

 

 

 

 

 

 

 

Ну и как мне этим пользоваться?

 

 

$ erl

 

Осваиватьновыйязыкпотрадициибудемсвыводастроки«Hello,World!»и

 

 

Erlang (BEAM) emulator version 5.5.1 [source] [async-

 

простыхарифметическихопераций:

 

cksort)threads:0] [hipe] .

 

 

 

 

 

Eshell V5.5.1 (abort with ^G)

 

1> "hello, world!".

 

 

 

 

 

"hello, world!"

 

 

 

 

 

 

 

 

Мне бы это... IDE какую-нибудь

 

2> 1 + 2.

 

 

 

 

 

 

 

 

 

 

Ачеготак?Консольженашдомродной,IDE—путьдляслабаков.

 

3

 

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

 

3> (2 * 3) + 4.

 

 

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

 

10

 

 

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

 

 

 

 

 

 

 

 

гораздоменьше,чемлюбогопопсовогоязыкатипаС#илиVB,тоисосредаНадеюсь,тыобратилвниманиенатакуюфишку,какточкавконцекаждого

 

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

 

выражения.Всеостальноевесьматрадиционно.

 

ПервымидетвеликийимогучийEmacs.Труднонайтиязыкпрограммирова-

 

Нонеторописьсвыводами.Умногих,ктовпервыеувиделкод,написанный

 

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

 

наэтомязыке,единственнаяреакциянаувиденное—«сумасшедший,

 

редакторе.Ноздесьсоюзтребуетнекоторыхпредварительныхдействий.

 

нечеловеческийсинтаксис!».Однакодлянастоящегохакераэтонестанет

113

xàêåð 10 /118/ 08

%P D

 

 

quicksort:qsort(List)r

 

 

 

hang

e

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

to

BUY

>> coding

%%df-xchanSort a list of items

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

-

-

 

 

 

 

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

 

 

 

 

<

Y

Монитор производительности Erlang-приложений

||

 

преградой.Да,синтаксис,мягкоговоря,странен.Нокнему

 

быстропривыкаешь.

 

Введиследующийкод:

 

 

dvd

1> X = 50.

На диске ты найдешь

50

%%

 

не только инстал-

2> Y = (X + 10) * 2.

ляционный пакет

120

Erlang для Windows-

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

систем, но и среды

разработки ErlyBird

ременные у нас в верхнем регистре, — это не случайность,

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

1> {ok, 9}.

{ok,9} quicksort2> {true, {127, 0, 0, 1}}. {true,{127,0,0,1}}

3> {box, {width, 10}, {height, 35}}.

Есликортежнеограничиватьподлине,тоэтоужебудетсписок.

 

и ErlIde. В качестве

а одно из требований языка. Давай присвоим переменной

Спискивотличиеоткортежейзаключаютсявквадратные

 

дополнительного

X новое значение: 3> X = 10. Упс, интерпретатор выдает

скобки.Ещесписокможноразделитьнадвечасти—заголовок

 

бонуса — справочная

ошибку! В чем дело? Готовься к выносу мозга. Во-первых,

(head)ихвост(tail).Одноотдругогоотделяетсяспомощью

%%системаSortот Ericsson! X — это совсем не то,aчто мы подразумеваемlistпод перевертикальнойofчерты.Длячегоэтоitemsнужно,тыувидишь,когдамы

 

 

менной в других языках программирования. Во-вторых,

будемписатьсвоюраспределеннуюсистемудлябрутфорса.

 

 

знак равенства в случае с Erlang не является оператором

 

 

 

 

присваивания. Теперь по пунктам. Переменные в Erlang

 

1> [one, two, three].

 

 

являются переменными одноразового присваивания. Если

 

[one,two,three]

 

 

переменной еще не присваивалось никакого значения, она

2> [1, 2|[3, 4, 5]].

-module(quicksort).

 

 

считается открытой. Закрытая переменная — та, которой

[1,2,3,4,5]

 

 

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

 

3> [{key1, value1}, {key2, value2}].

 

 

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

 

[{key1,value1},{key2,value2}]

 

links

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

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

 

www.erlang.org

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

-export([qsort/1]).

 

— Open-Source реа-

потом раз, и конкретное число. И поменять мы его не можем

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

 

 

лизация Erlang.

точно так же, как Маша с пятого этажа вдруг не обернется

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

 

Erlang по-русски:

Петей из другого подъезда. Можешь считать это теплым

документацию,даещеиспримерами.Амытемвременем

 

erlang.dmitriid.com.

приветом от функционального программирования.

перейдемкнеменееважномувопросу—созданиеполно-

 

Проекты, использую-

Аеслипеременныенеменяютсвоегозначения,тоэтопросто

ценныхпрограмм.

 

щие Erlang в качес-

райдлямногопоточногопрограммирования,ведьтебебольше

 

 

 

тве основного языка

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

 

Как запустить?

 

 

 

 

 

разработки: www.

нуженонивсе.

Дляначалаотом,каквыйтиизErlang-интерпретатора.Для

 

erlang-projects.org.

ВErlangестьещетакоепонятие,какатом.Атом—этоимено-

этогонужнонабратькоманду halt().Инезабудьпроточкув

 

Сообщество Erlang-

ваннаяконстанта.Вотличиеотпеременной,названиеатома

концестроки!

 

программистов —

можетбытьнаписанострочнымибуквами.

Ну, а теперь отвечаю на вопрос, вынесенный в заголовок

 

www.trapexit.org.

Следующийважныйэлементязыка—кортежи(Tuples).Кортеж

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

114

 

 

 

 

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

>> codingto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Y

:

Среда разработки ErliBird

 

qsort(List)

 

 

 

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

 

Ксожалению,нашаприятнаябеседазачашечкойтекилынеможетпродол-

 

вместо нудного секса с построчным прогоном через интерпретатор.

 

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

 

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

 

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

 

товый редактор, не сохраняющий элементы форматирования. Файл

 

вСети.Нуамыстобойвстретимсячерезмесяципоближепознакомимсяс

 

должен иметь расширение (.erl). Логическая структура Erlang-про-

 

инструментамиорганизациираспределенныхвычислений.Ачтобыупот-

 

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

 

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

 

виде отдельных файлов. Первым делом мы должны объявить начало

 

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

 

модуля и заодно сообщить его название. Для этого используется

 

ящике! z

 

конструкция

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

— module(название).

 

Управление встроенной базой данных

 

 

 

 

 

 

 

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

mymod:test(8).

Вслучаеесливнутримодулятребуетсяобъявитьфункцию,доступнуюизвне, используетсяконструкция:

— export([имя_функции/количество_аргументов]).

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

c(имя_модуля).

xàêåð 10 /118/ 08

115

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

w Click

to BUY

 

>> coding

 

 

 

 

 

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

 

 

 

 

Разруливаем торренты-2: подпокровом ночи

Программим кроссплатформенный torrent-клиент

«Шесть лет прошло со времен первой войны людей и орков…» Действительно, прошло уже несколько месяцев с момента выхода статьи, в которой мы на практике разобрали процесс создания и парсинга torrent-файлов. К большому сожалению, до самого вкусного момента (взаимодействия с трекером) мы добрались только сегодня — из-за проблем с отладкой готового примера. Лишь после нескольких сеансов электростимуляции толстым зондом со стороны редактора рубрики я смог это дело осилить и облечь в суровые строки журнальной статьи.

 

C# вместо Delphi

времядлядельфинанесуществуетниоднойнормальнойбиблиотеки/мо-

 

 

ДляпервойчастистатьияписалпримернамоемлюбимомDelphi,носегод-

дулядляупрощениявзаимодействиясэтимпротоколом.Всетебиблио-

нямнепредстоитемуизменитьивоспользоватьсявеликимимогучимC#.

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

МногиеDelphi-ненавистникивозрадуются игромкозакричат:«Неужелина

переписываниядо60%кода.Заниматьсяпереписываниемиизобретением

Delphiнельзясоздатьполноценныйклиент?».Вовсенет,наDelphiможно

очередноговелосипеда—оченьдолгоинудно,аDr.Klounizвсеповышал

написатьпрактическилюбоеприложениеиторрент-клиент—неисключе-

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

ние,ноестьодноно.Кактыпонимаешь,протоколBitTorrent—этонехухры-

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

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

библиотек—инаэтотразяискалнедляDelphi,адляC#.Ксчастью,тут

116

xàêåð 10 /118/ 08

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