среда, 26 июня 2013 г.

Записки программиста #1. Физика

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



Любой движущийся по ним объект имеет две нижние, крайние точки.  Схема не особо сложная и она удовлетворяла начальным условиям, но запросы стали расти.
Для 2д + XNA есть два физических движка: box2d и farseer.
Они оба базируются на С++ версии box2d, но farseer довольно давно двигается в свою сторону, да и шустро. Так что для сравнения я взял farseer.
«+» готового движка (исключительно для меня):
  • покрытие всех задач связанных с физикой;
  • код более-менее уже стабильный;

«-» готового движка:
  • непонимание его работы;
  • отсутствие опыта работы с ним и как следствие возможные не предвиденные проблемы;
  • сложность его внедрения в существующую архитектуру;
  • непонятные вопросы как сделано то, или иное;
  • вопрос с производительность;

Минусов оказалось больше и конечно эти минусы можно назвать притянутыми, но для меня они все-таки минусы. Было решено допиливать свой движок.
Шла осень, проблемы в финансовом плане на работе становились все острее, к счастью поступило предложение, о новой работе, от которого я не смог отказаться. Новая работа, это новый коллектив, новые требования к работе, новые задания. Задания довольно интересные и времени на свои проекты совершенно не осталось, но не спеша я стал решать задачу со своим физическим движком. Так плавно подступила зима, время пролетело незаметно, иногда конечно приходилось отвлекаться на другие свои проекты и идеи. В новогодние праздники я решил вплотную заняться физикой, это уже была 7 версия данного движка. Если в начале, я старался писать и придумывать все сам, с нуля, то теперь я стал все больше смотреть, как это сделано у других. В результате через некоторое время я вернулся к первому своему вопросу, продолжать допиливать движок или взять готовый, правда и изменились и минусы, с большинством я уже разобрался, пока писал свой…
Остался только последний, вопрос производительности, подходя к делу с некоторым недоверием, я сперва посмотрел демонстрации, и поскольку, не зная способа лучше, стал его «трогать».
В целом он мне понравился, и было решено использовать его в качестве основы, и все-таки пришлось решать много новых задач, но процесс двигался, жалко, что новогодние праздники такие короткие. Итог моих новогодних каникул:



Как итог новогодних каникул - с физикой определился, но снова работа, семейная жизнь, работа над приложением «Слова любимым» - ни минутки покоя  =)
 Работа встала на не определенный срок.
И только поздней весной удалось снова к нему вернуться. Поскольку прошло довольно много времени, осмысление проекта стало более явно. Все это время я старался все идеи, мысли записывать, тем самым появилась точная цель,  что же я хочу видеть в итоге и когда, это что-то должно появиться на свет.
Если раньше целевая платформа была Windows Phone 7, то хорошо подумав, стало ясно, что делать уже нужно Windows Phone 7/8 + Windows 8, так же следовало сразу рассмотреть вопрос о портировании на другие платформы. О этих тяжких думах я расскажу в следующей статье.

пятница, 21 июня 2013 г.

Записки программиста #0. Введение

Речь пойдет о создание игры AlienStorm, которая на момент написания статьи находится до сих пор в разработке. Я долго думал, стоит ли вести дневник разработки или нет, но все-таки пришел к мысли, что стоит. Это упорядочивает мысли, да и читатели иногда дают очень дельные советы. И надеюсь, помогут в будущем с тестированием игры.
Все началось в конце зимы прошлого года, с другом мы решили создать игру наподобие Worms, только основные действующие лица танки и инопланетяне. Тогда и родилось название AlienStorm, случайно наткнувшись на то, что такое название уже использовалось в гейм деве в 90 годах для сеги, немного смутило, но решили оставить как есть. Игра для простоты должна была стать 2д, целевая платформа Windows Phone. Создав первый прототип игры и  поигравшись с управлением, пришли к мысли, что создание пошаговой игры не совсем то, что хотелось, подумали о гибридной системе, некоторые бои реал-тайм, некоторые пошаговые, но тоже не понравилась, с тех пор игра стала реал-тайм.
Потом начались проблемы на работе, поскольку этот человек был мой коллега, они коснулись и его и разработка на время встала. Приходилось поправлять свое финансовое состояние, писать диплом. Новая работа у моего прошлого уже коллеги, занимала его целиком, и ему постепенно пришлось, отказался, я же не сдавался. Шла весна и мне нужен был художник и такой человек быстро нашелся, он не только рисовал, что требовалось, но и постоянно приносил в проект, что-то новенькое.
Защитив диплом, на работе я выпросил отпуск и целиком погрузился в проект.
Художник же тоже не пропадал и игра постепенно, приобретала лицо:



