книги хакеры / журнал хакер / 118_Optimized
.pdf
|
|
|
|
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 |
|
|
|
|
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
%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 |