среда, 15 ноября 2017 г.

Scorpions 2017

Юрий “yurembo” Язев
независимый игродел

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


Тем не менее я приехал туда не для поиска уныния и грусти и даже не для того, чтобы разобраться в целесообразности жизни. Целью моей поездки являлось посещения концерта Scorpions. Уже седьмой год они ездят по миру с прощальными концертами, но все никак не могут попрощаться. Текущий тур посвящен 25-летию альбома Crazy World, вышедший в 1990-м году.


Когда я вышел из ж/д вокзала, в двухста метрах перед собой я увидел огромное здание “Маринс Парк Отель”, где мне предстояло остановиться. Я пересек привокзальную площадь и по подземному переходу вышел к гостинице. Довольно быстро без очереди прошел регистрацию и поднялся на 9-й этаж в свой номер. Он оказался довольно маленьким: стол, телевизор, тумбочка, одноместная узкая кровать, холодильник, который ночью издавал такие звуки, что заставляло вскакивать с постели.


До концерта еще оставалось порядочно времени. Поэтому, оставив вещи в номере, я пошел на осмотр близлежащей территории. Вдобавок я обнаружил, что не взял зарядку для телефонов. Ее мне тоже надо было купить. Выйдя на улицу, я сразу же наткнулся на салон МТС, где, собственно, и купил зарядку. Затем я пошел прочь от ж/д вокзала по широкой улице Якова Свердлова. По обеим сторонам улицы на первых этажах зданий находятся разные магазинчики, банки и другие заведения. Мне особенно бросилось в глаза преобладающее количество магазинов с меховыми изделиями. На улице было прохладно, серо, солнце лишь иногда, пробиваясь через затянутое тучами небо, бросало на землю свои лучи. Среди зданий ветер не чувствовался.


Следуя по улице Свердлова, я дошел до концертного театра “Космос” (в Екатеринбурге есть свой Космос), затем я свернул к Олимпийской набережной реки Исеть. Некоторое расстояние я прошел вдоль набережной. 
 



Далее я свернул на Первомайскую улицу, и, дойдя по ней до ул. Карла Либкнехта (еще один революционер), решил возвращаться в гостиницу, так как подул сильный, пронизывающий ветер, стало холодно. Спускаясь вниз по улице, с правой стороны находится Вознесенская церковь, перед которой раскинулась Вознесенская площадь. На ней представлены фотографии последнего российского императора Николая II и его семьи. Теперь они отнесены к лику святых за то, что были расстреляны большевиками. Какое недоразумение, какое несоответствие! С одной стороны, улицы названные в честь “красных” революционеров, с другой стороны на этих же улицах - церковь скорби “белого” царя. Вы определитесь, в конце концов!


Улица Карла Либкнехта перетекла в улицу Якова Свердлова, по которой, зайдя предварительно в магазин для покупки чего-нибудь перекусить, я вернулся в гостиницу.


До начала концерта оставалось еще 2 часа, я решил, что пора выдвигаться в сторону КРК “Уралец”, где в 19 часов предполагалось начало концерта. Примерно в двухста метрах от гостинцы находится станция метро “Уральская”. Проехав оттуда 2 станции, я вышел на станции “Геологическая”. Ее убранство выполнено в естественно зеленом цвете сапфира, приятном глазу.


Я много раз был в Екатеринбурге, но до сих пор мне так и не удалось проехаться в екатеринбургском метро, уже состоящем из трех веток. Тем самым, я уже ездил в 4-х российских метрополитенах: в московском, в волгоградском, в новосибирском и, вот, в екатеринбургском.

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


Выйдя на поверхность, я прошел два квартала прямиком по улице 8-го марта и уперся в перекресток с улицей Большакова. Мимо меня проходили студенты, на улице 8-го марта находятся Уральский институт управления и общежитие Горного университета. Далее я стал двигаться по улице Большакова. Пройдя еще 2 квартала, я прибыл на место назначения, к большому культурно-развлекательному комплексу “Уралец”, принимающий домашние матчи екатеринбургского хоккейного клуба “Автомобилист”. Возле него столпилось уже довольно много народа. До концерта еще полтора часа.
 
 
В отделе продажи рок-сувениров я приобрел футболку с датами текущего тура.
 

 
К слову, я уже был на концерте в КРК “Уралец”. Это произошло в марте 2013-го года, на выступлении группы Manowar.


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


В зал пребывал народ, постепенно был занят не только танцпол, но и все сидячие места. Чтобы зрители не скучали, играла музыка, Led Zeppelin, Kiss, etc. Концерт начался с опозданием в 35 минут. Так всегда, нечему удивляться. Погас свет. Публика подняла вой. Кулисы открылись. На огромном экране отобразилось название: “Scorpions”.
 