появлялись новые карты:



Были разработаны основные положения, что танки можно покупать, улучшать, появилась система скилов, появилось осмысление UI при игре:


Через некоторое время мы взялись за модели. Модели решено было делать в 3д, чтобы дальнейшее их использование было более простым. И тут стали понимать, что мы не используем потенциала созданных моделей, стало как всегда хотеться больше, чтобы гусеницы двигались, колеса крутились и тд.
До этого мы использовали самописный движок, в котором из физики есть гравитация, а земля представляем собой набор прямоугольников, при движении по которым углы сглаживаются.

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

четверг, 13 июня 2013 г.

Push уведомления и их эффективность.

Месяц назад я решил в своем новом обновлении приложения «Слова любимым» добавить функцию Push уведомлений. Прошел месяц, настал праздник, День России – чем не повод испытать эти уведомления и увидеть их эффективность.
Поговорим немного о Push’ах.
Основная причина использования Push Notifications со стороны разработчика, это оповещения пользователей о каких либо событиях, напомнить пользователю о Вашем замечательном приложении, лишний раз запустить его, что согласитесь довольно таки важно.
В структуре Push Notifications существует специальный сервис в облаке, который делает возможность работы уведомлений. Когда устройство хочет получать уведомления, то обращается к этому сервису и устанавливает с ним постоянное соединение. В ответ на это сервис выдает этому устройству уникальный URI, используя который можно отправить по протоколу HTTP некоторое сообщение. Это сообщение получает тот самый сервис в облаке и пересылает его соответствующему устройству. Логично, что для каждого устройства и приложения этот URI будет уникальный. Таким образом, работу уведомлений в Windows Phone  можно описать так:
  • Устройство устанавливает соединение с сервером Microsoft и получает уникальный HTTP-адрес;
  • Устройство передает этот HTTP-адрес тому, кто будет уведомлять устройство о чем-либо;
  • Когда необходимо уведомить устройство о чем-либо, приложение, которому был передан HTTP-адрес отправляет специальное HTTP-сообщение на этот адрес;
  • Сервис Microsoft получает это сообщение и по возможности доставляет его на устройство. Если доставить сообщение на устройство не удалось, то отправитель получит соответствующее сообщение.
Схематически этот алгоритм можно изобразить следующим образом.


Согласитесь, все довольно просто и понятно.
Существуют четыре разных вида уведомлений для Windows Phone:

  • Tile Notifications – если ваше приложение закреплено на начальном экране, вы можете обновить Tile (плитку) вашего приложения. Например, вы можете изменить фон картинки, используя диапазон чисел 0-99. При отправке уведомления указывается URL некоторого изображения, расположенного в сети. Когда устройство получает уведомление оно самостоятельно загружает изображение из сети и обновляет его на рабочем столе устройства.
  • Toast Notifications – при получении этого типа уведомления на экране устройства всплывает небольшое сообщение, содержащее текст уведомления. При этом приложение в данный момент может быть неактивным. При нажатии на это сообщение пользователь может быстро переключиться к соответствующему уведомлению.
  • Raw Notifications – при получении этого типа уведомления его содержимое передается непосредственно приложению. Приложение в праве обработать содержимое уведомление так, как считает нужным по своему собственному алгоритму. Это наиболее гибкий способ получения уведомлений от внешних сервисов.
  • Voip Notifications – этот тип уведомлений появился в Windows Phone 8. Служит оповещение о входящем звонке для Voip приложений. Он подобен Raw Notifications, но обрабатывается фоновым агентом.
Рассмотрим все описываемые случаи смысла нету, тк в интернете полно литературы как и что происходит, как на русском языке так и на английском.

Для своего маленького эксперимента я использовал Toast Notifications Push.
За месяц работы приложения было собрано 39219 устройств.  
В самом начале я допустил одну маленькую ошибку, которая чуть не вылилась в большую. Не оценив количество устройств, я начал отправлять сообщения в порядке очереди, дожидаясь  отправки предыдущего или ошибки, в результате отправка продолжалась с 11 до 18 часов.

