...

суббота, 1 августа 2015 г.

Consulo: Выполнения Java кода на .NET платформе с помощь IKVM.NET

Привет хабр. Мои предыдущие посты описывают только поддержку Unity или Mono/Microsoft .NET. Но при есть ещё много вещей про которые я не рассказываю. Вот про одну я хочу рассказать, это IKVM.NET

Для тех кто пропустил мои посты:
Consulo — это форк IntelliJ IDEA Community Edition, который имеет поддержку .NET(C# на текущий момент, и на этот сектор пока идет большой акцент), Java

Представим ситуацию, что нам нужно запустить Java проект под IKVM.NET.

Начнем сначала с IKVM.NET

IKVM.NET is an implementation of Java for Mono and the Microsoft .NET Framework. It includes the following components:

A Java Virtual Machine implemented in .NET
A .NET implementation of the Java class libraries
Tools that enable Java and .NET interoperability


Найти больше про IKVM.NET можно здесь , читаем туториал но он скучный, и не сильно юзабелен для разрабоки.

Ставим нужные плагины для Consulo, нам нужны IKVM.NET + Microsoft .NET(Mono IKVM.NET не работает, проблема со стороны Xamarin) и их зависимости. В итоге наш список плагинов выглядит так:

image.

Приступим. Создаем Java проект, и запускаем

image

Давайте посмотрим, что такое println:

image

Мы перешли на PrintStream.class который находится в rt.jar — все как обычно

Переходим на IKVM.NET


Теперь у нас ситуация — я не хочу терять поддержку JVM, но при этом я хочу иметь возможность запустить код под IKVM.NET. Копировать проект, или терять Java настройки, желания я не имею. Что нам делать?

Под другими IDE — таких как Visual Studio или IntelliJ IDEA, пришлось бы делать как выше описано — но не в Consulo. Consulo имеет функционал называем Module Layers, он позволяет создавать несколько слоев настроек для модулей, и при этом быстро переключатся между ними.

Стандартно — каждый модуль имеет один слой который имеет названия Default. .NET проекты создаются с двумя слоями Debug & Release

Заходим в настройки модуля, и делаем копию текущего слоя:

image

Называем его, например, IKVM:

image

Теперь мы имеем два слоя:

image

Мы имеем полную копию Default слоя, с поддержкой JavaExtensions включена Java)

Выключаем Java поддержки, и включаем IKVM.NET:

image

Java SDK нужно указывать, так как IKVM .NET не имеет встроенного компилятора Java кода, и используется javac.

Идем выше, настраиваем.NET расширения модуля:

image

Нам нужно включить Allow Source Roots, и выбрать Main TypeIKVM.NET не умеет выбирать Entry Point класс. Как видим, мы уже можем выбрать Java класс.

Так же нам нужно, добавить в зависимости mscorlib.dll:

image

Если мы все правильно настроили, пробуем запустить уже существующий Run Configuration:

image

Но это эмулирует поведения java.exe, и во время запуска транслирует JVM байткод в CLI, что гарантирует медленный запуск.

IKVM.NET предлагает компиляцию Java кода в *.exe файл, который потом запускается как обычное .NET приложения. Поэтому под IKVM.NET нам доступная другая Run Configuration, которая запускает .NET App:

image

Запускаем:

image

Как видим, мы уже запускаем untitled1.exe а не ikvm.exe, скорость запуска намного выше :).

Пробуем перейти теперь на println:

image

Теперь мы видим что перешли в PrintStream.msil, который лежит в IKVM.OpenJDK.Core.dll. Тоисть мы работает уже с .NET байкодом, и можем например использовать .NET классы (все .NET классы имеет начальный namespace cli, что бы не конфликтовать с Java классами):

image

И вызывать методы:

image

Теперь давайте вернемся на JVM реализацию:

image

image

Как видим — код красный, так как на JVM, .NET классы недоступные.

PS


Этот пост — показывает насколько гибкая поддержка, и не сосредоточена только на каком-то стеке технологий. IKVM.NET плагин много чего не умеет, ибо это не приоритетный плагин для меня.

В будущем хотелось бы увидеть Debug для Java кода на .NET платформе. Задача есть, и она глобальная — увы пока не решаема для меня.

Спасибо

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

В Омске прошёл первый в России турнир по leanpoker

leanpoker

Иван Немытченко - организатор первого в России турнира по leanpoker 1 августа 2015 года в городе Омске состоялся первый в России турнир по leanpoker, организатором которого выступил Иван Немытченко. Турнир по leanpoker прошёл в IT Loft по адресу г.Омск, ул. Учебная 83.
Leanpoker — это не простое состязание игроков в Безлимитный Техасский Холдем. Это соревнование программистов, которые должны были написать покерного бота, целью которого было переиграть ботов-соперников. Особенностью турнира также является и то, что нет принципиальной разницы в том, на каком языке программирования пишет команда. Следовательно и языков программирования в турнире было представлено несколько, чуть меньше, чем число команд. А всего в турнире приняли участие 6 команд:

  • sevenbits — JavaScript
  • JBot — Java
  • Awesome incredible Poker Bot — Ruby
  • PythonPokerTeam — Python
  • Boris — Ruby
  • LeanNodeJS — JavaScript

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

