пятница, 15 апреля 2011 г.

Миротворцы. История гильдии

Сотворение

На заре времён, когда не существовало ещё ничего, кроме изначального хаоса, по воле извечного рандома сформировалось несколько сгустков, бесцельно блуждающих случайным образом в бескрайних просторах одномерной реальности. Неизвестно, сколько минуло времени, прежде чем эти неоднородности смогли осознать себя и свое существование. И еще больше времени прошло, пока, наконец, два случайных сгустка сознания (названные впоследствии Демиургами) не столкнулись. Оказалось, что только взаимно дополняя друг друга, эти сущности получили способность творить миры. Таким образом, история не только Годвилля, но и целой вселенной началась с формирования первой гильдии, получившей название «Миротворцы».

Шли годы, разрастался и хорошел Годвилль. Под возросшим влиянием юных пробудившихся богов, Демиурги постепенно забыли о самой первой гильдии, величественная цитадель которой, поражавшая своим великолепием, всё так же возвышалась в самом центре сотворённого мира. Опустели некогда пышные и шумные залы, где перворожденные герои дружелюбно махали друг перед другом впервые добытыми трофеями, а по вечерам удивляли собравшихся рассказами о невероятных приключениях, с выражением зачитывая выдержки из дневников, и лихо отплясывали на пиршественных столах под веселый треск трещоток и заунывное бубнение бубнов. Легенды гласят, что громадный замок был целиком сложен из золотых, 999-й пробы, блоков первыми миротворцами всего за одну ночь. И столь высоки были его башни, что невозможно было отыскать место, откуда их было бы не видать. Но терпеливое и беспощадное время любые, даже самые величественные сооружения, неспешно обращает в прах. Неприступные золотые стены и гордые башни по кирпичикам были растасканы жадными до всего яркого и блестящего невиданными доселе, жуткими тварями, наводнившими Годвилль, а ухоженные замковые холмы поросли соснами и столбами. Лишь скрытые до поры обширные подземные катакомбы остались в молчании хранить тайны далёкого прошлого.

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

Возрождение

Как-то раз, в один студёный февральский вечер, некий герой*, из последних сил продиравшийся сквозь густые сосновые заросли, решил укрыться от непогоды в случайно обнаруженной пещере. Разведя костёр и разложив на просушку нижнее обмундирование, он, к своему удивлению, обнаружил чугуниевую дверь, тускло блеснувшую в свете огня. А поскольку, как известно, всякому герою присуще нездоровое любопытство, наш приключенец решил, во что бы то ни стало разведать, что за этой дверью скрывается. И вот, наконец, массивная дверь уступила перед напором геройской любознательности, и, вдоволь заготовив из подручного мусора факелов и иных осветительных принадлежностей, он ступил в манящую неизвестность. Обнаружившаяся за дверью бесконечная, уходящая вниз, лестница, наконец, кончилась, и наш герой очутился в обширном подземном зале, тишину которого нарушало лишь беспокойное потрескивание факела. Высоченные стены зала украшали без сомнения древние, но прекрасно сохранившиеся гобелены, изображавшие сцены сотворения Годвилля.

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

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

__________
* – По неподтверждённым слухам это мог быть Эрроурут Эрроуширский или любой другой герой.

Последняя битва Героя

Случилось так, что славный рыцарь сэр Эрроурут Эрроуширский, по обыкновению спасая мирных жителей от ужасных созданий, вступил по геройской нужде своей в мрачные и зловонные земли Заброшенного Капища. Ядовитые испарения и дурные предзнаменования окутывали это черное место. С гниющих ветвей деревьев вместо листьев свисали во множестве полуистлевшие человеческие головы и иные бренные члены. Небо было затянуто непроглядной зеленой мглой, а из таинственных темных углов раздавались скрежет зубовный и прочие малоприятные звуки. Любой из героев давно повернул бы назад, но только не Эрроурут! Без тени страха и сомнения продвигался он вперед к своей цели.

Но вот земля содрогнулась под тяжкой поступью неведомого врага, а воздух наполнился отвратительными звуками и запахами. И через мгновение враг явил себя. Ростом он превосходил высочайшие из деревьев и, весь покрытый непробиваемой броней, был подобен черной горе. Четыре гигантские ноги его сотрясали землю, а множественные руки были вооружены острейшими ядовитыми когтями, подобными мечам и секирам. Из разинутой пасти врага виднелись черные клыки в пять локтей длиной, с которых стекала на землю кислота и щелочь. Гигантским своим хоботом он с легкостью выдирал из земли деревья, валуны и иные предметы, помещая их в свою бездонную глотку, откуда вырывались сполохи пламени и оглушительное рычание. Это был тот, о котором многие боятся даже помыслить, тот, чьим именем пугают непослушных детей: мифический демон древнего мира – Администратор Годвилля.