В ответ от сервера нам приходят:
  • 18256 запросов вернулось различными ошибками от сервера (Exeption). В будущем я хочу их дублировать  раза 3 через некоторое время. Считаем, что они не доставлены.
  • 13910 запросов вернулось со статусами: NotificationStatus: Received, NotificationChannelStatus: Active, DeviceConnectionStatus: Connected (RAC) будем считать, что такое сообщение дошло до цели.
  • 7041 запрос вернулся со статусом: NotificationStatus: Received, NotificationChannelStatus: Active, DeviceConnectionStatus: TempDisconnected (RAT). Считаем, что они не доставлены.
  • 10 запросов вернулось со статусами: NotificationStatus: Suppressed, NotificationChannelStatus: Active, DeviceConnectionStatus: Connected (SAC). Считаем, что они не доставлены.
  • 2 запроса вернулись со статусами: NotificationStatus: Suppressed, NotificationChannelStatus: Active, DeviceConnectionStatus: TempDisconnected (SAT).  Считаем, что они не доставлены.

В среднем за это время посещают приложение 1664 пользователя, в результате Push уведомлений мы получили 4735 пользователя, что на 3071 больше. Не все пользователи замечают Toast уведомления, не все переходят, в результате 22% от считавшимися удачными, а если добавить еще RAT, SAC, SAT с которыми не все понятно, то 14,5%. Я рассчитывал на меньшее и очень доволен результатами данного опыта.

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


понедельник, 13 мая 2013 г.

Реклама,статистика и продвижения приложений применительно к WP7. Часть 3.

Прошло много времени с моих последних статей:

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

Тестировании рекламы происходит на моем приложении «Слова любимым» оно ориентировано на российскую публику и находится в топе бесплатных приложений на первой странице (спасибо всем кто помогал раскручивать его), количество посещений в день около 4700 человек в день, средняя продолжительность посещения 00:08:39, количество вернувшихся посетителей 86,3%, максимальный пик на текущий момент  был 8 марта 20000+ посещений.
За это время мною было протестировано большое количество рекламы, некоторые показали себя хорошо, от кого-то я ожидал большего, но не все так безоблачно. Расскажу о результатах тестов, приведу немного цифр и скажу немного слов о каждой, топ начинаем с конца (Не забываем, что данные результаты и тесты актуальны только для подобного приложения, но выводы сделать можно):

За апрель было 107,907 запроса рекламы, eCPM (эффективная цена за тысячу показов)0.01, Fill Rate (Уровень заполняемости – количество показов рекламы в вашем приложении, разделенное на число отправленных запросов (например, если зарегистрировано 100 показов и 1000 запросов, уровень заполняемости составит 10%) 28.26%,CTR (количество кликов по объявлениям в вашем приложении) 0.24% , заработано $0.44 USD.

Библиотека подключается к проекту довольно легко, проблем не возникло. Но, в предоставляемой dllке есть ошибки, приходится обрабатывать ошибку длл на уровне всех необработанных ошибок, в App.xaml.cs

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
 {
 if (e.ExceptionObject.StackTrace.IndexOf("Google") >= 0)
 {
 e.Handled = true; //ignore google admob control exceptions
 }
 }

Панель управления довольно не плохая, как говориться не чего лишнего, добавить новое приложение довольно просто, правда, все на английском, но проблем это не вызывало.
Для России и Windows Phone данный рекламный провайдер спросом не пользуется, за все время видел только одного провайдера рекламы  - это приложение «Будист», за клики платят очень мало, возможно ситуация для англоязычных приложений другая, но это под вопросом. С выводом денег в Россию проблем нет.

За апрель было 61 643 запроса рекламы, eCPM 0.01, заработано 0.71 USD.

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

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

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

Windows Phone/Windows 8 ориентированный провайдер рекламы, позволяет рекламировать свои приложения в обмен на отображение рекламы в вашем приложении.

Ну, тут все просто, чем больше Вы показываете, тем больше показывают Вас.

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

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

Немного цифр (вчерашний день, на момент написания статьи, не чем не отличающийся от предыдущих, за исключением постоянного роста приложения): количество мною показанных объявлений 77517, вернувшиеся показы 54009, количество кликов 323, устанавливают около 10%, те это около 32 установок. Но если эти цифры Вам кажутся маленькие, то больше 80% пользователей возвращаются, те это около 500 пользователей прироста в месяц.

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


2) Plus1
На него я перешел не так давно, но думаю, с оценкой я не сильно прогадаю.
Это русский рекламный провайдер, вывод средств происходит на WebMoney в течении 5 дней, статистика идет с задержкой в 2 часа. Платят они исключительно за клики.
Очень не плохо рекламный провайдер, имеет много провайдеров рекламы, к сожалению, за ними нельзя наблюдать в панели управления.
Для Windows Phone нету  готовой dll, но они предоставляют API для работы, те эту же рекламу можно вставить и в Windows 8 проект, возможно, позже я выложу dll для работы с ней.
Статистика за день (вчерашний день, на момент написания статьи, не чем не отличающийся от предыдущих, за исключением постоянного роста приложения):
Показы - 15 905, клики – 407, CTR - 2,56%, доход - 333,65 руб, как мы видим средняя цена клика 0,82 руб.