Команда JBot Все эти шесть часов между ботами запускались мини-турниры, поначалу каждые две минуты, ботом всё чаще и чаще, пока интервал между мини-турнирами не достиг 10 секунд. Логика ботов в начале турнира была самой простой. Некоторые из ботов просто постоянно выставляли на ставку весь стек и балом правил полный рандом. Некоторые боты постоянно делали ставку в 50 фишек, что, к слову говоря, с самого начала принесло успех команде sevenbits и сохраняло им лидерские позиции длительное время. Пока вперёд не начала вырываться команда JBot. Участники этой самой малочисленной команды применили, как оказалось, довольно успешную стратегию. Их бот дожидался, когда другие соперники выбьют друг друга из игры и он не останется один на один с оставшимся игроком, ну а дальше дело техники. Особенностью начисления балов за выигранный ботом мини-турнир было то, что бот, занявший первое место приносил команде 5 очков, а бот занявший второе место приносил команде 3 очка. Таким образом, команда стабильно зарабатывала очки, лишь корректируя нюансы стратегии в зависимости от того, как изменялось поведение ботов противника.

Команда sevenbits Говоря о поведении ботов противника, хотелось бы упомянуть тот факт, что командам была доступна история всех раздач, в том числе и то, с какими картами играли боты соперников. Таким образом, проанализировав стратегию и поведение ботов противника, команда корректировала алгоритм собственного бота.
Хотя не все команды использовали полностью историю раздач, а некоторые принимали решение о поведении ботов лишь на основании карманных карт. И… команда sevenbits в конце матча вырвалась вперёд, руководствуясь как раз именно этой стратегией.
Хотелось бы отметить, что было очень интересно наблюдать, как команды, особенно те, которые не имели большого опыта в покере, или не имели его вообще, приходили к классическим приёмам покера. Например, воровство блайндов в поздней позиции или корректировка агрессивности игры в зависимости от размера стека своего бота.

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

Команда LeanNodeJS Так участники команды LeanNodeJS признались, что на JavaSripct в подобный условиях постоянных коммитов в мастер ветку, которая сразу «идёт в продакшн», можно очень здорово поотстрелять себе все ноги. Но несмотря ни на что, они остались очень довольны турниром, поскольку взглянули на свою работу под иным углом.
Команда Boris была той командой, которая высказывала интересные идеи по построению алгоритма работы ботов и постоянно искала новые приёмы, которые позволили бы совершенствовать игру бота. Но, конечно, другие команды также не дремали и старались сделать всё возможное для своей победы.

Команда Boris Длительность же турнира должна была состоять из четырех часовых секций, но команды изъявили желание провести пятую секцию, мотивируя это тем, что у них осталось лишь немного пофиксить баги своих ботов. Ни Иван, ни я не думали, что что-то кардинально изменится в расстановке сил между командами, поскольку команды все-таки уже устали за всё время, и скорее наделали бы ошибок, которые привели бы к краху их игры.
Но на 15-ю минуту пятой секции команда Awesome incredible Poker Bot закоммитила что-то взрывное в своего бота и он начал резко идти к первым двум местам, сильно сбивая с позиций команду JBot, что заставило их посылать коммит за коммитом, чтобы исправить ситуацию.

Команда Awesome incredible Poker Bot А чуть позже и команда sevenbits привнесла изменения в программный код своего бота, что вывело их на первую позицию по итогам турнира.
В самом конце наблюдение за турниром ботов было приостановлено, но сама баталия между ботами не была поставлена на паузу, как это делалось во время перерывов. Вместо этого ботов оставили биться друг с другом, а экран проектора и мониторы ноутбуков были погашены. Некоторое время все участники турнира рассказали свои впечатления о турнире и чему они научились. А потом был просмотр результатов, который весьма удивил всех участников крутым графиком бота команды sevenbits после их последнего коммита.
В итоге все участники мероприятия получили массу положительных эмоций и весьма интересный опыт разработки. И это будет не последний турнир по leanpoker.

Участники турнира по leanpoker

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

История одного клона


Три пути у человека, чтобы разумно поступать:
первый, самый благородный, — размышление;
второй, самый легкий, — подражание;
третий, самый горький, — опыт.
Конфуций

Однажды прохладным весенним вечером 2013 года захотелось мне сделать собственный аналог приятнейшей старой игры Scorched Earth, но с разными вытребеньками. Под хорошее настроение и заводную музыку я бросился кодить на первом попавшемся под руки IDE и фреймворке. По злой иронии это оказался WFP для Windows 8 Store. А вот для полета снаряда и реакции окружения я взял Farseer Engine — C# порт Box2D.
Сам уже не помню, как от идеи разрушаемой земли и баллистических ракет я перешел к катапультам, строениям из блоков и монолитному ландшафту. Так и началась двулетняя история моего клона Angry Birds.

Лето


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

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

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

Медленно пришло осознание, что проект выходит на другой качественный уровень, и понеслось: для соответствия фонам локаций я заказал другому художнику иллюстрации, сам доработал и дорисовал модельки орудий в 3d и 2d, чтобы подогнать по стилю, научился работать с форматом редактора Gleed 2D и начал рисовать уровни один за другим, заказал амбиент музыку для локаций, купил саундтрек для основной темы и многое-многое другое. Чтобы игра была не «просто клоном» я придумал киллер-фичу: противники стали огрызаться и атаковать игрока.
Лето заканчивалось.

Осень


Когда началась осень я уже видел, что задрал планку качества слишком высоко, а ресурсов слишком мало. Я уже умел неплохо рисовать стильные рамочки и кнопки в фотошопе, сумел сделать из трех разных магов все 7 с помощью фильтров и эффектов, редактировал звуки и музыку, подгонял цветовую гамму иллюстраций, вел переговоры с локальным офисом Microsoft о фичеринге и устройствах для тестов, придумал под сотню разных уровней, посадил зрение на 0.1 по таблице Сивцева. Жена всерьез посматривала на чемоданы — намекала, что пора на море; все работы по игре я делал сам, голова кипела. Неделя отпуска немного разгрузила мозг, но существенно ничего не изменила.