Поднялось множество рук с фото-камерами и смартфонами.


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

На сцену вышли участники группы, и шоу началось с песни “Going Out With a Bang” с последнего альбома “Return to Forever”, выпущенном в 2015-м году.



Мелодии и песни плавно сменяли друг друга. Вот весь трек-лист концерта:
1. Going Out With a Bang
2. Make It Real
3. The Zoo
4. Coast to Coast
5. Top of the Bill / Steamrock Fever / Speedy's Coming / Catch Your Train
6. We Built This House
7. Delicate Dance (Matthias Jabs solo)
8. Always Somewhere / Eye of the Storm / Send Me an Angel (Acoustic medley)
9. Wind of Change
10. Rock 'n' Roll Band
11. Overkill (Motörhead cover)
12. Drum Solo (by Mikkey Dee)
13. Blackout
14. Big City Nights
15. Still Loving You
16. Rock You Like a Hurricane
 



 
Сцена была устроена в виде буквы Т, то есть по направлению к публике внутрь зала от сцены отходил помост. На него во время концерта выходили участники группы, оказываясь “ближе к народу”.
 


 
Неожиданный для меня факт: Микки Ди, на протяжении более 23-х лет (с 1992 по 2015) являющийся ударником Motorhead, примкнул к Scorpions, заменив там Джеймса Коттака, который был вынужден на неопределенный срок взять отпуск по состоянию здоровья. Но тем временем он уже готовит альбом со своей группой, где поет и играет на гитаре. Микки прекрасно справляется с новой ролью, по его словам, в Motorhead он молотил по барабанам, как умалишенный, а в Scorpions ему приходится сдерживать свой пыл, что является для него интересным опытом.
 

Микки Ди

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






 
Первая часть концерта прошла в возбужденной обстановке. Затем Клаус запел особенно любимую в народе Wind of Change. Люди вокруг – публика всего зала стала подпевать. После нее последовала динамичная Rock’n’Roll Band – кавер на песню группы ABBA. После этого на экране позади сцены стали отображаться фотографии Лемми Киллмистера. 
 

 
Скорпы в память о Лемми исполнили зубодробительный хит Overkill с одноименного альбома. Очень непривычно было слышать эту песню из уст Клауса. Его голос не подходит для исполнения песен Motorhead. Однако дань памяти. Затем Микки отыграл ударное соло. На этой волне возбуждения последовали крышесносные хиты Scorpions: Blackout и Big City Nights.
 





 
После этого группа покинула сцену. В США на этом концерт бы закончился. Но в Европе, включая Россию, это был только перерыв. Вернувшись после него, Клаус сказал, что сегодняшним концертом в Екатеринбурге завершается тур по России, и специально для сегодняшней публики: Still I’m Loving You. Если бы концерт был завершен это балладой, было бы не по рокинрольному. Поэтому в нагрузку была добавлена динамичная Rock You Like a Hurricane.
 



 
На этот раз аплодисменты вместе с криками и воем особо впечатлительных граждан прогремели в разы оглушительнее, скорпионы попрощались и покинули сцену. Публика стала потихоньку выползать из концертного зала.
 




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



На следующий день перед отправлением поезда я прогулялся возле железнодорожного музея. Перед ним расположены экспонаты по тематике железной дороги.
 



 

понедельник, 13 ноября 2017 г.

Московский White Nights 2017

Конференция разработчиков видеоигр

 
Юрий "yurembo" Язев
независимый игродел 

 
В прошлом и настоящем я много раз был на КРИ – первой российской конференции разработчиков игр, DevGamm и даже пару раз заезжал на Игромир. Между тем на White Nights как-то не удосуживался, хотя она существует, начиная с 2015-го года. Она посвящена разработке и продвижению игр на всех платформах. Конференция проводится 3 раз в год: зимой – в Праге, летом – в Санкт-Петербурге и осенью – в Москве. Инициатором этого эвента является разработчик казуальных игр в различных жанрах – компания Nevosoft. 

Из всех вышеперечисленных городов мне проще всего добраться до Москвы, поэтому в этом октябре я отправился на московский White Nights ’17. Не считая, конечно, того, что у меня в Москве кроме конференции наметились дела. Но разговор исключительно об играх. 

В первое время после своего появления White Nights концентрировалась на бизнес-вопросах игровой индустрии и не рассматривала инди-нишу. Однако, теперь, инди занимает почетное и не малое место на конференции. А все потому, что инди - движущая сила игровой индустрии. Особенно 3-4 последних года.
В отличие от DevGamm’а White Nights больше ориентирована на бизнес, чем на разработку, поэтому длительность докладов составляет 30 мин., что в 2 раза меньше, чем на DevGamm, однако они не потеряли в своей пользе и информативности.
Есть 3 типа билетов: Indie-dev Pass, Standard Pass и Premium Pass. Обладатели первых, в отличие от вторых и третьих, не имеют приглашений на тусовки, проводимые в день перед началом конференции и первый ее день. В остальном же билеты не имеют существенного различия, хотя очень разнятся по стоимости.
Обладатели всех типов билетов могли в любое время подкрепиться разными бутербродами, сэндвичами и печеньками с различными напитками: чай, кофе, соки, установленными в определенных местах зала – hotspot’ах.
Московская White Nights проводится возле гостиницы «Украина» в конгресс-парке Radisson Royal. 