1) Begun
Первое впечатление от данного провайдера рекламы было ошибочное.
Предлагаемая библиотека для работы с данным провайдером рекламы простая в подключении и простая в работе. Данный провайдер платит за клики и за показы, но показы очень редко покупают, поэтому все вертится как всегда на кликах.
Панель управления довольно простая и понятная, но вот подключение нового приложения происходит только через тех. поддержку и другие операции тоже.
Вывод средств возможен на  WebMoney при наличии начального сертификата, но он происходит с задержками 2-3 месяца, так же есть возможность заключить договор с ними и расчет будет происходить на банковский расчетный счет. На сайте у них указано, что договор заключается только с ИП, но через тех. поддержку возможно заключить договор и с физ. лицами.
Статистика за день (вчерашний день, на момент написания статьи, не чем не отличающийся от предыдущих, за исключением постоянного роста приложения):
Клики – 357, доход - 509,71 руб, максимальная ставка за клик 8,20 руб, рекламодателей 16, как мы видим средняя цена клика 1,43 руб.

Сейчас для своего приложения я использую Begun - 45%,  Plus1 - 45%, Adduplex - 10%.
После получения всех выплат, если все пойдет как ожидается, в следующем обновлении я поставлю Begun - 55%,  Plus1 - 35%, Adduplex - 10%.

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



суббота, 23 марта 2013 г.

Secure Software Development моими глазами.


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

Я хочу рассказать о конференции Secure Software Development, которая проходила в Москве 05.03.2013г в выставочном центре ИнфоПространство.

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

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

На ней выступали эксперты Microsoft: Glenn Pittaway, руководитель команд, отвечающих за обеспечение целостности ПО и жизненный цикл безопасной разработки, Alex Lucas — лидер группы исследователей безопасности, Андрей Бешков – руководитель программы информационной безопасности, а также многие другие не менее важные личности.

Открывал конференцию Stive Lipner.
В своем докладе он рассказал о Capability Maturity Model Integration. CMMI - набор моделей (методологий) совершенствования процессов в организациях разных размеров и видов деятельности. CMMI содержит набор рекомендаций в виде практик, реализация которых, по мнению разработчиков модели, позволяет реализовать цели, необходимые для полной реализации определённых областей деятельности.
Набор моделей CMMI включает три модели: CMMI for Development (CMMI-DEV), CMMI for Services (CMMI-SVC) и CMMI for Acquisition (CMMI-ACQ). Наиболее известной является модель CMMI for Development, ориентированная на организации, занимающиеся разработкой программного обеспечения, аппаратного обеспечения, а также комплексных систем.

Также он коснулся темы SDL (Microsoft Security Development Lifecycle), откуда она взялась и немного истории её развития.
Для меня это новый опыт, позднее я попытаюсь более подробнее с ней познакомиться, сейчас приведу пару показавшихся мне интересных ресурсов по ней.

Конференцию продолжил Glenn Pittaway, он более подробнее остановился на SDL и CMMI.



Microsoft Security Development Lifecycle (SDL) является ведущим продуктом в отрасли программного обеспечения, обеспечение безопасности процесса, созданного Microsoft. Он используется в Microsofte с 2004 года, SDL сыграла важную роль в встраивание безопасности и конфиденциальности в программном обеспечения.
SDL Optimization Model:

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



Любое совершенствование процессов подразумевает плавный/поэтапный процесс. В CMMI эти этапы формализованы - существует 5 уровней зрелости, каждый из которых указывает на зрелость процессов организации.
5. Фокус на совершенствование процессов
Оптимизируемый
4. Процессы измеряются и контролируются
Управляемый на основе
 количественных данных