На фоне всего этого я редко задавался вопросом, почему акцент сместился с «трешнячка» с краденой графикой на масштабный проект с сотней уровней, а вместо движка я использую WPF Canvas, Rectangle и ImageBrush. Эту лютую связку я достаточно хорошо отладил, использовал сложные трансформации, имитировал параллакс эффект для фонов, пусть и тратил на каждую такую операцию непростительно много времени. Какое-то время я себя успокаивал, что это все даст мне покрытие сразу четырех платформ: десктопный Windows, мобильный Windows Phone 8 и планшетный Windows 8, а заодно и Silverlight версия для веба. А уже для Android и iOS я что-то придумаю. Благо, Visual Studio не доставлял особых проблем, а устройствами и лицензиями Microsoft меня обеспечил.
Тогда же я невероятным усилием сделал полуавтоматический порт с C# + WPF Canvas на JavaScript + HTML5 Canvas, чтобы поучаствовать в конкурсе на Tizen и просто выйти в веб, а может и на другие платформы без нативного кодинга.
Была выложена версия в Tizen Store, Windows Marketplace и Windows Store и готовы три локации из пяти, когда полетели белые мухи.

Зима


Холодный сезон я начал со сдержанным оптимизмом — купленные обзоры и фичеринг от Microsoft приносили много закачек, правда дохода игра принесла совсем мало — около $50 за полтора месяца, хотя на обзоры и рекламу было потрачено вчетверо больше. Я связывал это с кучей факторов, непопулярностью Windows Phone, ненавязчивой монетизацией через In-App покупки и т.д. Две последние локации все оставались закрытыми, но я пока не мог найти в себе силы сделать уровни для них и выпустить масштабный апдейт. Веб версия нещадно тормозила на Tizen эмуляторе и на мобильных устройствах Apple и дешевых Андроидо-фонах, потому была заброшена.
Тогда же пришла идея выложить десктопную версию на Desura и Steam. С первой проблем не было, а во втором оказалась сложная процедура аппрува сообществом через Steam Greenlight. Именно в Greenlight сообществе я впервые услышал мнение, что игра — говно.
Затем был день рождения кого-то из родственников и я подсунул планшет с игрой 12-летнему племяннику. Он честно прошел 17 почти одинаковых первых уровней, три раза попробовал пройти 18й и начал искать, что еще есть поиграть на планшетике.
К новогодним праздникам цифра дохода дошла до $100, что вместе с продажей призов от конкурсов хоть как-то смогло компенсировать треть расходов на графику и рекламу.

Весна


К апрелю месяцу скачивания на Windows Phone стабилизировались на уровне 0-3 загрузки в день и до 5 загрузок на Windows 8. Проект пора было закрывать, но все еще крутилась мысль доделать последние две локации, но уже как-то иначе. Я разместил объявление о поиске левел дизайнера на рисование 30-40 новых уровней и адаптации старых. Через какое-то время нашелся интересный исполнитель, мы разговорились, обсудили ситуацию и я в очередной раз услышал, что игра — говно. Парень оказался опытным гейм-дизайнером и вместо разработки уровней я у него заказал детальный план по переделке игры для максимальной привлекательности и играбельности. Левелы согласился делать другой исполнитель (не преминувший заявить, что все готовые уровни — говно) и все, казалось, может ожить и заиграть, особенно на iOS. И тут WPF нанес коварный удар — код портироваться на нативные CGLayer и пр. он отказался в принципе. По-сути, надо было переходить на нормальный движок, но сил и желания не было. Я поблагодарил левел и гейм дизайнера, оплатил их время и закрыл проект.

Год спустя


За год я успел отойти от тяжелого поражения, выпустил кучку мелких и два средних проекта, поработал на телеком гиганта в коммерческом проекте. Клон был успешно забыт, контент и код хранился в архиве, но вдруг осенью 2014 пришло сообщение, что игра получила аппрув в Steam и её можно выкладывать в продажу. Это было странно, это было дико, это вызвало море эмоций. Но делать я ничего не стал — выкладывать проект, чтобы услышать снова про, извиняюсь, говно, очень не хотелось.
Тем временем мой самописный OpenGL 2D движок для одного Point&Click квеста успел неожиданно заматереть и стать достаточно стабильным, а заодно и позволял писать бизнес логику одновременно для iOS/Android/WP/W8/XP/Mac. Такой себе, доморощенный велосипед, который пришелся больше по душе, чем Unity со товарищи. Под этот движок я придумал очередной мелкий проектик «на два месяца» и с началом лета 2015 вышел на прошлогоднего левел дизайнера дабы продумать уровни к новой игре. В ходе бесед с ним и новым партнером и родилась крамольная мысль возродить птице-клон на новом движке. Пара экспериментов показала, что это теперь в разы проще, чем прямой порт с WPF на нативную графику iOS.
Как результат, новый проект был поставлен на холд и два месяца мы потратили на воссоздание игры. Были выброшены 80% старых уровней, переделан геймплей по плану прошлогоднего геймдиза, уменьшено количество повторений, улучшена графика, реализованы все локации и т.д. Одним словом, игра пережила второе рождение, а заодно были сделаны ачивменты, трейд карты и баджи для Steam.

Релиз