Конференция проводится под землей – нулевой этаж. Площадь помещения, занимаемая стендами участников довольно обширна, мероприятие проходит в большом зале. По периметру помещения разместились небольшие стенды инди-разработчиков. Центральное пространство заняли “богатые” стенды «больших» разработчиков и издателей: Playrix, Pixonic, Social Quantum, GameInsight, Nevosoft, MyTona, Appodeal, Unity и других.



Читать продолжением на моём сайте ==>>

суббота, 4 ноября 2017 г.

muParser

Вычисление строковых выражений

Юрий “yurembo” Язев

Не так давно передо мной встала задача вычисления математических выражений. Конечно, обычно записанное выражения вида: a = (4 + 6) – 4 * 2 вычисляется в 2 счета стандартными средствами любого языка программирования. Однако, когда выражение принимает вид: “a = (4 + 6) – 4 * 2”, то есть передается, как строка, ситуация усложняется. Никакой язык программирования не понимает выражения внутри строки. Такая задача распространена и достаточно часто встречается. Например, пользователь вводит в программу выражение целиком, или приложение читает выражение из файла, строки ввода или другого источника.

Первая приходящая в этом случае идея – написать свой парсер, который бы разбирал строку на операторы, операнды и осуществлял вычисления. И это вполне возможно. Между тем, стоит учесть большое количество математических операций, кроме вездесущих: +, –, *, / в математике есть: cos, sin, tan, asin, acos, log, sqrt, exp, etc., плюс логические операции: and, or, ==, <= и великое множество других. Прибавь к этому скобки и порядок вычисления. Из всего этого задача написания собственного парсера теперь не кажется простой. Еще к этому стоит прибавить необходимость удовлетворительной скорости парсинга, иначе перебор строк будет занимать долгое время.

Компиляция библиотеки и подключение ее к проекту


Решение – воспользоваться готовой библиотекой для парсинга математических выражений. Сделав небольшой ресерч, я остановил свой выбор на muParser. Во-первых, muParser – это проект с открытым исходным кодом, он обладает высокопроизводительным парсером для разбора строк и создания выражений, учитывая, как стандартные математические функции, так и пользовательские; в процесс вычисления можно добавить кастомные переменные и константы. Библиотека написана на C++, компилируется с любым современным компилятором. Имеет обертки для C и C#. Но последнее нам, в данном случае, не особо интересно, потому что мы будем использовать C++.

Давай откомпилируем либу из исходников, подключим ее к новому проекту, разберемся в ее возможностях более подробно и напишем  примерчик. muParser хоститься на GitHub, кроме того у либы есть своя страничка. Скачай с GitHub репозиторий muParser, распакуй его в удобный каталог. В подкаталоге build открой подпапку msvc2013. Я использую Visual Studio 2015, но проблем не обнаружил. В текущей папке открой решение muparser.sln. Согласись на обновление библиотек. В результате откроются 3 проекта: собственно, muparser, example1, example2, активным из которых будет первый. Из ниспадающего списка цели компиляции выбери Release Static. Я решил использовать статичную линковку в итоговом проекте, если у тебя другие планы, заюзай динамическую – Release DLL. Построй решение. Вместе с muparser будет скомпилирован example1. Можешь запустить последний и посмотреть его вывод. Кроме того, это приложение позволяет вводить любые математические выражения и получать соответствующие результаты. В подпапке lib будет создана итоговая статическая либа – muParser32.lib.

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


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


Надо подключить muParser к нашему проекту. Открой свойства проекта. В ниспадающем списке Configuration выбери All Configuration. Далее добавь пути к папкам с заголовочными файлами muparser и библиотечными файлами (в пункте VC++ Directories). 


Разверни свиток Linker перейди на пункт Input. В списке справа строку Additional Dependencies дополни именем подключаемой библиотеки: muparser32.lib; (перед Additional Dependencies). Щелчком по кнопке OK окно можно закрыть. Не забудь из ниспадающего списка цели проекта выбрать Release, поскольку у нас релизная библиотека. Если тебе понадобится дебажный проект, тогда надо собрать дебажную версию либы. На этом настройка проекта окончена.

Ознакомление с функционалом muParser


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

#include "stdafx.h"
#include <iostream>
#include "muParser.h"