3. Процессы определены на уровне всей организации. Процессы исполняются заблаговременно
Определенный
2. Процессы определены на уровне проектов. Зачастую процессы появляются в ответ на определенные события
Управляемый
1. Процессы непредсказуемые, слабо контролируемые. Процессы появляются в ответ на определенные события
Начальный

Андрей Бешков немного рассказал о тот, что происходит за кулисами Windows Update. 
В целом это были общие слова, но думаю если заменить уязвимость на баг, то неплохо бы ее применить у нас на работе в плане тестирования :-)

Тестировщики: 
Фиксирование бага -> воспроизведение -> определение приоритета бага по заведенным параметром (таблица с описанием классификаций бага) -> поиск подобных багов, определение перечня устройств которые подвержены ему -> передача разработчикам
Разработчики:
Фикс -> Создание регрессивных тестов-> автоматическое тестирование -> ручное тестирование -> передача в отдел тестирование
Тестировщики:
Если исправлена, то закрытие, если нет, то возвращаемся в начало c места воспроизведение.

Также рассказал о программе Microsoft Security Update Validation Program (SUVP) - обеспечение разработчиков версий обновлений и тд, на тестирование совместимости.

Также озвучил интересные цифры, что благодаря SDL удалось избавиться от большого количества уязвимость в своих продуктов:
WP7 - 2 уязвимости, WP8 - 0 уязвимостей, для сравнения в iphone последней прошивке было найдено более 200. Правда стоит оговориться, что WP пока не очень популярная система и я бы сказал так - нахождение и использование уязвимостей стало намного сложнее, а выгода пока не существенная.

Риски самостоятельной разработки бизнес-приложений и способы их снижения.
Читал его представитель Appercut Security Рустэм Хайретдинов.
Данная компания занимается аудитом ПО. Про рекламировал программу ApperScan.
Говорил много дельных мыслей, о том, что как правило производители ПО задумываются о качестве кода и его уязвимостях уже после происшествий, а следует задумываться на этапе проектирования или хотя бы перед релизом.
Процесс аудита и изучение рисков очень дорогой процесс и подходит к сожалению не каждому, но есть куча средств автоматизированных которые не дают того % что авто + ручное исследование  но существенно улучшает качество продукта, к одному из этих продуктов и относится ApperScan.

Дальше был очень скучный и неинтересный доклад "Сертификация по требованиям безопасности информации: как обойти подводные камни".
Если в двух словах: готовьте документацию по проекту заранее и смотрите ГОСТы.

После обеда была очередь одно из интереснейших докладов который читал Андрей Бешков "Насколько Windows Phone безопасен?".
Очень интересный доклад - видео с конференции 2 зал с 14.30 минуту.

Второй по значимости для меня был доклад "Инструменты Visual Studio для контроля качества и безопасности кода" который читал Александр Яковлев.
В состав студии из коробки (многие доступны только в макс. версия) входит большое количество интересных вещей о которых я уже знал и нет:
Средство оценки качества кода в MS Visual Studio - оценка метрик кода, анализ покрытия кода тестами. Не плохая статья на хабре.
Средства поиска повторений кода Code Clone.
Инструменты архитектурного анализа msdn.

Вообщем много вкусного... нужно изучать.

P.S. Видео с конференции







суббота, 2 марта 2013 г.

Слова любимым for Win8


Наконец-то у меня дошли руки до создания первого своего приложения под Windows8
Это стал парирования уже известного ранее приложения «Слова любимым» с платформы Windows Phone. Цель – посмотреть активность на данной платформе, да и аккаунт там был куплен уже давно.

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

Получилось, как я считаю сносно:




Для сбора статистики я использовал гугл аналитикс. На скидку работает нормально.
Также в приложение вошла реклама adduplex, к сожалению я пока не понял, как можно перебросить рекламный трафик с WinPhone на Win8 и возможно ли вообще.

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

Все у кого есть Win8 ставьте себе приложение и лайкайте его =)
Буду премного благодарен =)

P.S. поддержка adduplex'a ответила:
Windows Phone and Windows 8 exchange networks are separate, so unfortunately you can't use credits gained on one to promote your app on the other.
Печально...

суббота, 29 декабря 2012 г.

С Новым 2013 годом!


С Новым Годом друзья, товарищи, коллеги! Это был тяжелый год, надеюсь, для всех этот год был плодотворный и успешным, часть ваших идей и моих воплотились в жизнь, чему я очень рад! Желаю всем в новом году счастья и творческих успехов. С НОВЫМ ГОДОМ!!!