На прошлой неделе я выложил игру сразу в три маркета — iOS, Android и Steam. Первые два бесплатно с покупками, в Steam платно, примерно за доллар. Естественно, не обошлось без патчей в последнюю минуту; были баги и краши, внезапно не проходимые уровни и т.д., но все получилось оперативно уладить. Сообщество Steam восприняло игру весьма позитивно, количество негативных отзывов составило всего около 20%, покупки идут и сейчас, несколько человек уже прошли игру и взяли все ачивки, идет торговля картами и выкладываются скриншоты.
Одним словом, это была бы история со счастливым концом, если бы не показатели iOS и Android версий — в результате стартового фичеринга и обзора на 4pda стало ясно, что у нас есть аж 50 игроков и ни одной покупки. И это как бы не удивительно, ведь на этой же неделе вышли Angry Birds 2, где, похоже, свиньи могут атаковать игрока…

Резюме


Два года пролетели очень быстро, и тут были в основном падения, почти без взлетов, но все же кое-что внушает надежду. Мне было очень приятно, что Steam сообщество в целом игру приняло, а как разработчик я не мог не порадоваться работе кросс-платформенного движка. Приобретено море полезного опыта, я наступил и перемолол грабли «сделаем без движка», научился выводить игру в Steam, интегрировать ачивменты. Ну а главное, теперь я могу трезво оценивать свои силы и вижу какие задачи могу решить сам, какие с помощью команды, а за какие не стоит и браться.
И напоследок совет: не делайте клоны!

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

[Перевод] Протоколы состояния канала и однозоновый OSPF (часть 1)

фото с сайта amazon.comПридумывая лучший способ что-то объяснить, я почти всегда нахожу и лучший способ понять это для себя.
Сасскинд Л., Грабовски Дж.
Теоретический минимум.
Все, что нужно знать о современной физике.*

Перевод главы из книги Chris Bryant «CCNP Route Study Guide». Его сайт — thebryantadvantage.com. Книга доступна на amazon.

Из всех просмотренных видео, прочитанных книг для подготовки к CCNP ROUTE, материал из этой показался наиболее легким для усвоения. Позволяет разложить все по полочкам. Кроме теории мне также понравились практические примеры. В конце каждой главы есть ссылки на уроки на youtube.

Основы протоколов состояния канала


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

Избегайте соблазна пропустить обзор.

А пока совсем немногое вам будет знакомо — есть множество дополнительных деталей, которыми вы должны овладеть как CCNP. Для тех, кто собирается сдавать CCIE, нужно по-настоящему освоить принцип работы OSPF.

Когда RIP посылает обновления маршрутов, они содержат полную таблицу маршрутизации. Включая отладку командой debug ip rip, вы можете увидеть маршруты, содержащиеся в обновлении вместе с метрикой.

Протоколы состояния канала работают по-другому. Маршрутизаторы состояния канала, которые сформировали соседство, обмениваются пакетами LSU, которые содержат анонсы LSA. Эти анонсы LSA несут информацию о масках подсетей и позволяют OSPF поддерживать маски переменной длины (VLSM).

LSA анонсы помещаются в базу данных состояния канала. Алгоритм Дейкстры (также известный как алгоритм поиска первого кратчайшего пути, SPF) работает с содержимым этой базы данных для создания таблицы маршрутизации OSPF.

Маршрутизаторы должны синхронизировать свои базы данных состояния канала.

Для просмотра содержимого базы данных состояния канала введите команду show ip ospf database. Эта команда показывает каналы и типы соединений, порядковые номера и как давно был получен определенный анонс LSA. Это значение в секундах можно посмотреть в колонке «age».

Алгоритм Дейкстры работает с содержимым базы данных…

R1#show ip ospf database
     OSPF router with ID (1.1.1.1) (Process ID 1)
Link ID     ADV Router     Age     Seq#          Checksum
1.1.1.1     1.1.1.1        1286    0x80000006    0x0057A7
8.8.8.8     8.8.8.8        795     0x8000000C    0x00085E
     Net Link States (Area 0)
Link ID     ADV Router     Age     Seq#          Checksum
10.1.1.5    8.8.8.8        795     0x80000006    0x001CC3


… вычисляет маршруты, и эти маршруты помещаются в таблицу маршрутизации OSPF
R1#show ip route ospf
        6.0.0.0/32 is subnetted, 1 subnets
O       6.6.6.6[110/11] via 10.1.1.5, 02:32:53, Ethernet0
        7.0.0.0/32 is subnetted, 1 subnets
O       7.7.7.7[110/11] via 10.1.1.5, 02:32:53, Ethernet0


Алгоритм SPF на самом деле вычисляет кратчайший путь вдоль дерева, и это дерево используется для создания таблицы маршрутизации. Больше об этом алгоритме задумываться не следует, так как он делает все замечательно и без нашего вмешательства, но у нас есть куча деталей, на которые стоит обратить внимание!

Порядковые номера LSA


Для того чтобы убедиться, что маршрутизаторы OSPF получают самую последнюю информацию, LSA присваиваются порядковые номера. Когда маршрутизатор с OSPF получает LSA, он проверяет по своей базе данных, есть ли в ней запись для данного канала или нет.

Если записи нет, то маршрутизатор создает ее и рассылает данный анонс LSA по всем OSPF-интерфейсам, кроме того, на котором было получено это сообщение.

Если запись есть, то возможно несколько вариантов. В зависимости от значения порядкового номера LSA — больше, меньше или равен он содержащемуся в базе данных.

--Если номер совпадает, анонс LSA игнорируется и никаких действий больше не предпринимается.