// Function callback
double MySqr(double a_fVal)
{
    return a_fVal*a_fVal;
}

// main program
int main(int argc, char* argv[])
{
    using namespace mu;

    try
    {
        double fVal = 1;
        Parser p;
        p.DefineVar(L"a", &fVal);
        p.DefineFun(L"MySqr", MySqr);
        p.SetExpr(L"MySqr(a)*_pi+min(10,a)");

        for (std::size_t a = 0; a < 100; ++a)
        {
            fVal = a;  // Change value of variable a
            std::cout << p.Eval() << std::endl;
        }
    }
    catch (Parser::exception_type &e)
    {
        std::cout << e.GetMsg().c_str() << std::endl;
    }
    return 0;
}

Это стандартный пример с официальной страницы muParser, немного дополненный для возможности компиляции в Visual Studio 2015. Центральное место занимает объект класса Parser. Собственно, с его помощью выполняются все действия по инициализации и вычислению выражения. Вначале в программе определяется функция обратного вызова MySqr, которая будет использована в вычислении. Затем, уже в функции main() после определения переменной fVal, значение которой так же использующееся в вычислении, объявляется объект Parser пространства имен mu. Так как мы создали его в стеке, нам не понадобится удалять его, с другой стороны, при его создании/удалении в куче нам послужат new/delete. 

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

p.DefineVar(L"a", &fVal);

Как видно в примере, метод принимает 2 параметра: имя переменной, используемой в аппарате – строкового типа mu:string_type. Этот тип muPaser соответствует стандартному строковому типу широких символов, от чего предваряется литерой L. Вторым параметром передается указатель на ранее объявленную и инициализированную переменную в C++-коде. muParser поддерживает переменные только типа double. Между тем, математический аппарат работает со своим универсальным типом данных: value_type, который соответствует числу с плавающей точкой единичной или двойной точности.
Константы внутри математического аппарата могут быть двух типов: double и string. Значения констант, в отличие от значений переменных, хранятся в байт-коде и не ссылаются на значения извне аппарата. Чтобы добавить в аппарат константу первого типа, участвующую в вычислении, надо вызвать метод DefineConst с теми же двумя параметрами, что в предыдущем случае. Для добавления константы типа string, надо вызвать метод DefineConst, он принимает строку – имя константы и строку – ее значение.
Кроме добавления переменных и констант в аппарат, их можно оттуда удалить. Для удаления именованной переменой достаточно вызывать метод RemoveVar, который принимает название удаляемой переменной. Чтобы удалить из аппарата все переменные надо вызвать метод ClearVar. С другой стороны, ClearConst удаляет все константы.
Для объявления пользовательской функции достаточно вызвать метод DefineFun с двумя параметрами: именем функции, по которому она будет вызываться внутри аппарата, и именем ранее объявленной в C++-коде функции:

p.DefineFun(L"MySqr", MySqr);

MySqr – ранее объявленная функция для вычисления квадрата параметра:

double MySqr(double a_fVal)
{
    return a_fVal*a_fVal;
}

После определения переменных, констант и функций внутри аппарата, можно в него передать выражение для вычисления. Это осуществляется с помощью метода: SetExpr:

p.SetExpr(L"MySqr(a)*_pi+min(10,a)");

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

Когда все готово для вычисления математического выражения, для получения его результата достаточно вызвать метод Eval объекта класса Parser. Он ничего не принимает. В зависимости от того, какое выражение задано, в итоге, метод возвращает или значение типа double, или указатель на массив значений типа value_type. В первом случае, это стандартное выражение, возвращающее один результат, такое, как представлено выше. Во втором случае, это несколько выражений, записанных через запятую, например: sin(x),y+x,x*x. То есть каждое из них выдает свой результат, из чего формируется массив значений value_type, указатель на который возвращается перегруженной функцией Eval.

Приложение в работе

Как видно в примере выше: в математическом аппарате может возникать свой ряд исключений, принадлежащих типу Parser::exception_type. У этого типа существуют функции для получения различных сведений о произошедшей проблеме:
  • exception.GetMsg() – возвращает сообщение об ошибке;
  • exception.GetExpr() – возвращает текущую формулу, в которой произошло исключение;
  • exception.GetToken() – возвращает лексему, соответствующую данной ошибке;
  • exception.GetPos() – возвращает позицию в текущей формуле;
  • exception.GetCode() – возвращает код ошибки;

После того, как математический аппарат будет укомплектован, во время компиляции C++-кода, сформированное в muParser выражение будет преобразовано в byte-код. Дальнейшие вычисления производятся не с помощью строк, а в байт-коде. От этого вычисление выражения в итоговой программе выполняется очень быстро. Если при следующей компиляции выражение будет изменено, то байт-код будет перекомпилирован.