Отважный Эрроурут вспомнил, что излюбленной пищей демона являются молодые и неопытные герои. С жалостью подумал он о тех бедолагах, кто остался за его спиной, и для кого сегодняшний день мог стать последним. И славный рыцарь понял, что долг его – низвергнуть чудовище. Победить или пасть смертью героя! Крепче сжал он в руке оружие – свой верный боевой вантуз, и громогласно провозглашая боевой клич, отважно ринулся в бой. И так велика была его доблесть, что ужасный Администратор Годвилля, на мгновение дрогнув, попытался поджать свой чудовищный шипастый хвост. Но вот новой безумной злобой вспыхнули все восемь глаз демона, и издавая громовое рычание «СЕР-ВЕР», монстр обрушил свою колоссальную мощь на бесстрашного рыцаря…

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

Но милостив и справедлив Всемогущий! Отважный рыцарь ожил, чудесным образом очутившись в Храме, и новые славные подвиги ожидали его. Что же случилось с поверженным чудовищным демоном? Героическая гибель отважного рыцаря не была напрасной – ужасного Администратора Годвилля в тех местах боле никто не видел.

пятница, 23 июля 2010 г.

VB.Net. Сравнение быстродействия операций

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

Dim t As DateTime = Now
'некоторая операция 
Console.WriteLine((Now - t).ToString)

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

Dim s As String = "a"
Dim t As DateTime

Console.WriteLine("s = ""a""")

t = Now
For i = 0 To 99999999
    If s = "" Then s.ToString()
Next
Console.WriteLine("If s = """" Then --> " & (Now - t).ToString)

t = Now
For i = 0 To 99999999
    If s = String.Empty Then s.ToString()
Next
Console.WriteLine("If s = String.Empty Then --> " & (Now - t).ToString)

t = Now
For i = 0 To 99999999
    If s.Length = 0 Then s.ToString()
Next
Console.WriteLine("If s.Length = 0 Then --> " & (Now - t).ToString)

s = ""
Console.WriteLine("s = """"")

t = Now
For i = 0 To 99999999
    If s = "" Then s.ToString()
Next
Console.WriteLine("If s = """" Then --> " & (Now - t).ToString)

t = Now
For i = 0 To 99999999
    If s = String.Empty Then s.ToString()
Next
Console.WriteLine("If s = String.Empty Then --> " & (Now - t).ToString)

t = Now
For i = 0 To 99999999
    If s.Length = 0 Then s.ToString()
Next
Console.WriteLine("If s.Length = 0 Then --> " & (Now - t).ToString)

А вот и результаты испытаний, выведенные в консоль:

s = "a"
If s = "" Then --> 00:00:02.2656250
If s = String.Empty Then --> 00:00:02.3125000
If s.Length = 0 Then --> 00:00:00.4062500
s = ""
If s = "" Then --> 00:00:00.7968750
If s = String.Empty Then --> 00:00:02.2187500
If s.Length = 0 Then --> 00:00:00.5000000


Как видим, в любом случае, целесообразнее обращаться к свойству Length. 

четверг, 22 июля 2010 г.

VB.Net. Пустая строка

И еще, к слову. Возможно, кто-то использует такую проверку пустой строки:

If s = "" Then...
или If s = String.Empty Then...

Так проверять не рекомендуется (не рационально). Лучше использовать свойство Length объектов типа String, т.е. делать так:

If s.Length = 0 Then...

Вот так красиво! :)

VB.Net. Удаление элементов коллекции в цикле

Предположим, надо нам удалить из контейнера все элементы управления, свойство Text которых пустое. Как-то раз, не долго думая, я взял и сделал так:

For Each с As Control In Panel1.Controls
    If c.Text.Length = 0 Then Panel1.Controls.Remove(c) 
Next 

Но так делать нельзя! Потому что нельзя изменить коллекцию во время прохода циклом по элементам этой коллекции (а удаляя элемент из коллекции, мы изменяем коллекцию). А вот как можно сделать:
Dim lst As Control() = Panel1.Controls.Cast(Of Control).Where(Function(c) c.Text.Length = 0).ToArray
For Each c In lst
    Panel1.Controls.Remove(c)
    c.Dispose()
Next

Что мы сделали? Сначала поместили все удаляемые элементы коллекции в новый массив lst. Теперь проходим по элементам массива в цикле и делаем, все, что нужно. Можем удалять элемент из исходной коллекции - в массиве он остается, а значит работа цикла не сбивается. Dispose() освобождает ресурсы, занятые объектом. А созданный массив, как локальный объект, прекратит свое существование при выходе из текущей процедуры.

Го вверх!