--Если номер меньше, маршрутизатор проигнорирует обновление и передаст пакет LSU, содержащий данный анонс LSA, обратно отправителю. В этой ситуации, маршрутизатор с более свежей информацией сообщает отправителю: «Информация, которую вы отправляете, устарела. Вот та, что следует рассылать.»

--Если порядковый номер больше, маршрутизатор добавит этот анонс LSA в свою базу данных и отправит подтверждение (LSAcknowledgement). Затем маршрутизатор будет рассылать этот анонс LSA и запустит алгоритм SPF для обновления собственной таблицы маршрутизации.

Когда происходит обмен анонсами LSA?


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

Маршрутизатор OSPF также рассылает суммарные анонсы LSA каждые 30 минут.

До обмена анонсами LSA, маршрутизаторы должны стать соседями, формируя соседство. Для этого у маршрутизаторов должны совпадать номер зоны, hello- и dead-таймеры и нужно проверить является ли зона «stub»-зоной. Если есть аутентификация, то она должна быть сконфигурирована на обеих сторонах канала.

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

Для проверки соседства, введите команду show ip ospf neighbor или менее употребительную show ip ospf interface. Эту последнюю команду часто забывают, но она дает много полезной информации.

Заметьте, что обе команды покажут вам какие отношения соседства существуют, и только show ip ospf neighbor покажет статус загрузки базы данных (FULL, 2WAY, и т.д.)

R3#show ip ospf neighbor

Neighbor ID   Pri   State      Dead Time    Address       Interface
1.1.1.1       1     FULL/DR    00:01:52     172.12.123.1  Serial0
1.1.1.1       1     FULL/ -    00:00:32     172.12.13.1   Serial1
4.4.4.4       1     FULL/DR    00:00:32     172.23.23.4   Ethernat0

R3#show ip ospf interface serial0
Serial0 is up, line protocol is up
        Internet address 172.12.123.3/24, Area0
        Process ID 1, Router ID 3.3.3.3, Network Type NON_BROADCAST, Cost: 64
        Transmit Delay is 1 sec, State DROTHER, Priority 0
        Designated Router (ID) 1.1.1.1, Interface Address 172.12.123.1
        No backup designated router on this network
        Timer intervals configured, Hello 30, Dead 120, Wait 120, Retransmit 5
          Hello due in 00:00:16
        Index 1/1, flood queue length 0
        Next 0x0(0)/0x0(0)
        Last flood scan length is 1, maximum is 3
        Last flood scan time is 0 msec, maximum is 4 msec
        Neighbor count is 1, Adjacent neighbor count is 1
          Adjacent with Neighbor 1.1.1.1 (Designated Router)
          Supress Hello for 0 neighbor(s)


show ip ospf interface даст вам локальный идентификатор маршрутизатора OSPF (RID), его роль в данном сегменте (DR, BDR, DROther), идентификатор (RID) DR или BDR для данного сегмента и многое другое. Это замечательный отправной пункт для устранения проблем.

Роль DR и BDR


Главный недостаток дистанционно-векторных протоколов — медленная конвергенция.

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

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

Как DR рассылают сообщения об изменениях в сети


Когда маршрутизатор в OSPF сегменте с DR и BDR замечает изменения в сети, он не уведомляет всех соседей. Вместо этого он отправляет мультикаст на 224.0.0.6, адрес, который слушают оба маршрутизатора — DR и BDR, чтобы знать о таких изменениях.

Затем DR отправляет мультикаст на 224.0.0.5 — уведомить все не-DR и не-BDR маршрутизаторы в сети. (Маршрутизаторы, которые не являются DR или BDR, называются DROthers, как показано в выводе команды show ip ospf neighbor). DROther-ы отправляют подтверждение (LSAcknowledgment, LSAck) обратно DR о получении обновления.

Два замечания:

--Только DR и BDR слушают 224.0.0.6.

--Только DR отправляет мультикаст на 224.0.0.5 для уведомления DROthers об изменениях в сети. BDR получают их, но не уведомляют другие маршрутизаторы. Прослушивание 224.0.0.6 дает BDR возможность иметь последние изменения в базе данных — и это важно на тот случай, если он станет DR.

Процесс выбора DR/BDR


Почти каждый сегмент сети OSPF содержит DR и BDR. Как всегда имеются исключения, и мы обсудим эти ситуации далее. А сейчас, давайте взглянем поближе на правила выбора DR и BDR.

Согласно следующей диаграмме сети (я мог бы поместить в центр коммутатор вместо обозначения сегмента «Ethernet»; будьте готовы встретить такое в сетевой документации).

Интерфейсы четырех маршрутизаторов находятся в сегменте Ethernet. Один станет DR, другой BDR, остальные — DROthers. Перед тем как увидеть, как маршрутизаторы Cisco распределяют эти роли, давайте взглянем на процесс выбора DR/BDR.

1. Все маршрутизаторы с приоритетом интерфейса 1 или выше могут быть выбранными в качестве DR/BDR. Установка приоритета в 0 лишает маршрутизатор такой возможности.

2. Маршрутизатор с наибольшим приоритетом становится DR.

3. Если они совпадают, то сравниваются значения идентификатора RID. Маршрутизатор с наибольшим — выигрывает.

4. Этот процесс повторяется для выбора нового BDR. Один и тот же маршрутизатор не может быть одновременно DR и BDR.

Позже мы обсудим интересное поведение DROthers в сегменте Ethernet. А сейчас сфокусируемся на процессе выбора DR/BDR с использованием OSPF RID.

Процесс выбора с OSPF RID


Очевидно, OSPF RID играет большую роль в выборе DR и BDR — но как определяется значение RID? По следующим правилам:
OSPF RID маршрутизатора будет наибольший IP адрес, назначенный loopback-интерфейсу, безотносительно был ли этот интерфейс включен в процесс OSPF. Он не анонсируется автоматически OSPF.

Если нет петлевых (loopback) интерфейсов, OSPF RID маршрутизатора будет наибольшее значение IP адреса, назначенного физическому интерфейсу, безотносительно включен он в OSPF ли нет.

Эти правила могут быть переписаны установкой OSPF RID вручную командой router-id, но на маршрутизаторе должен быть перезапущен процесс OSPF (cleared).

Кажется немного странным, что петлевые интерфейсы, не участвующие в OSPF, определяют RID, не так ли?
Давайте посмотрим на все в действии. R1 и R5 сформировали соседство в подсети 10.1.1.0/24. У R5 есть несколько петлевых интерфейсов, но анонсируются через OSPF только два:

hostname R5
!
interface Loopback6
 ip address 6.6.6.6 255.255.255.255
!
interface Loopback7
 ip address 7.7.7.7 255.255.255.255
!
interface Loopback8
 ip address 8.8.8.8 255.255.255.255
!
interface Ethernet0
 ip address 10.1.1.5 255.255.255.0
!

router ospf 1
 network 6.6.6.6 0.0.0.0 area 0
 network 7.7.7.7 0.0.0.0 area 0
 network 10.1.1.0 0.0.0.255 area 0


Зная правила определения OSPF RID, какой OSPF RID покажет R1 для R5? Посмотрите на конфигурацию и выясните.

Если вы сказали 8.8.8.8, то вы правы. Чтобы увидеть OSPF RID соседа надо ввести show ip ospf neighbor:

R1#show ip ospf neighbor
Neighbor ID   Pri   State      Dead Time    Address       Interface
8.8.8.8       1     FULL/DR    00:00:37     10.1.1.5      Ethernet0


Значение, указанное под Neighbor ID это RID соседа.

Для иллюстрации другой важной вещи, касающейся DR и BDR, давайте вернемся к нашему примеру с четырьмя маршрутизаторами. Маршрутизаторы имеют следующие адреса:

RouterA: Loopback 1.1.1.1, ethernet0 172.1.1.1
RouterB: Loopback 2.2.2.2, ethernet0 172.1.1.2
RouterC: No loopback, ethernet0 172.1.1.3
RouterD: No loopback, ethernet0 172.1.1.4


RID будут такими:
RouterA: 1.1.1.1
RouterB: 2.2.2.2
RouterC: 172.1.1.3
RouterD: 172.1.1.4


Процесс выбора RID всегда отдает предпочтение IP адресам петлевых интерфейсов над физическими.

Суммируя сказанное, мы имеем три способа влияния на значение RID:

--Изменение приоритета OSPF с помощью команды ip ospf priority

--Установка RID вручную при помощи router-id

--Установка RID путем конфигурирования петлевого интерфейса

Ни один из этих способов не является «ошибочным» или «правильным» — так что знайте все три, и знайте, что нужно перезапускать процессы OSPF для применения изменений.

Что случится, если DR отключится, а затем включится?


Если все четыре маршрутизатора включились одновременно, мы ожидаем, что маршрутизатор D будет DR и маршрутизатор C — BDR. Но что, если маршрутизатор D отключится, а потом включится?

При отсутствии маршрутизатора D, маршрутизатор C становится DR. Маршрутизатор B будет BDR. А затем маршрутизатор D включается, но маршрутизаторы C и B сохраняют свои роли.

Это не похоже на протокол связующего дерева, где новый коммутатор, с меньшим BID становится корневым. В OSPF выбор DR/BDR не меняется при включении нового маршрутизатора или включении того, который ранее был DR или BDR.

Давайте рассмотрим пример с тремя маршрутизаторами в сегменте Ethernet. Приоритет маршрутизатора A — 100, B — 50, C — 10. Маршрутизатор A выбран DR, B — BDR.

Все хорошо, пока не выключается маршрутизатор A. Маршрутизаторы B и C становятся соответственно DR и BDR.

Включение маршрутизатора A — не причина перевыбирать DR/BDR, даже если приоритет маршрутизатора A выше, чем у DR и BDR. При включении маршрутизатор A становится DROther.

Чтобы маршрутизатор A стал вновь DR, оба текущих DR и BDR должны отключиться! Что произойдет, когда отключится маршрутизатор B?

Маршрутизатор C становится DR, маршрутизатор A — BDR. При включении маршрутизатора B он будет DROther.

Для окончательной установки в качестве DR маршрутизатора A отключаем маршрутизатор C. Теперь маршрутизатор A из BDR станет DR, а маршрутизатор B — BDR.

При включении маршрутизатора C он станет DROther, и мы получим прежнюю схему сети!



* Не рискнула выносить в заголовок, но все таки пусть будет PS:
Так как цитата взята из книги, опубликованной фондом «Династия», то, вспоминая призыв progchip666, пишу здесь — «Ликвидации фонда „Династия“ посвящается».

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

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

[Перевод] Как мы провели пару дней, работая над ускорением Perl

Это история о значительной оптимизации интерпретатора Perl, о борьбе со сложностями кода, и о том, как мы хотели «съесть торт так, чтобы он у нас остался» [английская поговорка «You can't have your cake and eat it», означающая невозможность достижения двух противоположных целей].

На недавнем хакатоне Booking.com у нас появилась возможность поработать над ускорением функции размещения целых чисел в интерпретаторе Perl. В случае успеха это поможет ускорить практически все программы, которые работают в нашем проекте. Оказалось, что банальная реализация идеи могла бы сработать, но это привело бы к увеличению сложности поддержки кода. Наше исследование привело нас к тому, чтобы заставить препроцессор С улучшать качество кода, одновременно давая возможность ускорить выполнение программ.

Предыстория


В perlguts и PerlGuts Illustrated написано, что представление переменных в Perl обычно состоит из двух частей – заголовка и тела (представляемых как struct). Заголовок содержит необходимые для обработки переменных данные, которые не зависят от её типа, включая указатель на возможное тело.

image

Структура тела может сильно отличаться, в зависимости от типа переменной. Простейшая переменная — SvNULL, которая представляет undef и которой не требуется тело.

У строки (PV — “pointer value”) тело имеет тип XPV:

image

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

image

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

Меняя типы


У Perl есть внутренняя функция для преобразования типов – это sv_upgrade (“scalar value upgrade”). Если у нас есть переменная,– допустим, целое число,- и нам надо обратиться к ней как к переменной другого типа (допустим, как к строке), sv_upgrade преобразовывает тип переменной (допустим, в тип, содержащий как целочисленное, так и строковое представление значения). Это может потребовать замены текущего тела большим по объёму.

Чтобы узнать, как реализована sv_upgrade, заглянем в функцию Perl_sv_upgrade в sv.c. Видно, что функция достаточно сложная, в коде много комментариев, описывающих разные особенности реализации. Это неудивительно — ведь она может принимать скалярное значение любого типа и преобразовывать его в вид, который может представлять любой другой тип.

В начале функции присутствует switch, работающий в зависимости от текущего типа переменной, который определяет, что необходимо сделать для нового типа. Вскоре после него есть второй switch, который разбирается с новым типом. В его втором блоке присутствует множество блоков if {}, делающих разные вещи в зависимости от старого типа. И в конце, после определения struct для нового тела и заполнения struct для заголовка правильными флагами, освобождается память, которую занимало старое тело.

Не заснули пока?

Наивный подход


Функция sv_upgrade вызывается из множества мест – не только из вывода целых чисел в виде строк, но и при присваивании целого числа переменной, которая до этого была обнулена.

Обнулённая переменная – это всегда undef, у которого нет тела. sv_upgrade в этом случае вызывается для корректной настройки тела новой переменной. Это правильное решение, которое сводит определённую работу с переменными в одном месте, и не множит сущности. Но это решение сказывается на производительности из-за выполнения некоего общего, и в данном случае, избыточного кода.

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

Первая, поскольку мы знаем, что это новый тип, будет простой:

SvFLAGS(sv) |= new_type;

Вторая — сложнее:

SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));

Описывается она в Illustrated perlguts так:

Начиная с версии 5.10, для чистого IV (без PV) слот IVX находится внутри HEAD, и не выделяется память для xpviv struct («body»). Макрос SvIVX использует арифметику указателя SvANY, чтобы указать на отрицательное смещение, которое подсчитывается во время компиляции, от HEAD-1 к sv_u.svu_iv, таким образом, чтобы PVIV и IV могли использовать тот же самый макрос SvIVX.


После 15 минут с карандашом и бумагой я убедился в том, что эта строка делает именно то, что описано в комментарии. После этого диаграмма из Illustrated Perl Guts стала более понятной:

image

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

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

Как съесть торт так, чтобы он у вас остался


Нам хотелось инкапсулировать этот сложный кусок кода, но без ухудшения быстродействия. Имея дело с С, мы обратились к препроцессору, чтобы запихнуть всё это в макрос – в других языках это выглядело бы, как сокрытие сложного кода за хорошо названной функцией или методом:
#define SET_SVANY_FOR_BODYLESS_IV(sv) \
    SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv))

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

И как это изменило нашу ситуацию? При использовании макроса две вынесенные строки стали более простыми. В результате в патче нужно было только заменить вызов

sv_upgrade(dstr, SVt_IV);

на эти две строчки:

SET_SVANY_FOR_BODYLESS_IV(dstr);
SvFLAGS(dstr) |= SVt_IV;

В результате, за счёт выноса сравнительно несложного кода мы должны получить прибавку к быстродействию. Но получим ли? Какой будет от этого реальный выигрыш?

Измерение выгоды


Наша бенчмарка достаточно конкретная, но при этом представляет собою довольно частый случай.
  $ dumbbench -i50 --pin-frequency -- \
    ./perl -Ilib -e \
    'for my $x (1..1000){my @a = (1..2000);}'

А вот и результаты работы. До оптимизации:

  Rounded run time per iteration: 2.4311e-01 +/- 1.4e-04

После оптимизации:

  Rounded run time per iteration: 1.99354e-01 +/- 5.5e-05

Прирост в 18%. Успех.

Мы продемонстрировали нужность этой оптимизации, сложность которой стремится к нулю. В некоторых местах код Perl стал чуть более сложным, но внутренности функции sv_upgrade упростились. Действуя подобным образом, мы нашли ещё несколько мест, где можно было достичь оптимизации схожими методами. В результате мы сделали пять патчей в код Perl:

С выходом Perl 5.22, в том числе, благодаря этой работе, многие программы станут работать быстрее.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

пятница, 31 июля 2015 г.

Дайджест: VR и AR

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

Oculus

В Сан-Франциско состоялась пресс-конференция компании Oculus, на которой прозвучали новые подробности о шлеме виртуальной реальности Oculus Rift. Компания уже обновила официальный сайт и сменила логотип.
Компания Oculus официально представила пользовательскую версию шлема виртуальной реальности Oculus Rift, которая выйдет в первом квартале 2016 года.
Игра для Oculus Rift, в которой вам придется петь в микрофон и уворачиваться от бутылок с неизвестной жидкостью, летящих в голову.
Oculus покупают израильскую компанию, специализирующуюся на технологиях считывания движений рук.
В версии Unity 5.1, помимо других новых функций и улучшений, появилась поддержка Oculus Rift.
Приложения и игры для шлема Oculus Rift будут проходить проверку на безопасность.
8 важных выводов, сделанных после разговора с CEO Oculus.
Oculus VR намерены финансировать около двух с половиной десятков игр эксклюзивно для Rift.
Во время конференции накануне E3 Oculus объявили о заключении партнерского соглашения с Microsoft.
Oculus Touch – золотой стандарт контроллера VR.
Ребрендинг Oculus VR.

Project Morpheus

Компания Sony решила принять активное участие в Electronic Entertainment Expo (E3) и продемонстрировать на выставке шлем виртуальной реальности Sony Project Morpheus, который первоначально был анонсирован еще на E3 2014.
Вторая часть интервью с Шухей Йошида, в котором он высказывает свое мнение о шлеме виртуальной реальности Morpheus.
На данный момент Sony разрабатывают около 30 игр для своего шлема виртуальной реальности Project Morpheus.
Harmonix показали визуализатор музыки для Project Morpheus.
В игре Rigs для Project Morpheus цвет используется, чтобы делать виртуальную реальность менее угнетающей.

Microsoft и HoloLens

Microsoft показали, какой может быть работа с HoloLens. Компания сделала превосходный ролик с элементами компьютерной графики, рассказывающий об изучении анатомии с помощью голографического компьютера.
Microsoft предлагают образовательным институтам США гранты на проработку новых идей для устройства HoloLens.
Microsoft продемонстрировали специальную версию Minecraft для HoloLens.
Microsoft совместно с Valve будут развивать направление VR для Windows 10.
Статья о том, с какими компаниями сотрудничает Xbox в направлении VR.
Компания Microsoft выделит полмиллиона долларов для призовых мест в конкурсе на лучший научный проект для HoloLens.
Опыт игры в Minecraft при помощи HoloLens.
Обширное интервью с CEO Microsoft Сатья Наделла, в котором он рассказывает о планах компании на ближайшее время и о том, что ожидается от первого запуска HoloLens.
Object Theory собираются разрабатывать приложения дополненной реальности для Microsoft HoloLens.
Очки дополненной реальности HoloLens взорвались на пути к Международной космической станции.
Интервью с техническим директором Microsoft Майком Шрепфером о дронах, VR, носимой электронике и будущем компании в Сиэтле.

Это интересно

Российская компания Lostroom, занимающаяся созданием квест-комнат, разработала сетевую игру, которая полностью проходит в виртуальной реальности.
Кейс Speech Center: особенности разработки обучающего VR-сервиса на Unity.
Глава N3TWORK Нейл Янг думает, что индустрия пока не готова к виртуальной или дополненной реальности и, возможно, не будет готова еще лет 5.
Джон Уокер, редактор Rock Paper Shotgun, написал о том, что будет с виртуальной реальностью.
Samsung Electronics объявили о начале продаж обновленных очков виртуальной реальности Samsung Gear VR Innovator Edition. Они полностью оптимизированы для смартфонов нового поколения Samsung Galaxy S6 и Samsung Galaxy S6 Edge.
Magic Leap – другой взгляд на устройства виртуальной реальности.
The Void – парк виртуальных аттракционов, в котором оказаться хотел бы каждый.
VR Kit от Razer получил поддержку Android и теперь может отслеживать местоположение.
Один из лучших игроков NFL этого года будет готовиться к очередному сезону при помощи устройств виртуальной реальности.
Ким Либрери и Рэй Дэвис о том, как необходимо использовать Unreal Engine в VR.
Конференция E3 показала, чего не хватает VR.
Краткая история Nintendo Virtual Boy в цитатах.
CEO Ubisoft считает, что устройства виртуальной реальности очень похожи на Wii, если говорить об их доступности.
Размышления VR-разработчика о перспективах и направлениях развития отрасли.
Видео: разработка для VR – уроки, полученные на Valve & HTC VR Game Jam.
Бесплатные очки виртуальной реальности от Valve для разработчиков.
Дополненная реальность против виртуальной: что лидирует?
Gunnar Optiks: Eyewear – яркое будущее игровых очков.
ASTRO Gaming делают игровые бренды частью человеческой жизни.
Сооснователь Merge Эндрю Трикетт об объединении виртуальной и дополненной реальностей.
Марк Цукерберг рассказал о том, почему Facebook инвестирует в VR.
Epic: VR – это круто, но будущее за AR.
Epic Games: в работе над VR недостатка новых идей и энтузиазма не наблюдается.
Фильм «Терминатор: Генезис» привносит виртуальную реальность на YouTube.

Игры

Хит Steam Ark: Survival Evolved будет доступен для Project Morpheus и Oculus Rift.
Новый режим мультиплеера для Halo 5: Guardians был показан на E3 с помощью HoloLens.
Battlezone 1998 будет переиздана для ПК и устройств виртуальной реальности.
Полет над Азеротом в интерактивном трейлере фильма Warcraft.
Keep Talking and Nobody Explodes – игра, в которой вам придется обезвреживать бомбу.
Virtual Borders Arizona – проект, в котором с помощью очков виртуальной реальности можно побывать в аризонской пустыне и почувствовать себя нелегальным эмигрантом.
Три удивительных проекта на базе Unity и VR.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.