-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51

Habrahabr/New








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/new/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-new-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

Используем PubNub: эмоциональный говорящий чат своими руками

Вторник, 26 Сентября 2017 г. 10:45 + в цитатник
Cromathaar сегодня в 10:45 Разработка

Используем PubNub: эмоциональный говорящий чат своими руками

  • Tutorial
image

На удивление, в русскоязычном сегменте интернета (и на Хабре в том числе) до сих пор крайне мало информации о PubNub. Между тем, основанный в 2010-м году калифорнийский стартап успел за последние семь лет вырасти в то, что сама компания называет Global Data Stream Network (DSN), а по факту – IaaS-решение, направленное на удовлетворение нужд в области передачи сообщений в реальном времени. Наша компания – Distillery – является одним из на данный момент четырех development-партнеров PubNub, но сказано это не пустого бахвальства ради, а чтобы поделиться с сообществом вариантом использования PubNub на примере demo-проекта, который требовалось создать для получение оного статуса.

Те, кому не терпится посмотреть на код (C# + JavaScript), могут сразу пройти в репозиторий на GitHub. Тех же, кому интересно, что умеет PubNub, и как это работает, прошу под кат.

В целом PubNub предлагает три категории сервисов:

  • Realtime Messaging. API, реализующий механизм Publish/Subscribe, за которым стоит готовая глобальная инфраструктура, включающая в себя 15 распределенных по земному шару локаций с заявленным latency не более 250мс. Все это приправлено такими вкусными вещами как, например, поддержка высоконагруженных каналов, компрессия данных и автоматический бандлинг сообщений при нестабильной связи.
  • Presence. API для отслеживания состояния клиентов – от банального статуса онлайн/оффлайн до кастомных вещей вроде нотификаций о наборе сообщения.
  • Functions. Раньше эта функция называлась BLOCKS, но совсем недавно пережила ребрэндинг (точнее, все еще его переживает). Представляет собой скрипты, написанные на JavaScript и крутящиеся на серверах PubNub, с помощью которых можно фильтровать, агрегировать, трансформировать данные или, как мы вскоре увидим, осуществлять взаимодействие со сторонними сервисами.

Для реализации всего это дела PubNub предлагает более 70-ти SDK для самых разнообразных языков программирования и платформ, в том числе и для IoT-решений на базе Arduino, RaspberryPi и даже Samsung Smart TV (полный список можно найти тут).

Пожалуй, достаточно теории, перейдем к практике. Тестовое задание, предваряющее получение партнерского статуса, звучит следующим образом: «Создать проект на базе PubNub, используя два любых SDK и следующие функции: Presence, PAM и один BLOCK». PAM расшифровывается как PubNub Access Manager и является надстройкой над фреймворком безопасности, позволяющей контролировать доступ к каналу на уровне приложения, самого канала или конкретного пользователя. Поскольку задание сформулировано довольно расплывчато, это предоставляет достаточную волю фантазии, полет которой в итоге привел к не самой полезной, но весьма интересной идее говорящего чата. А чтобы было веселее, чат не просто озвучивается синтезатором речи, но еще и позволяет передавать вербальные эмоции.

Собственно, само приложение концептуально простое донельзя – это двухстраничный веб-сайт. Изначально пользователь попадает на страницу логина, где и настоящей аутентификации-то на самом деле не происходит, и после ввода никнейма и выбора режима – полный или ReadOnly – переходит на страницу с чатом. На ней имеется «окно» с сообщениями канала, в том числе и системными а ля «Vasya joined the channel», поле для набора сообщений и выпадающий список с выбором эмоций. При получении новых сообщений от других пользователей оные сообщения зачитываются синтезатором речи с той эмоцией, которая была выставлена автором при отправке. Для перевода текста в речь используется стандартный BLOCK от IBM Watson, требующий минимальной настройки, в основном касающейся используемого голоса. На момент написания статьи эмоциональную речь поддерживали только три голоса: en-US_AllisonVoice (женский), en-US_LisaVoice (женский) и en-US_MichaelVoice (мужской). Еще пару месяцев назад делать это умела только Allison, так что, как говорится, прогресс налицо.

Однако перейдем к коду. Серверная часть, и в этом прелесть, балансирует где-то на грани между простотой и примитивностью:

public class HomeController : Controller
{
    public ActionResult Login()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Main(LoginDTO loginDTO)
    {
        String chatChannel = ConfigurationHelper.ChatChannel;
        String textToSpeechChannel = ConfigurationHelper.TextToSpeechChannel;
        String authKey = loginDTO.Username + DateTime.Now.Ticks.ToString();

        var chatManager = new ChatManager();
            
        if (loginDTO.ReadAccessOnly)
        {
            chatManager.GrantUserReadAccessToChannel(authKey, chatChannel);
        }
        else
        {
            chatManager.GrantUserReadWriteAccessToChannel(authKey, chatChannel);
        }

        chatManager.GrantUserReadWriteAccessToChannel(authKey, textToSpeechChannel);

        var authDTO = new AuthDTO()
        {
            PublishKey = ConfigurationHelper.PubNubPublishKey,
            SubscribeKey = ConfigurationHelper.PubNubSubscribeKey,
            AuthKey = authKey,
            Username = loginDTO.Username,
            ChatChannel = chatChannel,
            TextToSpeechChannel = textToSpeechChannel
        };

        return View(authDTO);
    }
}

Метод контроллера Main получает DTO от формы логина, извлекает информацию о каналах из конфигурационных данных (один канал для чата, второй для общения с IBM Watson), устанавливает уровень доступа посредством вызова соответствующих методов объекта класса ChatManager и отдает всю собранную информацию странице. Дальше всем занимается уже фронтенд. Для полноты картины приведем также листинг класса ChatManager, инкапсулирующего взаимодействие с SDK PubNub:

public class ChatManager
{
    private const String PRESENCE_CHANNEL_SUFFIX = "-pnpres";

    private Pubnub pubnub;

    public ChatManager()
    {
        var pnConfiguration = new PNConfiguration();
        pnConfiguration.PublishKey = ConfigurationHelper.PubNubPublishKey;
        pnConfiguration.SubscribeKey = ConfigurationHelper.PubNubSubscribeKey;
        pnConfiguration.SecretKey = ConfigurationHelper.PubNubSecretKey;
        pnConfiguration.Secure = true;

        pubnub = new Pubnub(pnConfiguration);
    }

    public void ForbidPublicAccessToChannel(String channel)
    {
        pubnub.Grant()
            .Channels(new String[] { channel })
            .Read(false)
            .Write(false)
            .Async(new AccessGrantResult());
    }

    public void GrantUserReadAccessToChannel(String userAuthKey, String channel)
    {
        pubnub.Grant()
            .Channels(new String[] { channel, channel + PRESENCE_CHANNEL_SUFFIX })
            .AuthKeys(new String[] { userAuthKey })
            .Read(true)
            .Write(false)
            .Async(new AccessGrantResult());
    }

    public void GrantUserReadWriteAccessToChannel(String userAuthKey, String channel)
    {
        pubnub.Grant()
            .Channels(new String[] { channel, channel + PRESENCE_CHANNEL_SUFFIX })
            .AuthKeys(new String[] { userAuthKey })
            .Read(true)
            .Write(true)
            .Async(new AccessGrantResult());
    }
}

Здесь имеет смысл заострить внимание на константе PRESENCE_CHANNEL_SUFFIX. Дело в том, что механизм Presence для своих сообщений использует отдельный канал, который по имеющемуся соглашению утилизирует имя текущего канала с добавлением суффикса «-pnpres». Обратите внимание, что код PubNub Access Manager, выраженный в виде вызова функции Grant, требует явного указания Presence-канала для установки прав доступа.

var pubnub;
var chatChannel;
var textToSpeechChannel;
var username;

function init(publishKey, subscribeKey, authKey, username, chatChannel, textToSpeechChannel) {
    pubnub = new PubNub({
        publishKey: publishKey,
        subscribeKey: subscribeKey,
        authKey: authKey,
        uuid: username
    });

    this.username = username;
    this.chatChannel = chatChannel;
    this.textToSpeechChannel = textToSpeechChannel;

    addListener();
    subscribe();
}

Первое, что нам предстоит сделать в JavaScript-коде – это провести инициализацию соответствующего SDK. Для удобства и простоты некоторые сущности вынесены в глобальные переменные. После инициализации необходимо добавить слушателя для интересующих нас событий и подписаться на каналы чата, Presence и IBM Watson. Начнем с подписки:

function subscribe() {
    pubnub.subscribe({
        channels: [chatChannel, textToSpeechChannel],
        withPresence: true
    });
}

Если код метода subscribe говорит сам за себя, то с методом addListener все немного сложнее:

function addListener() {
    pubnub.addListener({
        status: function (statusEvent) {
            if (statusEvent.category === "PNConnectedCategory") {
                getOnlineUsers();
            }
        },
        message: function (message) {
            if (message.channel === chatChannel) {
                var jsonMessage = JSON.parse(message.message);
                var chat = document.getElementById("chat");
                if (chat.value !== "") {
                    chat.value = chat.value + "\n";
                    chat.scrollTop = chat.scrollHeight;
                }

                chat.value = chat.value + jsonMessage.Username + ": " + 
                    jsonMessage.Message;
            }
            else if (message.channel === textToSpeechChannel) {
                if (message.publisher !== username) {
                    var audio = new Audio(message.message.speech);
                    audio.play();
                }
            }
        },
        presence: function (presenceEvent) {
            if (presenceEvent.channel === chatChannel) {
                if (presenceEvent.action === 'join') {
                    if (!UserIsOnTheList(presenceEvent.uuid)) {
                        AddUserToList(presenceEvent.uuid);
                    }

                    PutStatusToChat(presenceEvent.uuid, 
                        "joins the channel");
                }
                else if (presenceEvent.action === 'timeout') {
                    if (UserIsOnTheList(presenceEvent.uuid)) {
                        RemoveUserFromList(presenceEvent.uuid);
                    }

                    PutStatusToChat(presenceEvent.uuid, 
                        "was disconnected due to timeout");
                }
            }
        }
    });
}

Во-первых, мы подписываемся на событие «PNConnectedCategory», чтобы отловить момент присоединения к каналу текущего пользователя. Это важно, потому что получение и отображение списка всех участников необходимо вызывать лишь однажды, в то время как Presence-событие «join» срабатывает каждый раз при присоединении нового клиента. Во-вторых, при поимке события о новом сообщении, мы проверяем канал, которому это событие адресовано, и в зависимости от результата проверки либо формируем текстовое представление путем банальной конкатенации, либо инициализируем объект Audio пришедшей от IBM Watson ссылкой на аудио-файл и запускаем проигрывание.

Еще одна интересная вещь происходит при отправке сообщения:

function publish(message) {
    var jsonMessage = {
        "Username": username,
        "Message": message
    };

    var publishConfig = {
        channel: chatChannel,
        message: JSON.stringify(jsonMessage)
    };

    pubnub.publish(publishConfig);

    var emotedText = '';

    var selectedEmotion = iconSelect.getSelectedValue();

    if (selectedEmotion !== "") {
        emotedText += '';
    }

    emotedText += message;

    if (selectedEmotion !== "") {
        emotedText += '';
    }

    emotedText += '';

    jsonMessage = {
        "text": emotedText
    };

    publishConfig = {
        channel: textToSpeechChannel,
        message: jsonMessage
    };

    pubnub.publish(publishConfig);
}

Сначала мы формируем само сообщение, затем определяем конфигурацию, которую понимает SDK, и только после этого инициируем отправку. Дальше лучше. Чтобы превратить текст в синтезированную речь, еще одно сообщение мы отправляем в канал IBM Watson. Для определения эмоциональной окраски используется Speech Synthesis Markup Language (SSML), а если конкретнее — тэг . Как вы уже наверняка догадываетесь, при отправке сообщения ReadOnly-пользователем, оно будет заблокировано механизмом PAM и так никогда и не найдет своего получателя.

Среди уже имеющихся на рынке продуктов, использующих возможности PubNub, можно отметить, скажем, концепцию умного дома от Insteon или мобильное приложение для планирования семейных мероприятий от Curago. В завершении еще раз напомню, что полный код примера можно найти на GitHub.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/338720/


Метки:  

Энергоэффективный ЦОД: знакомство с мировым опытом

Вторник, 26 Сентября 2017 г. 10:25 + в цитатник
1cloud сегодня в 10:25 Администрирование

Энергоэффективный ЦОД: знакомство с мировым опытом

    Энергоэффективность, минимизация потенциально опасных выбросов, предотвращение вредного воздействия на окружающую среду при неизменной, а лучше повышенной мощности объекта – вот, что занимает умы управляющих ЦОД. Информационный ресурс Greentech Media еще в 2009 году отметил тот факт, что потребление энергии только одним дата-центром Google можно сравнить с тем, что уходит на целый Манхэттен. Эффективная работа с таким объемом энергетических ресурсов и всевозможными ограничениями подразумевает не только регулярное обновление железа, но и перекраивание всей инфраструктуры ЦОД.

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

    / кадр из видео о нашем дата-центре SDN + (подробнее об инфраструктуре 1cloud)

    Для высокоуровневой оптимизации работы ЦОД применяют различные системы управления и мониторинга производительности (DCPM — Data Center Performance Management). Они анализирует информацию по расходу определенных ресурсов, рассчитывают базовые показатели энергоэффективности и другие метрики, по которым можно оценивать работу ЦОД.

    В число универсальных входят следующие критерии, предложенные общими силами экспертного сообщества:

    • коэффициент эффективности использования энергии (PUE — Power Usage Effectiveness);
    • коэффициент эффективности инфраструктуры (DCiE — Data Center Infrastructure Efficiency);
    • коэффициент эффективности использования воды (WUE — Water Usage Effectiveness);
    • и коэффициент эффективности использования углерода (CUE — Carbon Usage Effectiveness).

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



    / видео о ЦОД Stack Data Network

    Название одной из популярных технологий охлаждения ЦОДов — фрикулинг. Оно перешло в русский язык в виде кальки от английского «free cooling». Термин интересен с точки зрения перевода — он отражает суть технологии: «естественное» или «бесплатное» охлаждение. В основе этой технологии лежит использование уличного воздуха, который пропускают, например через роторные теплообменники. Эту технологию внедряют все больше и больше компаний, а некоторые идут и дальше — продают избытки тепла.

    Системы рекуперации тепла и фрикулинга позволяют крупным дата-центрам направлять избыточную тепловую энергию на поддержание оптимальной температуры в жилых помещениях. Один из примеров — инициатива правительства Стокгольма. Муниципалитет совместно с проектом Stockholm Data Parks намерен создать экосистему, в рамках которой «тепло ЦОД не будет расходоваться впустую». В ходе реализации проекта планируется покрыть до 10% энергии, расходуемой на отопление города. Конечно, все это уже находит соответствующую реакцию компаний — Borderlight AB объявила о запуске 5-мегаваттного ЦОДа в Стокгольме с прицелом на продажу избыточного тепла. Серверное оборудование будет поставлять GoGreenHost, дочерняя компания Borderlight, а перераспределением тепла займется Fortum V"arme.

    Не отстает и Яндекс, который помогает отапливать финский город Мянтсяля. Представители компании говорят, что благодаря продаже тепла городу, компания экономит треть расходов на электроэнергию. Благодаря финскому климату дата-центр может работать за счет прямого фрикулинга. Таким образом, компания не нуждается в сложных системах охлаждения и может позволить себе установку теплообменников в районе выброса разогретого воздуха, чтобы передать разогретую воду в городскую систему теплоснабжения. В этом регионе работает и ЦОД Google, в системе охлаждения которого задействованы ледяные воды Финского залива. Ранее, в финском городке Хамина в месте, где сейчас находится дата-центр, размещалась бумажная фабрика. Общая сумма инвестиций в проект — более 350 миллионов евро.

    Климат Англии, отличающийся суровым характером, и энергия ветра также позволяют локальным ЦОД снизить затраты на охлаждение и электроэнергию. Наличие в проекте ветрогенераторов и соответствующих систем увеличивает капитальные затраты на 6-10% по сравнению с классическим объемом инвестиций для возведения дата-центра. Все это окупается всего за 4 года эксплуатации. Однако, по данным Reuters, лидирующие позиции в области ветровой энергетики занимает не Великобритания, а Дания — и этим активно пользуются лидеры рынка ИТ. Уже в этом году свой «ветряной» дата-центр там запустит Apple.


    / Фото Ian D. Keating CC-BY

    Помимо энергии ветра компании активно используют cолнечную энергию. Например, солнечные батареи ЦОД Apple в г. Мэйден (Северная Каролина) способны генерировать более 42 млн кВт/ч электроэнергии в год. Топ-менеджмент дата-центра утверждает, что этого объема хватает для питания 60% оборудования и системы охлаждения, а оставшиеся 40% покрываются силами биотопливной станции, расположенной неподалеку от ЦОДа.

    Есть и более экзотические примеры — ЦОД Verne Global в Рейкьявике, который использует BMW. Система питания этого дата-центра задействует геотермальную энергию и мощности локальной гидроэлектростанции. Эффективной работе данного ЦОД способствует и благоприятный климат региона — он в меру холодный, а перепады температур незначительны.

    Единичные примеры ЦОД обладают возможностями для комбинированного использования энергии солнца, водных ресурсов и ветра. Например, Citi Data Center во Франкфурте обладает сертификатом LEED, что позволяет ему гордо носить звание самого «зеленого» ЦОД. По словам сотрудников дата-центра, работать в нем приятно, а смотреть на него — вообще одно удовольствие: один из фасадов покрыт настоящими травяными насаждениями, а территория ЦОД напоминает обыкновенный парк.

    Еще один известный пример встраивания дата-центра в окружающую экосистему — проект 1&1 Internet в штате Канзас. Для питания и охлаждения компания задействует ветер, энергию солнца, водные и геотермальные ресурсы.

    Даже на столь ярких примерах эволюция ЦОД не заканчивается — компании пытаются реализовать самые неординарные идеи. Например, Microsoft работает над проектом, который, на первый взгляд, кажется невероятным — дата-центр Natick будет расположен прямо в океане. Проект можно назвать многообещающим, но прежде чем запустить его в «промышленный» режим работы, компания будет проводить всевозможные тесты и эксперименты. Если все пройдет гладко, «облако» Microsoft станет по-настоящему подводным.

    Google, в отличие от своего конкурента, предпочитает наводное плавание подводному. Благодаря организации Nautilus Data Technologies, которая в ближайшем будущем запустит свой революционный дата-центр на поверхности воды, концепция барж-дата-центров — уже не новость. Однако специалисты Google решили пойти дальше и генерировать энергию с помощью гигантских воздушных змеев, которые в том числе будут приводить в движение всю плавучую конструкцию.

    Дополнительное чтение в нашем корпоративном блоге:


    И в нашем блоге на Хабре:

    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/338710/


    Метки:  

    Как попасть в Технопарк Университета ИТМО: большое интервью

    Вторник, 26 Сентября 2017 г. 10:18 + в цитатник
    itmo сегодня в 10:18 Управление

    Как попасть в Технопарк Университета ИТМО: большое интервью

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

      В этом материале расскажем, как работает Технопарк, как получить его поддержку, и что это даёт компании — на примере проектов-резидентов.

      Мастерская-лаборатория ФабЛаб — подразделение Технопарка

      Кто приходит в технопарк


      Как отмечает Олеся Баранюк, заместитель директора Технопарка, профиль университета (информационные и фотонный технологии) создаёт фокус и для компаний-резидентов — в Технопарк приходят в первую очередь бизнесы, связанные с научными разработками. Но не только в области информатики и оптики — сейчас в Технопарке размещаются проекты из следующих сфер:

      • AR/VR
      • Робототехника
      • Системами ИИ
      • Микроэлектроника
      • Нанотехнологии

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

      — Олеся Баранюк, Технопарк Университета ИТМО

      В создании сегодняшнего материала принимали участие руководители следующих проектов.

      Ontodia


      Ontodia — это платформа для визуализации и исследования графовых (graph-based data) данных. Графовые данные — это данные построенные по модели вершин и связей между ними. Проект работает в том числе и с наиболее известным хранилищем графовых данных — Neo4j. Один из примеров проектов, использующих технологию Ontodia, — сервис «Топология бизнеса». Проект Ontodia находится на стадии рыночного продукта, который продолжает дорабатываться и совершенствоваться.

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

      — Дмитрий Павлов, коммерческий директор VISmart (компании-создателя платформы Ontodia)

      odgAssist


      Проект odgAssist помогает производственным (в частности, фармацевтическим) компаниям создавать новые продукты и быстрее выводить их на рынок. А именно — позволяет автоматизировать работу персонала на нижнем уровне (за счет использования носимых устройств для сбора данных и контроля процессов на соответствие, в частности, в формате «фотографии рабочего дня» сотрудника). Такой подход позволяет сократить скорость вывода инновационного продукта на рынок на 20% и серьёзно сэкономить на расходах. У компании есть первые продажи.

      [На момент получения статуса резидента проект находился на стадии:] MVP [минимально жизнеспособный продукт], 1 внедрение, 1 контракт на подходе.

      —Олег Шахов директор по развитию бизнеса компании «Оптимальное движение» (разрабатывает проект odgAssist)

      Orbi


      Компания Orbi разрабатывает первые в мире очки для съемки видео в формате 360 градусов. Это солнечные очки, в которые встроены 4 камеры, позволяющие снимать полную панораму в формате 360. Проект провел успешную краудфандинговую кампанию на Indiegogo, а также привлек значительное финансирование от частных инвесторов. На данный момент в Orbi разработано уникальное программное обеспечение для склейки панорамы из 4-х видеопотоков, работающее на основных десктопных и мобильных платформах и позволяющее получать высококачественное панорамное видео в полностью автоматическом режиме (без участия пользователя). На данный момент в производство отправился прототип устройства в финальном дизайне. Он будет готов к середине ноября 2017 года.




      [На момент появления в Технопарке] мы находились на стадии активной разработки программного обеспечения, хотя наша команда разработчиков состояла только из трех программистов. Также мы активно искали подходящее решение для самого устройства (процессор, оптику, сенсоры и так далее) и производителя, который сможет это устройство сделать. На тот момент у нас уже была запущена кампания на Indiцegogo.

      — Александр Морено, технический директор Orbi

      Parseq Lab


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

      [Состояние на момент получения статуса резидента:] вывод пилотной разработки на рынок.

      — Александр Павлов, директор компании Parseq Lab

      Зачем компаниям приходить в Технопарк


      Некоторые проекты-резиденты изначально связаны с Университетом ИТМО (подробнее об этом чуть ниже), поэтому для них выбор площадки для размещения оказывается очевиден. Другие выбирают из множества альтернатив — вот как об этом рассказывают сами руководители компаний:

      Близость к научным разработкам
      Мы подумали, что хорошо быть рядом к центру компетенций в той области, в которой мы решили развивать свой продукт. Пока что нам кажется, что наше решение стать резидентом Технопарка было верным.

      — Дмитрий Павлов, VISmart

      Серьёзная инфраструктура и нетворкинг
      Мы искали место, где можно заниматься инновационной деятельностью. Нам нужна была инфраструктура для запуска проекта. И нам были нужны не только стол и стул, но также возможность взаимодействовать с другими инновационными предприятиями, получить доступ к интересным событиям и мероприятиям и много чего другого.

      Сначала мы определились с тем, что нам нужен технопарк. Всё-таки стартовать с поддержкой немного проще. Затем мы сделали мониторинг 4 ведущих технопарков в Санкт-Петербурге. В результате Технопарк ИТМО оказался в безоговорочных лидерах. Кроме того, у основателей уже имелись контакты с резидентами, что было для нас очень удобно. Также нам понравилась атмосфера технопарка и его представители

      — Олег Шахов, odgAssist

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

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

      — Александр Морено, Orbi

      Взаимодействие с руководством Технопарка
      Прежде всего, [для нас важна была] готовность руководства идти навстречу при решении вопросов размещения. Хорошая инфраструктура и месторасположение Технопарка.

      — Александр Павлов, Parseq Lab

      Как стать резидентом


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

      Кто становится резидентами:

      • Технологические проекты (первоначальная связь с Университетом ИТМО, наличие в составе участников учёных или учащихся Университета необязательно)
      • Малые Инновационные Предприятия (Университет ИТМО выступает соучредителем таких предприятий, они размещаются в Технопарке в приоритетном порядке)
      • Корпоративные исследовательские центры

      Довольно часто к нам обращаются крупные корпорации с просьбой разместить в Технопарке свои R&D-центры, чтобы иметь возможность находиться в эпицентре инновационной активности, сотрудничать с научными подразделениями Университета и резидентами технопарка, а также постепенно формировать портфель инновационных продуктов.

      — Олеся Баранюк, Технопарк Университета ИТМО

      На что обращают внимание эксперты при отборе заявок:

      • Инновационная составляющая
      • Конкурентные преимущества перед аналогами
      • Понимание рынка, наличие первых продаж
      • Возможность создавать места для прохождения студентами Университета ИТМО практики с последующим трудоустройством

      Мы попросили руководителей компаний-резидентов вспомнить, как они проходили процесс отбора и что, по их мнению, оказалось наиболее важным для экспертов в их проектах:

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

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

      — Дмитрий Павлов, VISmart

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

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

      — Олег Шахов, odgAssist

      Соответствие тематической направленности Технопарка
      Мы разрабатываем инновационное устройство, находящееся действительно на переднем крае современных технологий в области камеростроения (например используемые нами процессор и объективы только появились на рынке, буквально год назад ничего подобного в принципе не существовало). Сама область 360 видео новая и очень активно развивается.

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

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

      Что касается потенциальных инвесторов, то наличие в их портфеле компаний, с которыми вы смогли бы плодотворно сотрудничать, также будет серьезным плюсом. Однако в первую очередь инвесторы, особенно на самых ранних стадиях, оценивают не только проект, но и вас самих. Важно презентовать не только идею — этого мало. Нужно презентовать команду, и убедить их [руководство Технопарка и/или инвесторов] что вы — именно те люди, которые лучше всех смогут данный проект реализовать.

      — Александр Морено, Orbi

      Близость к направлениям, на которых специализируется Технопарк и которые изучаются в Университете ИТМО, в данном случае важный критерий. «Близкий по профилю» проект сможет привлечь к своей работе студентов и аспирантов Университета — причём именно тех, кто хорошо разбирается в тематике проекта:

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

      Область для Университета не профильная, но, тем не менее, в Университете развивается такое направление как Биоинформатика в рамках Лаборатории и Института Биоинформатики [кстати, об этом направлении мы рассказывали в одном из наших материалов], и наличие резидентов с уникальными компетенциями в этой области значительно увеличивает исследовательские возможности студентов, аспирантов и сотрудников научных подразделений.

      — Олеся Баранюк, Технопарк Университета ИТМО

      Как проекты-резиденты взаимодействуют с Университетом ИТМО


      Научная поддержка

      Поучаствовать в проекте могут и студенты-стажеры, и крупные учёные, причём не только из Университета ИТМО:

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

      Сервис, над которым работала команда VISmart, очень заинтересовал ассистент-профессора Венского экономического университета Герхарда Вольгенаннта, что привело его вначале в компанию VISmart, а потом и в Университет ИТМО. В результате он стал участником программы ITMO Fellowship, влился в команду, в настоящий момент работает над усовершенствованием семантических технологий в области голосового управления устройствами.

      — Олеся Баранюк, Технопарк Университета ИТМО

      Вот как говорит об этом взаимодействии коммерческий директор VISmart:

      Да, наши разработки связаны с Университетом ИТМО. Дело в том, что наш продукт Ontodia ориентирован в том числе на поддержку стандартов semantic web, выпущенных w3c, а именно RDF, OWL, SPARQL.

      В России, по нашим сведениям, есть только одно сильное научное подразделение, которое учит применять эти стандарты и ведет серьезные научно-исследовательские проекты в этой сфере — это Международная лаборатория Университета ИТМО “Интеллектуальные методы обработки информации и семантические технологии”, с которой у нас установлены тесные связи. Двое наших сотрудников является аспирантами ИТМО.

      — Дмитрий Павлов, VISmart

      Совместные кейсы

      Пример совместной работы подразделений Университета ИТМО и резидентов технопарка — создание модели транспортного обеспечения ЧМ-2018, которая была разработана совместно с Институтом Дизайна и Урбанистики. Созданная система учитывает расписание игр, а также расписание движения транспорта, прибытие и убытие гостей и другие факторы и служит, в частности, для симуляции разного рода ситуаций, связанных с перемещением людей во время Чемпионата [о других разработках Университета для ЧМ-2018 мы рассказывали здесь].

      Поиск сотрудников

      От резидентов Технопарка ожидается готовность принимать на стажировку студентов и аспирантов Университета. Часть стажёров впоследствии становится сотрудниками компании — например, студенты и выпускники Университета ИТМО работают на проектах odgAssist и Orbi.

      Использование оборудования и лабораторий

      Возможность не только консультироваться с учёными, но и решать вместе с ними практические задачи инновационных компаний — ещё одна точка соприкосновения Университета и резидентов Технопарка:

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

      — Олеся Баранюк, Технопарк Университета ИТМО

      Что оказалось особенно полезным: мнение резидентов


      Мы решили узнать, какие возможности Технопарка оказались наиболее полезными для проектов-резидентов:

      Помощь инновационных менеджеров
      Для нас наиболее полезными оказались следующие услуги: возможность пользоваться конференц-залом Технопарка, возможности ФабЛаб. Нам удобно и приятно иметь помещения в здании Технопарка, потому что авторитет ИТМО помогает выглядеть убедительными, особенно на ранних этапах.

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

      — Дмитрий Павлов, VISmart

      Продвижение и инфраструктура
      Технопарк активно помогает находить интересные программы и конкурсы для стартапов. Например, Технопарк поспособствовал нашему участию в конкурсе проектов Polar Bear Pitching в Оулу (Финляндия), где мы заняли второе место. Это был интересный опыт, участие в котором дало возможность стать нам более узнаваемыми в мире, ведь на мероприятии присутствовали представители средств массовой информации со всего мира: CNN, BBC, Al Jazeera и др., многие вели он-лайн трансляцию, ведь не каждый день можно увидеть предпринимателя, вещающего о конкурентных преимуществах из ледяной проруби в феврале при температуре –25.

      Также для нас очень полезна возможность общаться с другими компаниями, работающими в области 360 видео. Очень удобно, что в технопарке есть ФабЛаб, где много различных инструментов и оборудования, что позволяет, например, быстро напечатать на 3D принтере прототипы, детали и так далее.

      — Александр Морено, Orbi

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

      — Олег Шахов, odgAssist

      Советы молодым предпринимателям: что важно на старте


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

      Попробуйте найти клиента. Пусть это будет не совсем профильный клиент. Но попробуйте начать зарабатывать как можно раньше. Нам на начальном этапе очень сильно помог грант от Фонда Содействия Инновациям

      — Дмитрий Павлов, VISmart

      Проект должен выполнять задачи, для которых он создаётся. Бизнес должен приносить деньги. То, что вы делаете, может приносить деньги? А что можно сделать, чтобы приносило больше?

      Любыми способами (легальными) добейтесь первых продаж. Вы должны понимать, что вы делаете, за какие деньги, для кого и зачем (какую проблему решаете). Если всё ок, то сделайте SWOT-анализ своей идеи/бизнеса. Не стесняйтесь pivot’а и закрытия проекта.

      Не взлетело – посмотрите, почему. Если ценности нет — что ж, так бывает. Если нет скорости, фокуса или execution – поработайте над собой, возможно, вам ещё рано делать стартап. И делайте CustDev, много CustDev’a, чтобы ваш продукт был кому-то нужен.

      — Олег Шахов, odgAssist

      Универсальных советов давать не буду. Просто приведу пример того, с чем мы столкнулись сами. Как правило, особенно когда делаешь не просто ПО, а устройство, то приходится взаимодействовать с большим количеством партнеров (фабрики, производители процессоров и других электронных компонентов и так далее).

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

      — Александр Морено, Orbi
      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/338714/


      Метки:  

      Без заголовка

      Вторник, 26 Сентября 2017 г. 10:18 + в цитатник

      Метки:  

      [recovery mode] Переезды в облако: 5 разных историй

      Вторник, 26 Сентября 2017 г. 10:08 + в цитатник
      SZinkevich сегодня в 10:08 Администрирование

      Переезды в облако: 5 разных историй

      «Все отделы от серваков отказались, а на Авито их никто не купил — шеф сказал, это теперь тестовая среда».

      Компания на 20 разработчиков жила с плотно упакованной серверной стойкой. В стойке (по сегодняшним меркам) стоит уже старый отстой, который не тянет. Когда-то он был новым и красивым, но время безжалостно. Подключились к облаку, затащили туда сначала тестовые среды, потом продакшн. А стойка пригодилась ещё для пары мелких задач по офису и тестов. Мы хорошо видим, как у них погибают старые сервера в ней: по мере отказов они заводят новые виртуальные машины в облаке.


      Эта штука умеет пробрасывать аппаратные ключи 1С в разные подсети

      Исторически к нам заходил ритейл, потом интернет-проекты, затем подтянулись и банки. Теперь же активно переезжают и вполне обычные компании, которые готовы вынести в облако бизнес-критичные задачи. Ниже — несколько типовых историй, которые, возможно, будут вам полезны, даже если вы ещё не планируете никаких облаков. Хотя деваться уже особо-то и некуда — это обыденность, а не новая непонятная фича.

      Соцсеть LOQUI BUSINESS


      Локви (business.loqui.ru) — растущая корпоративная соцсеть. Своего рода полная реализация корпоративного портала. Они поняли, что корпорациям не хватает социальной сети для общения сотрудников, и подумали, что это белое пятно стоит закрыть. Понятное дело, что понадобилась среда для разработки. Управленцы в Москве, разработчики в Германии (русские в основном). Проект изначально российский, базовый язык — русский. Распространение — SaaS, поставляют клиентам уже готовый сервис. То есть у нас развёрнута одна большая мультитенантная инсталляция. Почему мы? Потому что российскому сегменту соцсети надо быть в РФ. Облако подошло гибкостью на этапе разработки и возможностью построения катастрофоустойчивой инфраструктуры, чтобы не огорчать падениями владельцев социальных аккаунтов. Сейчас рассматривают возможность резервирования или полной миграции в виртуальный дата-центр КРОК зарубежных серверов, где лежат медиафайлы, чтобы обеспечить более надёжную защиту от сбоев и максимальную доступность.



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

      Смартекс


      Веб-разработчики, которые научились не только делать крутые сайты, но и поддерживать их, всю сознательную жизнь пользовались плюсами Амазона. Но, конечно, какой бы ты клёвый сайт ни сделал, если он будет во Франкфурте, то в Москве открываться быстро он не будет. А парням это важно, у них динамическая подгрузка контента множеством сессий. Вопрос пинга стал для них очень важен. Амазоновский CDN в Москве не работает. Парни встали к нам — им важно наличие API, которое в нашем случае на 80 процентов совпадает с амазоновским. У нас очень просто тем, кто переезжал с Амазона. Если им понадобится российский CDN — просто обратятся к российскому CDN-провайдеру, это очень просто.

      Как делают банки


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

      Как делает розница


      Пример: компания занимается торговлей косметикой в ценовом сегменте чуть ниже известной звездной сети. Даже в 70 метрах от вражеского магазина они очень хорошо растут в прибыли, причём зная, что у соседей она в кризис падает. Прославились у себя в городе как одна из самых инновационных компаний. Бизнес переформатировали и ведут всё по-новому, по уму. Если им что-то нужно, то ищут лучшего. С ИТ была сложность при расширении — возможности сильно отстали от желаний, был небольшой бардак с поддержкой, много чего делалось вручную. Команда на месте отличная, но рук не хватало. С дичайшим ростом бизнеса в кризис они решили распространяться на Москву. Очень хотели уйти от капитальных затрат к операционным (это вообще важно для всей розницы), потому что финпоток и кредит — это дешевле.

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

      Е-коммерс


      Один большой ритейлер захотел торговать через сеть, у них база на 100 тысяч наименований. Страшно. Но совладали со страхом и начали делать по европейской модели click-and-collect, когда сначала заказываешь издалека, а потом забираешь собранное на месте. Заодно отказались от бумажных каталогов, которые всех порядочно достали. Уровень ада по тому, как быстро всё внедрялось, — hardcore.

      Мы вместе работаем уже лет 15, все магазины обеспечиваем инфраструктурой. Полевые инженеры до сих пор ездят с жёсткими дисками, комплектами для чистки блоков питания и так далее. Но дальше ни-ни, головная компания по поддержке софта — из Англии. Соответственно основные сотрудники у них из Индии. С соответствующим подходом. В частности, работают только по будням. В итоге мы один раз в субботу спасали их СУБД, вставшую намертво (забыли чистить логи, накопилось 350 Гб). Потом было ещё чёрное воскресенье, ещё и ещё… Потом у них не все сервисы стартовали, потому что они их руками пусками. Помню, я звонил их админу, и мы играли в командную строку по телефону. Ну и ещё индийский нюанс подхода — «бекапы делает только трус». Ещё эти гады индусы говорят на «хорошем» английском. Но как только что-то не так с их стороны, начинается на конференц-колах клоунада с тем, что они, типа, перестали понимать. Зато тот единственный раз, когда у нас сгорела железка, они стебали нас: «Ну что, херовые выходные были?» В общем, задолбало. Я сказал: «Парни, мы вас очень любим, но с дачи больше к вам не поедем. Давайте прикрутим нормальный мониторинг, чтобы без сюрпризов». Они почесали голову — мы сделали предложение, и они его приняли.

      Плюс у каждой отрасли свои особенности. Мы сосредоточены на крупных проектах и максимальном удовлетворении заказчика. Но и с разработчиками тоже дружим. Облако КРОК — это индивидуальный портной. Наш опыт, компетенции, ресурсы позволяют приземлять большие задачи серьезных компаний в облаке, помогая бизнесу сосредоточиться на своих корневых функциях. ИТ мы отрулим.
      Костюм будет сидеть идеально.
      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/338678/


      Метки:  

      Как мы отмечали 256 день года и рисовали пиксели через API

      Вторник, 26 Сентября 2017 г. 09:41 + в цитатник
      green_hippo сегодня в 09:41 Разработка

      Как мы отмечали 256 день года и рисовали пиксели через API

        13 сентября в Контуре отмечали День программиста. В самом большом офисе разработки играли в Pac-Man и пытались съесть 280 коробок с пиццей. Одновременно полторы тысячи человек рисовали пиксели в онлайне. В этом посте четыре разработчика рассказывают, как делали праздник.



        Часть 1. Рассказывает Игорь green_hippo, который стырил идею на Reddit


        День программиста у нас отмечает вся компания, а не только разработчики. Поэтому была нужна идея для онлайновой игры, в которой могут участвовать все желающие. Я вспомнил, что в апреле прошёл Reddit Place — социальный эксперимент по коллективному рисованию на холсте 1000x1000 пикселей, в котором участвовал миллион человек.


        Я решил, что надо сделать свой Place, с таймлапсом и API.





        На Reddit миллион человек рисовал на холсте размером один мегапиксель. Каждый мог закрасить не больше одного пикселя раз в 5–20 минут. Если сделать праздничный холст 256x256 пикселей (в 15 раз меньше) и учесть, что у нас не миллион сотрудников (а в 200 раз меньше), то задержку между пикселями тоже должна быть примерно в 10 раз меньше.


        Поэтому для нашего поля 256x256 пикселей я выбрал задержку от 2:56 до 0:32. А после этого рассказал об идее коллегам, которые согласились помочь.


        Часть 2. Рассказывает Вероника aminopyrodin, которая поборола себя и тормозной canvas


        Я сразу поняла, что на фронте будет нужен холст, палитра и зум. Но дизайнеры (Владимир dzekh и Юлия krasilnikovayu) оказались хитрее и придумали ещё перемотку, статистику, лидерборд и скриншоты.



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


        Тем временем я, как современный фронтендер, рефлекторно начала думать о том, чтобы настроить Webpack, Babel и Autoprefixer. А когда очнулась, узнала, что бэкенд-разработчик уже всё сделал. И оно даже работало. Криво-косо, но работало: точки на canvas ставились, зум зумился. Я отпилила от прекрасного дизайна все ненужное и красивенько сверстала.


        Остались две проблемы: Edge и Safari.



        В Safari и правда все тормозило со страшной силой. Сначала обнаружила, что canvas не вынесен в отдельный композитный слой. Поэтому браузер при каждом обновлении холста перерисовывал весь документ. Добавила канвасу transition: translateZ(0), и все стало тормозить быстрее. Потом отрефакторила остальной бакендерский код, избавилась ещё от десятка перерисовок. Интерфейс полетел на первой космической.


        Об IE я сразу не заботилась, потому что знала, что игроки будут пользоваться нормальными браузерами. Беда пришла от старшего брата. Если просишь Edge нарисовать квадрат, он категорически отказывается. Говорит: «Но плавные переходы лучше!» — и размывает весь рисунок.



        Такая же проблема была у ребят из Reddit. Сначала я решила её с помощью CSS-свойства image-rendering и флага CanvasRenderingContext2D.imageSmoothingEnabled. Но перед запуском оказалось, что Edge косячит при общении с сервером через вебсокеты. Поэтому я и его объявила ненормальным браузером.


        Горжусь, что трижды пыталась принести в код React, Webpack, Babel, LESS и Autoprefixer, но смогла победить себя. В итоге всё написано на чистом ES6+ и CSS, но с модными гридами, вебсокетами и fetch-ем.


        Часть 3. Рассказывает Иван vansel, который попробовал новую классную библиотеку и не рад этому


        Я не хотел писать всё с нуля, поэтому поискал готовое. Оригинальный Place лежит на Github, но там слишком много кода. Я взял простой клон под NodeJS и прошёлся по нему напильником. Именно поэтому, когда за дело взялась Вероника, интерфейс уже как-то работал. Вообще, есть уйма клонов, выбирайте для себя любой.


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



        Архитектура была такая: пользователь ставил пиксель в браузере, браузер отправлял сообщение через вебсокет на сервер, сервер отправлял сообщение об изменении холста в очередь (Apache Kafka). Потом серверы забирали данные из очереди и отправляли всем клиентам. Выше оригинальная схема от автора клона, на которой клиенты ещё общаются с сервером с помощью REST-запросов.


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


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



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


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



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


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



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


        Сервер был под NodeJS, поэтому я выбрал LokiJS. Эту базу хвалили за простоту и скорость работы, потому что все данные хранятся в памяти и автоматически записываются на диск через заданные интервалы времени. Для моей задачи подходило.


        Я настроил сохранение раз в 1 минуту. Протестировал локально, в том числе под нагрузкой — всё работало как часы. А на боевой площадке происходило что-то паранормальное. Данные сохранялись на диск не по расписанию, а по собственному желанию. Например, в течение нескольких часов не сохранялись ни разу. За три дня я так и не нашёл причины этого поведения. В итоге, много статистики потерялось при перезапусках сервера.


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


        $ ffmpeg -pattern_type glob \
                 -i "*.png" \
                 -c:v libx264 \
                 -vf format=yuv420p \
                 timelapse.mp4
        
        $ ffmpeg -i timelapse.mp4 \
                 -i sci-fi.mp3 \
                 256.mp4

        Часть 4. Рассказывает Павел xoposhiy, который загнул радугу и запустил ракету через API


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



        Я тоже в этом поучаствовал:



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


        сетку для безошибочного нанесения картинок


        браузерного бота


        Я ждал от Дня программиста большего. И дождался — на второй день Игорь опубликовал в Стаффе такой фрагмент кода и стал раздавать желающим API-ключи:



        Это было уже что-то!


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


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


        Можно было нарисовать часы с текущим временем. Или движущуюся картинку, которая ползёт по холсту и затирает чужие рисунки… чтобы потом их восстановить. И тут я придумал сюжет, который объединил эти две идеи.


        Часы стали таймером обратного отсчёта, движущаяся картинка — взлетающей ракетой. К тому же, ракету очень удобно рисовать — сначала на пиксель удлиняешь верхнюю часть, потом на пиксель укорачиваешь нижнюю. Это не только хорошо смотрится, но и экономит пиксели, ведь задержку при рисовании через API никто не отменял.


        Это должен был быть самый медленный полёт ракеты в истории человечества. С текущей задержкой за пару часов я мог сдвинуть ракету всего на несколько пикселей. Нужно было либо уменьшать ракету, либо двигать её скачками, либо смириться с тем, что лететь она будет сутки. Поделился муками выбора с Игорем, а он со словами «Твори добро!» внезапно отсыпал без малого 50 ключей для API. С таким количеством ключей ракета могла достичь скорости один пиксель в секунду!



        Осталось немного: выбрать дизайн ракеты и написать весь код. Я отбросил мультяшные ракеты и выбрал ракету-носитель «Восток». Сразу стало понятно, что полёт ракеты должен заканчиваться выводом на орбиту корабля Восток-1.


        Почему «Восток»? Потому что прямо сейчас куча инженеров из Контура занимается секретным проектом с кодовым названием Vostok. Я хотел, чтобы парням было приятно.


        Я настроил бота, запустил таймер обратного отсчёта, позвал зрителей через Стафф. Ракета взлетела. И тут я понял, как нелепо выглядит ракета в космосе с неотделёнными разгонными блоками и первой ступенью. Чудом нашёл 10 свободных минут, чтобы добавить отделение ступени и перезапустить бота. Так что это был не только самый медленный полет ракеты в истории человечества, но и первый полёт ракеты, в середине которого поменяли её конструкцию.


        Было приятно наблюдать, как коллеги стирали копию ракеты, из-за бага оставшуюся на стартовом столе. Пририсовывают однопиксельного человечка в окошко ракеты. Переделывают слово «поехали» в «понаехали». Вообще, радовало, что все вели себя культурно, несмотря на отсутствие правил. Даже когда место на холсте закончилось:




        Кстати, без NSFW-контента не обошлось. Кто-то из нарисованного моим первым нескучным ботом слова TRON упорно делал слово PRON.


        Были и более интересные рисунки


        Ваня потом рассказал, что 13 сентября на холсте одновременно рисовало 1630 человек и десяток ботов, то есть примерно треть всех работников компании. В среднем к серверам было подключено 440 клиентов, а в дневные часы — 840.


        В итоге у нас получилась такая картинка:



        И такой таймлапс. Моя ракета взлетает на 27 секунде:





        А вы программируете по праздникам и для праздников? Расскажите нам в комментариях.


        P. S. Если интересно, о чём мы не рассказываем на Хабре, подписывайтесь на наш канал в Телеграме.

        Original source: habrahabr.ru (comments, light).

        https://habrahabr.ru/post/338716/


        Метки:  

        Наш рецепт отказоустойчивого VPN-сервера на базе tinc, OpenVPN, Linux

        Вторник, 26 Сентября 2017 г. 09:01 + в цитатник
        gserge сегодня в 09:01 Администрирование

        Наш рецепт отказоустойчивого VPN-сервера на базе tinc, OpenVPN, Linux

        • Tutorial


        Один из наших клиентов попросил разработать отказоустойчивое решение для организации защищенного доступа к его корпоративному сервису. Решение должно было:

        • обеспечивать отказоустойчивость и избыточность;
        • легко масштабироваться;
        • просто и быстро решать задачу добавления и блокировки пользователей VPN;
        • балансировать нагрузку между входными нодами;
        • одинаково хорошо работать для клиентов на GNU/Linux, Mac OS X и Windows;
        • поддерживать клиентов, которые находятся за NAT.

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

        Разработка концепции


        В качестве базовой VPN-технологии со стороны клиента мы выбрали OpenVPN: он прекрасно работает через NAT и поддерживает все требуемые платформы.

        OpenVPN было решено развернуть в режиме TLS-сервера, а добавление и блокировку пользователей в нем сделать с помощью пакета easy-rsa, который позволяет создавать ключ и сертификат, а затем отзывать их при необходимости.

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

        Итоговое решение вышло простым и изящным. Мы решили использовать N входных нод, адреса которых с помощью round-robin DNS выдаются клиентам. Все ноды и узлы сервиса клиентов включены в единое L2-пространство tinc VPN. Клиентские подключения (тоже L2) объединяются с tinc-интерфейсом в мост. Таким образом, получается, что, подключаясь по OpenVPN, клиент попадает на случайную ноду и оказывается в единой L2-сети со всеми остальными клиентами, нодами и сервисом клиента.



        Для реализации этой схемы были выделены 3 VPS в различных дата-центрах, на которых и требовалось развернуть «точки входа» в сеть (ep1, ep2 и ep3). Кроме того, в сети присутствовал гипервизор с сервисами клиента (hpv1). На всех машинах установили Ubuntu Server 16.04.

        Строим tinc VPN


        Для начала устанавливаем пакеты:

        $ sudo apt-get update && sudo apt-get install tinс

        На этом этапе нам нужно определиться с названием сети — пусть будет l2vpnnet. Создаем структуру каталогов:

        $ sudo mkdir -p /etc/tinc/l2vpnnet/hosts

        В каталоге /etc/tinc/l2vpnnet создаем файл tinc.conf и наполняем его следующим содержимым:

        # Имя текущей машины
        Name = ep1
        # Тип сети, в нашем случае — L2
        Mode = switch
        # Интерфейс, который мы будем использовать
        Interface = tap0
        # По умолчанию используется протокол UDP
        Port = 655
        
        # Записываем имена всех остальных хостов, к которым мы будем подключаться
        ConnectTo = ep2
        ConnectTo = ep3
        ConnectTo = hpv1

        Создаем файл /etc/tinc/l2vpnnet/ep1 и вносим в него параметры:

        # Публичный адрес и порт
        Address = 100.101.102.103 655
        # Используемые алгоритмы шифрования и аутентификации
        Cipher = aes-128-cbc
        Digest = sha1
        # Для уменьшения задержек рекомендуем также выключать сжатие
        Compression = 0

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

        $ cd /etc/tinc/l2vpnnet && sudo tincd -n l2vpnnet -K2048
        Generating 2048 bits keys:
        ............................................+++ p
        .................................+++ q
        Done.
        Please enter a file to save private RSA key to [/etc/tinc/l2vpnnet/rsa_key.priv]: 
        Please enter a file to save public RSA key to [/etc/tinc/l2vpnnet/hosts/ep1]: 

        На остальных машинах проделываем аналогичные действия. Файлы с открытым ключом и параметрами подключения (/etc/tinc/l2vpnnet/hosts/ep1|ep2|ep3|hpv1) необходимо разместить у всех участников сети в каталоге /etc/tinc/l2vpnnet/hosts.

        Название сети необходимо внести в файл /etc/tinc/nets.boot, чтобы tinc запускал VPN к нашей сети автоматически при загрузке:

        $ sudo cat nets.boot 
        #This file contains all names of the networks to be started 
        #on system startup.
        l2vpnnet

        При настройке как tinc VPN, так и OpenVPN в нашей компании принято использовать стандартные механизмы управления сетью Ubuntu. Добавим в /etc/network/interfaces описание параметров устройства tap0:

        # Устройство запускается автоматически при старте системы
        auto tap0
        # Указываем режим конфигурации manual, так как IP мы назначим уже на bridge
        iface tap0 inet manual
                # Создание устройства перед запуском tinc
                pre-up ip tuntap add dev $IFACE mode tap
                # ... и его удаление после остановки
                post-down ip tuntap del dev $IFACE mode tap
                # Собственно, запуск tinc с настроенной нами сетью
                tinc-net l2vpnnet

        Такая настройка позволит нам управлять tinc с помощью ifup/ifdown-скриптов.

        Для единого L2-пространства нужно выбрать и L3-пространство. Для примера мы будем использовать сеть 10.10.10.0/24. Настроим bridge-интерфейс и назначим ему IP — для этого внесем в /etc/network/interfaces такую информацию:

        auto br0
        iface br0 inet static
                # Естественно, IP должен быть разным для хостов
                address 10.10.10.1 
                netmask 255.255.255.0
                # Указываем, что в бридже наш интерфейс tinc vpn
                bridge_ports tap0
        
                # Отключаем протокол spanning tree для bridge-интерфейса
                bridge_stp off
                # Максимальное время ожидания готовности моста
                bridge_maxwait 5
                # Отключаем задержку при форвардинге
                bridge_fd 0

        После этого последовательно стартуем оба устройства на всех серверах и проверяем связанность любым средством диагностики (ping, mtr и т.п.):

        $ sudo ifup tap0 && sudo ifup br0
        $ ping -c3 10.10.10.2
        PING 10.10.10.2 (10.10.10.2) 56(84) bytes of data.
        64 bytes from 10.10.10.2: icmp_seq=1 ttl=64 time=3.99 ms
        64 bytes from 10.10.10.2: icmp_seq=2 ttl=64 time=1.19 ms
        64 bytes from 10.10.10.2: icmp_seq=3 ttl=64 time=1.07 ms
        
        --- 10.10.10.2 ping statistics ---
        3 packets transmitted, 3 received, 0% packet loss, time 2002ms
        rtt min/avg/max/mdev = 1.075/2.087/3.994/1.349 ms

        Отлично: L2-пространство для входных нод и целевого сервера построено. Теперь нужно добавить в него удаленных клиентов.

        Настраиваем OpenVPN


        Для начала устанавливаем необходимые пакеты на всех серверах:

        $ sudo apt-get update && sudo apt-get install openvpn easy-rsa

        Настроим DNS-зону, добавим 3 A-записи с одинаковым именем VPN-сервиса:

        vpn.compa.ny.        IN     A    100.101.102.103
        vpn.compa.ny.        IN     A    50.51.52.53
        vpn.compa.ny.        IN     A    1.1.1.1

        DNS будет выступать первым механизмом балансировки нагрузки в нашей системе. Согласно документации, OpenVPN разрешает имя точки подключения и будет последовательно совершать попытки подключиться ко всем IP, в которые разрешается имя. DNS при этом будет отдавать список IP в случайном порядке.

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

        Node 1 10.10.10.100-10.10.10.129
        Node 2 10.10.10.130-10.10.10.159
        Node 2 10.10.10.160-10.10.10.189

        Создадим окружение для CA:

        $ cd /etc/openvpn
        $ sudo -s
        # make-cadir ca
        # mkdir keys 
        # chmod 700 keys
        # exit

        Теперь отредактируем файл с переменными vars, установив следующие значения:

        # Каталог с easy-rsa
        export EASY_RSA="`pwd`"
        # Путь к openssl, pkcs11-tool, grep 
        export OPENSSL="openssl"
        export PKCS11TOOL="pkcs11-tool"
        export GREP="grep"
        # Конфиг openssl
        export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
        # Каталог с ключами
        export KEY_DIR="$EASY_RSA/keys"
        export PKCS11_MODULE_PATH="dummy"
        export PKCS11_PIN="dummy"
        # Размер ключа
        export KEY_SIZE=2048
        # CA-ключ будет жить 10 лет
        export CA_EXPIRE=3650
        # Описываем нашу организацию: страна, регион,
        # город, наименование, e-mail и подразделение
        export KEY_COUNTRY="RU"
        export KEY_PROVINCE="Magadan region"
        export KEY_CITY="Susuman"
        export KEY_ORG="Company"
        export KEY_EMAIL="info@compa.ny"
        export KEY_OU="IT"
        export KEY_NAME="UnbreakableVPN"

        Сохраняем и начинаем генерацию ключей:

        # . vars
        # ./clean-all 
        # ./build-ca
        Generating a 2048 bit RSA private key
        ..........................+++
        .+++
        writing new private key to 'ca.key'
        -----
        You are about to be asked to enter information that will be incorporated
        into your certificate request.
        What you are about to enter is what is called a Distinguished Name or a DN.
        There are quite a few fields but you can leave some blank
        For some fields there will be a default value,
        If you enter '.', the field will be left blank.
        -----
        Country Name (2 letter code) [RU]:
        State or Province Name (full name) [Magadan region]:
        Locality Name (eg, city) [Susuman]:
        Organization Name (eg, company) [Company]:
        Organizational Unit Name (eg, section) [IT]:
        Common Name (eg, your name or your server's hostname) [Company CA]:
        Name [UnbreakableVPN]:
        Email Address [info@compa.ny]:
        # ./build-dh
        Generating DH parameters, 2048 bit long safe prime, generator 2
        This is going to take a long time
        …
        # ./build-key-server server
        # openvpn --genkey --secret keys/ta.key

        Создадим тестового пользователя и сразу отзовем его сертификат, чтобы создать список отзыва:

        # ./build-key testuser
        # ./revoke-full testuser

        Скопируем все необходимые для настройки сервера ключи в каталог с ключевой информацией OpenVPN:

        # cd keys
        # mkdir /etc/openvpn/.keys
        # cp ca.crt server.crt server.key dh2048.pem ta.key crl.pem /etc/openvpn/.keys
        # exit

        Подготовим конфигурацию OpenVPN-сервера, для чего создадим файл /etc/openvpn/server.conf:

        # Устанавливаем подробность ведения журнала
        verb 4
        # Порт и протокол подключения
        port 1194
        proto tcp-server
        # Режим и способ аутентификации 
        mode server
        tls-server
        # Определяем MTU 
        tun-mtu 1500
        # Определяем имя и тип интерфейса, который будет обслуживать клиентов
        dev ovpn-clients
        dev-type tap
        # Указываем, что TA-ключ используется в режиме сервера
        key-direction 0
        # Описываем ключевую информацию
        cert /etc/openvpn/.keys/server.crt
        key /etc/openvpn/.keys/server.key
        dh /etc/openvpn/.keys/dh2048.pem
        tls-auth /etc/openvpn/.keys/ta.key
        crl-verify /etc/openvpn/.keys/crl.pem
        # Определяем протоколы аутентификации и шифрования
        auth sha1
        cipher AES-128-CBC 
        # Опция, указывающая, что устройство будет создаваться единожды
        # на все время работы сервера
        persist-tun
        # Указываем тип топологии и пул
        topology subnet
        server-bridge 10.10.10.1 255.255.255.0 10.10.10.100 10.10.10.129
        # Указываем маршрут по умолчанию через туннель и определяем
        # внутренние DNS
        push "redirect-gateway autolocal"
        push "dhcp-option DNS 10.10.10.200"
        push "dhcp-option DNS 10.20.20.200"
        # Проверяем доступность подключенного клиента раз в 10 секунд,
        # таймаут подключения — 2 минуты
        keepalive 10 120
        # То самое ограничение в 30 клиентов
        max-clients 30
        # Локальные привилегии демона openvpn
        user nobody
        group nogroup
        # Позволяет удаленному клиенту подключаться с любого IP и порта
        float
        # Путь к файлу журнала
        log    /var/log/openvpn-server.log

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

        По аналогии с tinc настроим управление OpenVPN через стандартные ifup/ifdown-скрипты, добавив описание устройства в /etc/network/interfaces:

        auto ovpn-clients
        iface ovpn-clients inet manual 
                pre-up ip tuntap add dev $IFACE mode tap 
                post-up systemctl start openvpn@server.service 
                pre-down systemctl stop openvpn@server.service 
                post-down ip tuntap del dev $IFACE mode tap

        Включим интерфейс в мост вместе с tinc, изменив настройки интерфейса br0:

                ...
                netmask 255.255.255.0
                bridge_ports tap0
                bridge_ports ovpn_clients
                bridge_stp off
                ...

        Приведем все в рабочее состояние:

        $ sudo ifup ovpn-clients && sudo ifdown br0 && sudo ifup br0

        Серверная конфигурация готова. Теперь создадим клиентские ключи и ovpn-файл:

        $ sudo -s
        # cd /etc/openvpn/ca
        # ./build-key PetrovIvan
        # exit

        Для упрощения использования мы создадим клиентский ovpn-файл c ключевой информацией INLINE:

        $ vim PetrovInan.ovpn
        # Указываем тип подключения, тип устройства и протокол
        client
        dev tap
        proto tcp
        # Определяем MTU такой же, как и на сервере
        tun-mtu 1500
        # Указываем узел и порт подключения
        remote vpn.compa.ny 1194
        # Отказываемся от постоянного прослушивания порта
        nobind
        # Опция, которая позволяет не перечитывать ключи для каждого соединения
        persist-key
        persist-tun
        # Корректируем MSS 
        mssfix
        # Указываем, что будем использовать TA как TLS-клиент
        key-direction 1
        ns-cert-type server
        remote-cert-tls server
        
        auth sha1
        cipher AES-128-CBC
        verb 4
        keepalive 10 40
        
        
        ### Сюда вставляем содержимое ca.crt
        
        
         
        ### Сюда вставляем содержимое ta.key
        
        
        
        ### Сюда вставляем содержимое PetrovIvan.crt
        
        
        
        ### Сюда вставляем содержимое PetrovIvan.key
        

        Сохраняем и отдаем клиенту, который просто подключается к VPN, используя ovpn-файл. На этом настройка OpenVPN закончена.

        Блокировка клиента


        В случае, когда нам необходимо запретить подключение к VPN одному из клиентов (например, при увольнении сотрудника), мы просто отзываем сертификат:

        $ ./revoke-all PetrovIvan

        После отзыва обновляем на всех серверах crl.pem и выполняем:

        $ sudo service openvpn reload

        Обратите внимание, что в server.conf отсутствует опция persist-key. Это позволяет обновить ключевую информацию во время выполнения reload — иначе бы для этого потребовался рестарт демона.

        Для распространения списка отзыва и выполнения действия reload для OpenVPN мы используем Chef. Очевидно, для этой цели подойдут любые другие средства автоматического развертывания конфигураций (Ansible, Puppet…) или даже простой shell-скрипт.

        Кроме того, мы поместили каталог с CA в Git, что позволило и нам, и клиенту совместно работать с ключевой информацией, избегая коллизий.

        Заключение


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

        Если у вас есть мысли о слабых местах в этом решении или идеи/вопросы по дальнейшему развитию конфигурации — буду рад увидеть их комментариях!

        P.S.


        Читайте также в нашем блоге:

        Original source: habrahabr.ru (comments, light).

        https://habrahabr.ru/post/338628/


        Метки:  

        Разбираемся с новым sync.Map в Go 1.9

        Вторник, 26 Сентября 2017 г. 03:50 + в цитатник
        divan0 сегодня в 03:50 Разработка

        Разбираемся с новым sync.Map в Go 1.9

        • Tutorial

        Одним из нововведений в Go 1.9 было добавление в стандартную библиотеку нового типа sync.Map, и если вы ещё не разобрались что это и для чего он нужен, то эта статья для вас.


        Для тех, кому интересен только вывод, TL;DR:


        если у вас высоконагруженная (и 100нс решают) система с большим количеством ядер процессора (32+), вы можете захотеть использовать sync.Map вместо стандартного map+sync.RWMutex. В остальных случаях, sync.Map особо не нужен.


        Если же интересны подробности, то давайте начнем с основ.


        Тип map


        Если вы работаете с данными в формате "ключ"-"значение", то всё что вам нужно это встроенный тип map (карта). Хорошее введение, как пользоваться map есть в Effective Go и блог-посте "Go Maps in Action".


        map — это generic структура данных, в которой ключом может быть любой тип, кроме слайсов и функций, а значением — вообще любой тип. По сути это хорошо оптимизированная хеш-таблица. Если вам интересно внутреннее устройство map — на прошлом GopherCon был очень хороший доклад на эту тему.


        Вспомним как пользоваться map:


        // инициализация
        m := make(map[string]int)
        // запись
        m["habr"] = 42
        // чтение
        val := m["habr"]
        // чтение с comma,ok
        val, ok := m["habr"] // ok равен true, если ключ найден
        // итерация
        for k, v := range m { ... }
        // удаление
        delete(m, "habr")

        Во время итерации значения в map могут изменяться.


        Go, как известно, является языком созданным для написания concurrent программ — программ, который эффективно работают на мультипроцессорных системах. Но тип map не безопасен для параллельного доступа. Тоесть для чтения, конечно, безопасен — 1000 горутин могут читать из map без опасений, но вот параллельно в неё ещё и писать — уже нет. До Go 1.8 конкурентный доступ (чтение и запись из разных горутин) могли привести к неопределенности, а после Go 1.8 эта ситуация стала явно выбрасывать панику с сообщением "concurrent map writes".


        Почему map не потокобезопасен


        Решение делать или нет map потокобезопасным было непростым, но было принято не делать — эта безопасность не даётся бесплатно. Там где она не нужна, дополнительные средства синхронизации вроде мьютексов будут излишне замедлять программу, а там где она нужна — не составляет труда реализовать эту безопасность с помощью sync.Mutex.


        В текущей реализации map очень быстр:


        Такой компромисс между скоростью и потокобезопасностью, при этом оставляя возможность иметь и первый и второй вариант. Либо у вас сверхбыстрый map безо всяких мьютексов, либо чуть медленнее, но безопасен для параллельного доступа. Важно тут понимать, что в Go использование переменной параллельно несколькими горутинами — это не далеко единственный способ писать concurrent-программы, поэтому кейс этот не такой частый, как может показаться вначале.


        Давайте, посмотрим, как это делается.


        Map + sync.Mutex


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


        type Counters struct {
            sync.Mutex
            m map[string]int
        }

        Мьютекс никак инициализировать не нужно, его "нулевое значение" это разлоченный мьютекс, готовый к использованию, а карту таки нужно, поэтому будет удобно (но не обязательно) создать функцию-конструктор:


        func NewCounters() *Counters {
            return &Counters{
                m: make(map[string]int),
            }
        }

        Теперь у переменной типа Counters будет метод Lock() и Unlock(), но если мы хотим упростить себе жизнь и использовать этот тип из других пакетов, то будет также удобно сделать функции обёртки вроде Load() и Store(). В таком случае мьютекс можно не встраивать, а просто сделать "приватным" полем:


        type Counters struct {
            mx sync.Mutex
            m map[string]int
        }
        
        func (c *Counters) Load(key string) (int, bool) {
            c.mx.Lock()
            defer c.mx.Unlock()
            val, ok := c.m[key]
            return val, ok
        }
        
        func (c *Counters) Store(key string, value int) {
            c.mx.Lock()
            defer c.mx.Unlock()
            c.m[key] = value
        }

        Тут нужно обратить внимание на два момента:


        • defer имеет небольшой оверхед (порядка 50-100 наносекунд), поэтому если у вас код для высоконагруженной системы и 100 наносекунд имеют значение, то вам может быть выгодней не использовать defer
        • методы Get() и Store() должны быть определены для указателя на Counters, а не на Counters (тоесть не func (c Counters) Load(key string) int { ... }, потому что в таком случае значение ресивера (c) копируется, вместе с чем скопируется и мьютекс в нашей структуре, что лишает всю затею смысла и приводит к проблемам.

        Вы также можете, если нужно, определить методы Delete() и Range(), чтобы защищать мьютексом map во время удаления и итерации по ней.


        Кстати, обратите внимание, я намеренно пишу "если нужно", потому что вы всегда решаете конкретную задачу и в каждом конкретном случае у вас могут разные профили использования. Если вам не нужен Range() — не тратьте время на его реализацию. Когда нужно будет — всегда сможете добавить. Keep it simple.


        Теперь мы можем легко использовать нашу безопасную структуру данных:


        counters := NewCounters()
        counters.Store("habr", 42)
        v, ok := counters.Load("habr")

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


        counters["habr"]++

        а для нашей структуры можем сделать отдельный метод:


        func (c *Counters) Inc(key string) {
            c.mx.Lock()
            defer c.mx.Unlock()
            c.m[key]++
        }
        ...
        counters.Inc("habr")

        Но часто у работы с данными в формате "ключ"-"значение", паттерн доступа неравномерный — либо частая запись, и редкое чтение, либо наоборот. Типичный случай — обновление происходит редко, а итерация (range) по всем значениям — часто. Чтение, как мы помним, из map — безопасно, но сейчас мы будем лочиться на каждой операции чтения, теряя без особой выгоды время на ожидание разблокировки.


        sync.RWMutex


        В стандартной библиотеке для решения этой ситуации есть тип sync.RWMutex. Помимо Lock()/Unlock(), у RWMutex есть отдельные аналогичные методы только для чтения — RLock()/RUnlock(). Если метод нуждается только в чтении — он использует RLock(), который не заблокирует другие операции чтения, но заблокирует операцию записи и наоборот. Давай обновим наш код:


        type Counters struct {
            mx sync.RWMutex
            m  map[string]int
        }
        ...
        func (c *Counters) Load(key string) (int, bool) {
            c.mx.RLock()
            defer c.mx.RUnlock()
            val, ok := c.m[key]
            return val, ok
        }

        Решения map+sync.RWMutex являются почти стандартом для map, которые должны использоваться из разных горутин. Они очень быстрые.


        До тех пор, пока у вас не появляется 64 ядра и большое количество одновременных чтений.


        Cache contention


        Если посмотреть на код sync.RWMutex, то можно увидеть, что при блокировке на чтение, каждая горутина должна обновить поле readerCount — простой счётчик. Это делается атомарно с помощью функции из пакета sync/atomic atomic.AddInt32(). Эти функции оптимизированы под архитектуру конкретного процессора и реализованы на ассемблере.


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


        На современном железе передача между L2 кешем занимает что-то около 40 наносекунд. Это немного, но когда много ядер одновременно пытаются обновить счётчик, каждое из них становится в очередь и ждёт эту инвалидацию и вычитывание из кеша. Операция, которая должна укладываться в константное время внезапно становится O(N) по количеству ядер. Эта проблема называется cache contention.


        В прошлом году в issue-трекере Go была создана issue #17973 на эту проблему RWMutex. Бенчмарк ниже показывает почти 8-кратное увеличение времени на RLock()/RUnlock() на 64-ядерной машине по мере увеличения количества горутин активно "читающих" (использующих RLock/RUnlock):



        А это бенчмарк на одном и том же количестве горутин (256) по мере увеличения количества ядер:



        Как видим, очевидная линейная зависимость от количества задействованных ядер процессора.


        В стандартной библиотеке map-ы используются довольно много где, в том числе в таких пакетах как encoding/json, reflect или expvars и описанная проблема может приводить к не очень очевидным замедлениям в более высокоуровневом коде, который и не использует напрямую map+RWMutex, а, например, использует reflect.


        Собственно, для решения этой проблемы — cache contention в стандартной библиотеке и был добавлен sync.Map.


        sync.Map


        Итак, ещё раз сделаю акцент — sync.Map решает совершенно конкретную проблему cache contention в стандартной библиотеке для таких случаев, когда ключи в map стабильны (не обновляются часто) и происходит намного больше чтений, чем записей.


        Если вы совершенно чётко не идентифицировали в своей программе узкое место из-за cache contention в map+RWMutex, то, вероятнее всего, никакой выгоды от sync.Map вы не получите, и возможно даже слегка потеряете в скорости.


        Ну а если все таки это ваш случай, то давайте посмотрим, как использовать API sync.Map. И использовать его на удивление просто — практически 1-в-1 наш код раньше:


            // counters := NewCounters() <-- 
            var counters sync.Map

        Запись:


            counters.Store("habr", 42)

        Чтение:


            v, ok := counters.Load("habr")

        Удаление:


            counters.Delete("habr")

        При чтении из sync.Map вам, вероятно также потребуется приведение к нужному типу:


        v, ok := counters.Load("habr")
        if ok {
           val = v.(int)
        }

        Кроме того, есть ещё метод LoadAndStore(), который возвращает существующее значение, и если его нет, то сохраняет новое, и Range(), которое принимает аргументом функцию для каждого шага итерации:


            v2, ok := counters.LoadOrStore("habr2", 13)

            counters.Range(func(k, v interface{}) bool {
                fmt.Println("key:", k, ", val:", v)
                return true // if false, Range stops
            })

        API обусловлен исключительно паттернами использования в стандартной библиотеке. Сейчас sync.Map используется в пакетах encoding/{gob/xml/json}, mime, archive/zip, reflect, expvars, net/rpc.


        По производительности sync.Map гарантирует константное время доступа к map вне зависимости от количества одновременных чтений и количества ядер. До 4 ядер, sync.Map при большом количестве параллельных чтений, может быть существенно медленнее, но после начинает выигрывать у map+RWMutex:



        Заключение


        Резюмируя — sync.Map это не универсальная реализация неблокирующей map-структуры на все случаи жизни. Это реализация для конкретного паттерна использования для, преимущественно, стандартной библиотеки. Если ваш паттерн с этим совпадает и вы совершенно чётко знаете, что узкое место в вашей программе это cache contention на map+sync.RWMutex — смело используйте sync.Map. В противном случае, sync.Map вам вряд ли поможет.


        Если же вам просто лень писать map+RWMutex обертку и высокая производительность совершенно не критична, но нужна потокобезопасная map, то sync.Map также может быть неплохим вариантом. Но не ожидайте от sync.Map слишком многого для всех случаев.


        Так же для вашего случая могут больше подходить други реализации hash-таблиц, например на lock-free алгоритмах. Подобные пакеты были давно, и единственная причина, почему sync.Map находится в стандартной библиотеке — этого его активное использование другими пакетами из стандратной библиотеки.


        Ссылки


        Original source: habrahabr.ru (comments, light).

        https://habrahabr.ru/post/338718/


        Метки:  

        Eggs Datacenter: как Emercoin позволил реализовать идею распределённого дата-центра на блокчейне

        Понедельник, 25 Сентября 2017 г. 19:48 + в цитатник
        EmercoinBlog сегодня в 19:48 Администрирование

        Eggs Datacenter: как Emercoin позволил реализовать идею распределённого дата-центра на блокчейне

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

          image
          Раньше каждый ребёнок знал, что не следует держать все eggs в одной korzinka

          Представленный 21 сентября на CryptoBazar в Москве проект распределенного дата-центра Eggs Datacenter собирается изменить сложившееся статус-кво на рынке традиционных ЦОДов при помощи технологий Emercoin.

          Распределенный дата-центр Eggs Datacenter — тоже самое что и обычный ЦОД, только:

          • без физической системы защиты, такой как высокие стены и злые овчарки,
          • без веры в правила и стандарты XX века, такие как Tier 1-4,
          • без невообразимой плотности пользователей на один хост.

          — но с гибридной бизнес моделью.

          По сути, это сеть одноранговых серверов, размещенных в помещениях малого и среднего бизнеса в 17 регионах России. Хостеры (бизнес) получают дешевый интернет по цене на 30-50% ниже рыночной, взамен позволяя размещать у себя мобильные сервера на базе форм фактора Mini-ITX. Каждый сервер оборудован 6 ядерным процессором Xeon с ECC, видеокартой Nvidia GeForce или Radeon GTX, 16 — 32 ГБ ОЗУ, 1 ТБ SSD диском. Среднее TDP не превышает 600 Вт. Как поставщик интернета, распределенный дата-центр контролирует сетевой стек на уровне L3, соответственно, весь траффик фильтруется и тщательно процеживается. Апстримами выступают Авантел, Rinet, Эр Телеком Холдинг и многие другие интернет провайдеры, стремящиеся загрузить свои оптоволоконные сети. В качестве гипервизора используется open-source XenServer 7.2 (Xen 4.0) и CloudStack.

          Блокчейн — это и база хранения информации, и гарант её неизменности. Одним из вариантов применения блокчейна стала запись и хранение в нем важной информации в виде параметров «имя-значение» (NVS). Реализованное в блокчейне Emercoin, это решение позволяет локально сохранять данные публичных SSH-ключей, SSL-сертификатов и DNS-записей, не доверяя конкретному центру. Блокчейн Emercoin позволяет базирующимся на нём проектам быть и децентрализованными, и защищеннёми одновременно. Такова сила криптографии.

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

          Гибридная бизнес модель снижает стоимость услуг, задержку доставки сигнала и риски кражи конфиденциальной информации, т.к. все хосты расположены локально и средняя плотность юзеров на хост — не более 6 человек. Но хостах стоит антивирус и используется FDE-шифрование для физической защиты жесткого диска пользователя в случае кражи/порчи оборудования. Блокчейн же используется как локальная система хранения SSH-ключей, SSL-сертификатов во избежании атаки «Человек посередине» и для защиты от компрометации DNS запросов. Среди тех, кто уже пользуется услугами дата центра — малый бизнес компании Eggs TV в Москве, Санкт-Петербурге, Нижнем Новгороде, Казани, Екатеринбурге и т.д. Большинство хостеров — сетевые бренды, такие как «Мать и дитя», Black Star, Dr Loder и другие.



          Децентрализованному дата-центру — распределённое финансирование


          Чтобы расширяться, проекту необходимо больше денег на установку серверов и переподключение хостеров к интернету. Собрать их Eggs Datacenter решил через краудфандинг. Для сбора средств, в продажу будут выпущены токены EGS на блокчейне Ethereum (стандарта ERC20), а по его завершении, токены будут использоваться для выплаты кэшбека за покупку услуг дата-центра: 10% от каждой покупки будут начисляться токенами, на которые, в свою очередь, можно будет оплатить оплатить интернет как малому бизнесу, так и обычным пользователям у себя дома. Планируемый объем выкупа токенов для кэшбека пользователям — 13 320 000 штук из максимального возможного объема эмиссии 30 000 000 токенов.

          Как принять участие в pre-ICO на Emercoin


          Для своего Pre-ICO Eggs Datacenter выбрали тоже Emercoin как наиболее подходящую, на взгляд разработчиков, для краудфандинговых кампаний, соблюдающих нормы KYC/AML.

          Чтобы купить EGS со скидкой от 20% до 50% ранним инвесторам нужно будет оставить оставить заявку на сайте Eggs Datacenter. Им на почту придёт уникальный идентификатор и список уникальных кошельков в 7 основных валютах: USD, RUB, BTC, ETH/ETC, EMC, WAVES.

          После подтверждения транзакции криптовалюты в трех блоках, будет внесена DPO-запись в блокчейн Emercoin о том количестве токенов, которое было оплачено на момент транзакции. Вид записи будет, например, следующий «dpo: EggsDC: SN100».

          Проверить свою запись можно будет прямо в Emer-блокчейне или в любом кошельке Emercoin. К ICO будет будут выпущены токены EGS уже на Ethereum, ссылку для зачисления которых все участники pre-ICO получат на свои электронные адреса.

          Пообщаться с разработчиками проекта можно в Telegram-чате.


          EGGS Datacenter: Мы заботимся о яйцах
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/338572/


          Метки:  

          О классификации методов преобразования Фурье на примерах их программной реализации средствами Python

          Понедельник, 25 Сентября 2017 г. 19:03 + в цитатник
          Scorobey вчера в 19:03 Разработка

          О классификации методов преобразования Фурье на примерах их программной реализации средствами Python

          • Tutorial

          Введение


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

          Вторая группа публикаций касается применения преобразований Фурье в технике, например, при спектральном анализе [3,4].

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

          Задачи публикации


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

          Гармонический анализ и синтез


          Гармоническим анализом называют разложение функции f(t), заданной на отрезке [0, Т] в ряд Фурье или в вычислении коэффициентов Фурье по формулам.

          Гармоническим синтезом называют получение колебаний сложной формы путем суммирования их гармонических составляющих (гармоник).

          Программная реализация
          #!/usr/bin/python
          # -*- coding: utf-8 -*
          from scipy.integrate import quad # модуль для интегрирования
          import matplotlib.pyplot as plt # модуль для графиков
          import numpy as np # модуль для операций со списками и массивами
          T=np.pi; w=2*np.pi/T# период и круговая частота
          def func(t):# анализируемая функция
                   if t=pi  f(t)=-cos(t)")
          plt.plot(q, F1, label='1 гармоника')
          plt.plot(q, F2 , label='2 гармоника')
          plt.plot(q, F3, label='3 гармоника')
          plt.xlabel("Время t")
          plt.ylabel("Амплитуда А")
          plt.legend(loc='best')
          plt.grid(True)
          F=np.array(a[0]/2)+np.array([0*t for t in q-1])# подготовка массива для анализа с a[0]/2
          for k in np.arange(1,c,1):
                   F=F+np.array([a[k]*np.cos(w*k*t)+b[k]*np.sin(w*k*t) for t in q])# вычисление членов ряда Фурье
          plt.figure()
          P=[func(t) for t in q]
          plt.title("Классический гармонический синтез")
          plt.plot(q, P, label='f(t)')
          plt.plot(q, F, label='F(t)')
          plt.xlabel("Время t")
          plt.ylabel("f(t),F(t)")
          plt.legend(loc='best')
          plt.grid(True)
          plt.show()
          


          Результат






          Спектральный анализ периодических функций заключается в нахождении амплитуды Аk и фазы j k гармоник (косинусоид) ряда Фурье. Задача, обратная спектральному анализу, называется спектральным синтезом.

          Программная реализация для спектрального анализа и синтеза без специальных функций NumPy для Фурье преобразования
          #!/usr/bin/python
          # -*- coding: utf-8 -*
          from scipy.integrate import quad # модуль для интегрирования
          import matplotlib.pyplot as plt # модуль для графиков
          import numpy as np # модуль для операций со списками и массивами
          T=np.pi; w=2*np.pi/T# период и круговая частота
          def func(t):# анализируемая функция
                   if ta[k]))                  
                   else:
                            g.append(-np.pi/2)# фаза когда тангенс равен бесконечности
          plt.figure()
          plt.title("Спектральный анализ \n Спектр фаз -g(k)")
          plt.plot([m[1],m[1]],[0, g[1]],label='Фаза 1 гармоники')
          plt.plot([m[2],m[2]],[0, g[2]],label='Фаза 2 гармоники')
          plt.plot([m[3],m[3]],[0, g[3]],label='Фаза 3 гармоники')
          plt.xlabel("Номер гармоники")
          plt.ylabel("Фаза")
          plt.legend(loc='best')
          plt.grid(True)
          plt.figure()
          plt.title("Спектральный синтез - FK=A[k]*cos(w*k*t+g[k])")
          FK=-np.array(a[0]/2)+np.array([0*t for t in q-1])#подготовка массива длячисленного синтеза 
          for k in m:       
                   FK=FK+np.array([A[k]*np.cos(w*k*t+g[k]) for t in q])# численный спектральный синтез
          P=[func(t) for t in q]
          plt.plot(q, P, label='f(t)')
          plt.plot(q, FK, label='FK(t)')
          plt.xlabel("Время t")
          plt.ylabel("f(t),FK(t)")
          plt.legend(loc='best')
          plt.grid(True)
          plt.show()
          


          Результат








          Программная реализация спектрального анализа и синтеза с использованием функций NumPy прямого быстрого преобразования Фурье – rfft и обратного преобразования – irfft
          #!/usr/bin/python
          # -*- coding: utf-8 -*
          import matplotlib.pyplot as plt 
          import numpy as np
          import numpy.fft 
          T=np.pi;z=T/16; m=[k*z for k in np.arange(0,16,1)];arg=[];q=[]#  16 отсчётов на период в пи
          def f(t):# анализируемая функция
                   if t2)
          plt.figure()
          plt.title("Спектральный анализ с использованием  прямого БПФ ")
          plt.plot(np.arange(0,7,1),arg,label='Фаза')
          plt.plot(np.arange(0,7,1),A,label='Амплитуда')
          plt.xlabel("Частота")
          plt.ylabel("Фаза,Амплитуда")
          plt.legend(loc='best')
          plt.grid(True)
          for i in np.arange(0,9,1):
                   if i<=7:
                            q.append(F[i])
                   else:
                            q.append(0)
          h=np.fft.irfft(q, n=None, axis=-1)# обратное быстрое преобразование Фурье во временную область
          plt.figure()
          plt.title("Спектральный синтез с использованием  обратного БПФ ")
          plt.plot(m, v,label='Исходная функция')
          plt.plot(m, h,label='Синтезированная функция')
          plt.xlabel("Время")
          plt.ylabel("Амплитуда")
          plt.legend(loc='best')
          plt.grid(True)          
          plt.show()
          






          Фильтрация аналоговых сигналов


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

          Программная реализация иллюстрирует технику фильтрации с применением БПФ. Сначала синтезируется исходный сигнал, представленный 128 отсчетами вектора v. Затем к этому сигналу присоединяется шум с помощью генератора случайных чисел (функция np. random.uniform(0,0.5)) и формируется вектор из 128 отсчетов зашумленного сигнала.

          Программная реализация
          #!/usr/bin/python
          # -*- coding: utf-8 -*
          import matplotlib.pyplot as plt 
          import numpy as np
          from numpy.fft import rfft, irfft
          from numpy.random import uniform
          k=np.arange(0,128,1)
          T=np.pi;z=T/128; m=[t*z for t in k]#задание для дискретизации функции на 128 отсчётов
          def f(t):#анализируемая функция
                   if t=0:
                            q=1
                   else:
                            q=0
                   return q
          v=[f(t) for t in m]#дискретизация исходной функции
          vs= [f(t)+np.random.uniform(0,0.5) for t in m]# добавление шума
          plt.figure()
          plt.title("Фильтрация аналоговых сигналов  \n Окно исходной и зашумленной функций")
          plt.plot(k,v, label='Окно исходной функции шириной pi')
          plt.plot(k,vs,label='Окно зашумленной функции шириной pi')
          plt.xlabel("Отсчёты -k")
          plt.ylabel("Амплитуда А")
          plt.legend(loc='best')
          plt.grid(True)
          al=2# степень фильтрации высших гармоник
          fs=np. fft.rfft(v)# переход из временной области в частотную с помощью БПФ
          g=[fs[j]*FH(abs(fs[j])-2) for j in np.arange(0,65,1)]# фильтрация высших гармоник
          h=np.fft.irfft(g) # возврат во временную область
          plt.figure()
          plt.title("Фильтрация аналоговых сигналов  \n Результат фильтрации")
          plt.plot(k,v,label='Окно исходной функции шириной pi')
          plt.plot(k,h, label='Окно результата фильтрации шириной pi')
          plt.xlabel("Отсчёты -k")
          plt.ylabel("Амплитуда А")
          plt.legend(loc='best')
          plt.grid(True)
          plt.show()
          


          Результат






          Решение дифференциальных уравнений в частных производных


          Алгоритм решения дифференциальных уравнений математической физики с использованием прямого и обратного БПФ приведен в [5]. Воспользуемся приведенными данными для программной реализации на Python решения дифференциального уравнения распространения тепла в стержне с применением преобразования Фурье.

          Программная реализация
          #!/usr/bin/env python
          #coding=utf8
          import numpy as np
          from numpy.fft import fft, ifft # функции быстрого прямого и обратного преобразования Фурье
          import pylab# модуль построения поверхности
          from mpl_toolkits.mplot3d import Axes3D# модуль построения поверхности
          n=50# стержень длиной 2 пи разбивается на 50 точек
          times=10# количества итераций во времени
          h=0.01# шаг по времени
          x=[r*2*np.pi/n  for r in np.arange(0,n)]# дискретизация х
          w= np.fft.fftfreq(n,0.02)# сдвиг нулевой частотной составляющей к центру спектра
          k2=[ r**2 for r in w]# коэффициенты разложения 
          u0 =[2 +np.sin(i) + np.sin(2*i) for i in x]# дискретизация начального распределения температуры вдоль стержня
          u = np.zeros([times,n])# матрица нулей размерностью 10*50
          u[0,:] = u0 # нудевые начальные условия
          uf =np.fft. fft(u0) # коэффициенты Фурье начальной функции
          for i in np.arange(1,times,1):         
                   uf=uf*[(1-h*k) for k in k2]  #следующий временной шаг в пространстве Фурье      
                   u[i,:]=np.fft.ifft(uf).real  #до конца физического пространства
          X = np.zeros([times,n])# подготовка данных координаты х для поверхности
          for i in np.arange(0,times,1):
                   X[i:]=x
          T = np.zeros([times,n])# подготовка данных координаты t для поверхности
          for i in np.arange(0,times,1):
                   T[i:]=[h*i for r in np.arange(0,n)]
          fig = pylab.figure()
          axes = Axes3D(fig)
          axes.plot_surface(X, T, u)
          pylab.show()       
          


          Результат




          Вывод


          В статье приведена попытка классификации по областям применения методов преобразования Фурье.

          Ссылки


          1. Математика на пальцах: давайте посчитаем хотя бы один ряд Фурье в уме.
          2. Простыми словами о преобразовании Фурье.
          3. Спектральный анализ сигналов нелинейных звеньев АСУ на Python.
          4. Математика в Python: Преобразование Фурье.
          5. Спектральный метод на примере простых задач матфизики.
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/338704/


          Метки:  

          «Открытое Воскресенье» на партнерском семинаре «1С»

          Понедельник, 25 Сентября 2017 г. 18:42 + в цитатник
          PeterG сегодня в 18:42 Управление

          «Открытое Воскресенье» на партнерском семинаре «1С»

            Стало уже доброй традицией организовывать «Открытое воскресенье» в рамках осеннего партнерского семинара «1С». В этот день мероприятие могут посетить все, кому интересны наши технологии и решения. В этом году мы также будем ждать всех желающих, зарегистрировавшихся на мероприятие, 1 октября в концертном зале гостиницы «Космос» (Москва, проспект Мира, дом 150).

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

            image

            В этом году мы планируем включить в программу «Открытого воскресенья» следующие секции и мероприятия (финальная программа будет доступна на странице регистрации на «Открытое воскресенье» по ссылке ниже):
            • Развитие технологической платформы «1С: Предприятие 8», в частности:
                 Развитие работы 1С: Предприятия на мобильных устройствах
                 Развитие 1C:EnterpriseDevelopment Tools
                 Развитие механизма расширений
                 Масштабируемость и производительность платформы 1С: Предприятие
            • Мобильные приложения на платформе 1С
            • «Облачный альянс» совместных SaaS-предприятий 1С
            • Отражение изменений законодательства
            • 1С:ERP Управление предприятием
            • Развитие редакции 3.0 конфигурации «Бухгалтерия предприятия»
            • Развитие 1С: Документооборота
            • Решения по расчету зарплаты и кадровому учету
            • «Зарплата и управление персоналом 8» для корпоративных клиентов
            • 1С: Управление нашей фирмой 8
            • 1C: Управление холдингом
            • Учет и автоматизация для государственных и муниципальных учреждений
            • Успешные внедрения в госсекторе
            • Автоматизация оптовой и розничной торговли
            • Новое в отраслевых и специализированных решениях для бизнеса
            • 1С: Система менеджмента качества
            • Открытое совещание партнеров сети 1С: БухОбслуживание

            Также участники «Открытого воскресенья» могут посетить вернисаж программных продуктов линейки «1С: Предприятие» и лично пообщаться с разработчиками платформы и типовых конфигураций.

            Стоимость участия:
            • Участник с сертификатом 1С: Специалист — 6 600 руб.
            • Участник с сертификатом 1С: Профессионал — 7 000 руб.
            • Сотрудник клиента, имеющего зарегистрированный в фирме «1С» продукт «1С: Предприятие 8» — 7 500 руб.
            • Участник без особого статуса – 8 000 руб.


            Условия участия и регистрация здесь.
            Original source: habrahabr.ru (comments, light).

            https://habrahabr.ru/post/338702/


            Метки:  

            Своя система сборки на Linux

            Понедельник, 25 Сентября 2017 г. 18:19 + в цитатник
            Ryder95 сегодня в 18:19 Разработка

            Своя система сборки на Linux

              image

              Здравствуйте! Я давно не появлялся здесь в качестве оратора, но в этот раз я решил поделится кое-чем, что сделал сам, а также узнать — нужно это, не нужно, как можно доработать и вообще услышать любые отзывы о моих деяниях.

              Мотивация



              Проблема сборки и запуска проекта на разных машинах преследовала меня всегда. Для того, чтобы реалистично смоделировать работу разрабатываемого сайта на локальной машине нужно установить Web-сервер, Application-сервер, возможно, к ним присоединится какой-нибудь ещё промежуточный сервер, установить базу данных, настроить базу данных. Для того, чтобы установить тестовый сайт на тестовый сервер, нужно проделать такую же работу. И позже тоже самое с рабочим сервером.
              Кажется, что проблема решается легко — напиши все команды в файл и просто запускай его везде. Решение относительно хорошее, но не идеальное, и вот почему. К примеру, на одном из серверов уже установлены нужные пакеты и база данных там готова. Но не до конца, к ней не применены последние миграции. Придётся открывать файл с командами и вытаскивать оттуда нужные, дабы не получить ошибку или чтобы что-то не сломать.

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

              Решение пришло само — нужна автоматизация, сборщик проектов. Конечно же, на Linux. Погуглив, я нашёл уйму сборщиков проектов… Для одного языка или одной технологии. Ничего действительно универсального, чтобы прописал команды — и он их по надобности запускает — нет. Есть cmake, но его я не взял, потому что придумал решение получше)

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

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

              Результат



              Итоговым рабочим вариантом получился bash скрипт в 400 строк, который я назвал xGod. Я так его назвал, потому что этот файл стал незаменим для меня при работе, как воздух.
              Как работает xGod:
              Запускается из консоли — bash ./xgod build.xg run
              build.xg — это файл сборки, в котором прописаны все цели и дополнительные функции
              run — это цель, которую нужно выполнить

              Из чего состоит build.xg:
              1. Из обычных строк на языке bash — они выполняются последовательно по мере считывания файла
              2. Из целей
              Например:
              target syncdb: virtualenv createmysqluser
              	source "$projectpath/venv/bin/activate"
              	python3 "$projectpath/manage.py" makemigrations
              	python3 "$projectpath/manage.py" migrate
              	deactivate

              syncdb — название цели; virtualenv createmysqluser — это цели, которые надо выполнить до выполнения цели syncdb, так называемые зависимости; всё остальное — это обычный bash код, которым и достигает саму цель.
              3. Пакеты:
              Например:
              package gunicorn: python
              	all:
              		name: python3-gunicorn

              gunicorn — название пакета (или цели, потому что для скрипта это такая же цель); python — зависимость; all — это название дистрибутива, к которому применяются вложенные настройки, all означает, что данные настройки применяются ко всем дистрибутивам без исключения, в данный момент реализована поддержка только debian и ubuntu, потому что с другими я не работал; name — это название пакета, используемое для установки.
              4. Функции проверки:
              Например:
              check syncdb()
              	# any code
              	return 1 # or return 0
              endcheck

              Функция проверки позволяет проверить, нужно ли выполнять цель syncdb или нет. Сохраняется и выполняется она как обычная функция, возвращает 1 (если цель надо выполнять) или 0 (если цель не надо выполнять)

              Также была написана система поддержки расширений. Цели package как раз-таки являются расширениями. Синтаксис расширений не сильно отличается от синтаксиса файлов сборки, в нём могут присутствовать:
              1. Обычные команды на языке bash
              2. Обязательно функция действия.
              Например:
              action
              	# any code with $1
              endaction

              Это функция принимает на вход имя цели и выполняет её по своим правилам. Все внутренности цели она может получить из переменной ${TARGETS[$1]}
              3. Функция проверки цели
              Например:
              check
              	# any code with $1
              	return 1 # or return 0
              endcheck


              Ещё применения



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

              В следствии такого применения скрипта его главным условием было — это минимальные зависимости для запуска. Поэтому вместо Python или C++ он написан на bash — чтобы его можно было запустить из любой среды Linux без дополнительных действий. Единственный минус — bash должен быть не меньше 4 версии, так как там ассоциативные массивы не поддерживаются.

              Также получает на вход имя цели и проверяет, нужно ли её выполнять. Если нужно, то обязана вернуть 1, а если нет, то 0

              Ссылку на код оставлю здесь
              Original source: habrahabr.ru (comments, light).

              https://habrahabr.ru/post/338698/


              Метки:  

              [Из песочницы] Метод гарантирования доверия в блокчейнах

              Понедельник, 25 Сентября 2017 г. 18:02 + в цитатник
              AlexeyVPolunin вчера в 18:02 Разработка

              Метод гарантирования доверия в блокчейнах

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

              Консенсус как ахиллесова пята блокчейна


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

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

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

              Реальность такова, что в упомянутой системе Биткоин осталось лишь небольшое число игроков, формирующих консенсус. По данным сайта Blockchain.info легко в этом убедиться.

              Текущие данные по распределению вычислительных мощностей доступны по ссылке blockchain.info/pools. Как видим, реальное число игроков не превышает двух десятков, а доминирует всего 5-6. В случае Биткоина, более 80% вычислительных ресурсов сосредоточено в одной всем известной азиатской стране.

              Такая ситуация открывает далеко не гипотетическую возможность манипуляций с блокчейном в интересах некоторой группы лиц. Но не только Биткоин, все текущие реализации информационных систем на основе блокчейна в той или иной мере страдают этим недостатком. Существующие и вновь предлагаемые методы доверия, такие как PoW, PoS, DPoS, PoA, PoB, PoC и т.п., тоже не избавлены от подобных проблем. Порой манипуляции «освящаются» большой частью пользователей системы, как это было в примере с откатом в Эфириуме для восстановления справедливости после кражи монет в крупном масштабе. Это не только привело к форку со стороны недовольных, но так же поставило под сомнение использование Эфириума как среды для смарт-контрактов. Лично я не рискнул бы полагаться на этот блокчейн для подтверждения, например, своих прав на квартиру или земельный участок.

              Риски подмены данных


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

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

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

              Возникает закономерный вопрос: можно ли обеспечить гарантированный уровень доверия без использования избыточных вычислительных мощностей и в условиях реальной централизации при создании цепочки блоков?

              Круговая порука как разновидность консенсуса


              Такой способ есть, он заключается в изменении принципа консенсуса. В настоящее время консенсус в блокчейне отдельной информационной системе является внутренним процессом.
              А если заменить внутренний консенсус на внешний? Точнее не консенсус в первоначальном смысле, а шире, делегировать подтверждение доверия в другие информационные системы. Иными словами, отдельные и независимые друг от друга блокчейны добровольно обмениваются значениями хэшей текущих сформированных блоков. Полученные хэши могут размещаться в блоках в виде особых записей, особых транзакций. Это не потребует коренной перестройки алгоритмов работы блокчейн-систем, но позволит гарантировать доверие по принципу all-round bail. В вольном русском переводе это звучит как «круговая порука».



              Такой добровольный обмен хэшами решает ряд проблем.

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

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

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

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

              Близкими аналогами предлагаемого метода является система с permissioned blockchain (дочерними, зависимыми блокчейнами) в Эфириуме, а так же Exonum компании Bitfury Group.

              Пример решения на принципе «круговой поруки»


              Упомянутое решение по взаимному обмену хэшами между различными цепочками блокчейнов было разработано в рамках реализации проекта Business Trust Rating System. Проект еще не завершен, но на описанную выше ключевую технологию решения подана патентная заявка. Одновременно с упомянутым проектом ведутся работы над некоммерческим проектом, позволяющим обеспечить асинхронный обмен хешами между независимыми блокчейнами и создать механизм проверки доверия к любому блокчейну любым желающим.

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



              Такая схема вполне возможна, но она имеет ряд ограничений.

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

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

              В-третьих, не совсем очевиден процесс контроля за достоверностью данных со стороны пользователя.

              Независимый центр обмена (DLT Trust) в виде некоммерческой и общественной организации способен нивелировать указанные проблемы. Принцип его работы достаточно прост. Какой-нибудь блокчейн A после формирования очередного блока отсылает его хэш в данный центр обмена и в ответ получает актуальные хэши других блокчейнов (B и C) на текущий момент. Полученные хэши блокчейн записывает в очередной блок в виде специальной транзакции. Таким образом, достигается распределенное хранение хэшей, продублированное по числу участников обмена.

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



              Механизм проверки достоверности хэша любого блока любого блокчейна прозрачен для пользователя, желающего удостоверится в неизменности данных в конкретном блоке. Для этого он отправляет запрос в систему DLT Trust, содержащий атрибуты интересующего его блока. Система по указанным атрибутам ищет подтверждение значения хэша выбранного блока в соответствующих блоках других блокчейнов. Если все совпадает, то пользователь получает сообщение о неизменности ранее записанных данных.

              Указанный механизм способен выявить факт подмены данных, например, в блокчейнах, формируемых без внутреннего консенсуса или в условиях ограниченного внутреннего консенсуса. Владелец такого блокчейна обладает возможностью изменить интересующую его запись и заново перестроить блокчейн, начиная с измененного блока для сохранения целостность цепочки, но уже с новыми значениями. Наличие копий хэшей предыдущего варианта блокчейна во множестве независимых других блокчейнах делает эту операцию бессмысленной. Достаточно одного факта несовпадения, чтобы пользователи навсегда утратили доверие к такой информационной системе.
              Original source: habrahabr.ru (comments, light).

              https://habrahabr.ru/post/338696/


              Ускоряем разработку с помощью интерактивных блоксхем

              Понедельник, 25 Сентября 2017 г. 17:11 + в цитатник
              andreiselin сегодня в 17:11 Разработка

              Ускоряем разработку с помощью интерактивных блоксхем

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

                • Логики – это программисты с классическим флёром. Чтобы познакомиться с новой технологией они идут и читают документацию. Четкость кода – повышенная, ни шага влево, ни шага вправо. От забора и до обеда. Непритязательность к удобству работы с кодом пугает – кажется, что они могут работать и с минифицированным кодом, пользуясь одной только функцией поиска.
                • Визуалы – это люди, подходящие к коду более творчески, абстрактно. Чтобы изучить технологию они идут в youtube и смотрят видео про дельфинов уроки. В коде им важно разделение на осязаемые блоки, отсутствие простыней на 1000+ строк, возможность реализовать по-новому. Выполняя новую задачу они будут пристреливаться и искать свой вариант решения вместо поисков уже имеющегося на просторах интернета.

                Речь в этой статье пойдет об инструменте разработки, без которого я, как представитель второго типа, уже не мыслю разработку проектов размером больше 250 строк и который, я уверен, будет полезен нашим коллегам из классического типа – он сделан в сотрудничестве с одним из вас – восходящей звездой мира программирования Степаном! Итак!

                Aphs


                Или Application Graphs – это редактор блок-схем,
                где блоки – это редактируемые фрагменты кода.

                Если в двух словах, это npm-модуль, позволяющий вам, работая над функционалом, код и контекст которого разбросан между несколькими файлами, объединить его на одном экране – без листания 1000-строчных исходников, постоянного переключения между файлами, поиска файлов в списках, удерживания всего в голове. Aphs решает проблему скорости и комплексности.



                Честно говоря, я удивлен и недоумеваю, почему за всю историю программирования не было придумано ничего подобного – в течение года я вопрошал о чем-либо подобном у своих друзей разного уровня программистской злости и искал сам. Даже в суперудобном WebStorm если вы хотите скорости переключения между файлами – все что вам могут предложить это сделать для каждой задачи отдельный Favorites Folder, переключаясь между файлами в котором, вам надо будет каждый раз тратить мозговой и временной ресурс на поиск нужной строчки. Сколько мучения в этих поисках строчки!

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

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

                Для такой ситуации Aphs будет полезен с двух сторон: во-первых, с уже объясненной – при складывании кода из разных файлов в одном месте и связывании блоков граф-связями разработка становится очевидней и быстрей, а для навигации по коду используется только механическая память (руки помнят куда паннить, где был тот или иной блок – справа вверху или слева внизу).
                Во-вторых, все случаи использования второй или четвертой функции можно вынести в отдельный логический контекст и вычистить их в рамках него.

                В чем еще может быть полезен Aphs:

                • Возвращаясь к тому или иному flow вы включаете нужный соответствующий контекст (граф) и все предстает перед вашими глазами без необходимости болезненно реконструировать всю картину этого flow в памяти. Снижается риск сломать что-то в другом месте пока вы разбираетесь в этом.
                • Как инструмент документации, не требующий подчас нудной писанины от изнуренного переключениями между файлами разработчика. Новый сотрудник, открыв тот или иной контекст, сразу увидит, что делается в начале execution flow и как это влияет на то, что происходит в конце.
                • Начало работы над заданием с организации нового flow для нее – это легкий психологический шаг первый шаг и база для быстрой работы. Как зарядка по утрам.

                У меня был большой соблазн написать этот текст не протестировав функционал в бою, но я удержался и могу сказать что уже пользуюсь им в двух проектах. Безусловно, для человека со стороны его использование будет менее прозрачно, поэтому я подготовил quickstart readme на гитхабе и собираюсь в следующей статье подробней описать все устройство проекта, а пока готов ответить на вопросы в комментариях.

                Уже сейчас вы можете использовать Aphs в любом проекте, организованном аналогично обычному фронтендному проекту: в корне проекта – папки src с вашими исходниками и node_modules, внутрь которого и устанавливается aphs, откуда и работает.

                По разработке стоят следующие первоочередные задачи:

                • Получить фидбек, понять насколько актуально, что понятно и что не понятно
                • Реализовать работу с множеством контекстов / flow (сейчас только один)
                • Сделать более юзерфрендли (множество мелочей вроде изменения имен идентификаторов блоков из клиента, а не в коде или исключения повторения идентификаторов и т.д.)

                Поэтому, если кто хочет пополнить резюме опенсорсами или сугубо для души – welcome!
                Серверная часть написана на NodeJS, клиент – на AngularJS.
                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/338524/


                Конкурс статей о программировании, дизайне и управлении с общим призовым фондом в 500 тысяч рублей

                Понедельник, 25 Сентября 2017 г. 16:58 + в цитатник
                blognetology сегодня в 16:58 Маркетинг

                Конкурс статей о программировании, дизайне и управлении с общим призовым фондом в 500 тысяч рублей

                  Мы в «Нетологии» запустили конкурс статей в пяти номинациях с общим призовым фондом в 500 000 рублей и полезными призами от партнеров: Яндекса, ESET, издательства Питер с подборкой книг O’Reilly, Icon8, Тильда, Sorge и т. д. Плюс победители получают билеты на крупнейшие конференции: White Nights, MBLT и MBLTdev, Design Prosmotr.



                  Интересно? Читайте дальше ->

                  Конкурс проходит в три этапа: прием работ, оценка жюри и читательское голосование по отобранным жюри работами. Прием работ — до 20 октября. Читательское голосование продлится с 13 ноября до 31 ноября этого года, а победителей огласим 1 декабря.

                  Жюри делится на две части: экспертное и редакторское. Редакторское оценивает сам текст, его форму и исполнение. Экспертное смотрит на наполнение, содержание, раскрытие темы.

                  В экспертном жюри статьи по программированию и разработке оценивают:

                  • направление «Программирование» — Андрей Ситник — ведущий разработчик в Evil Martians, создатель PostCSS.
                  • направление «Дизайн» — Алексей Бородкин — директор по продуктам в Notamedia, Глава Гильдии вольных проектировщиков.
                  • направление «Управление проектами» — Михаил Препелицкий — президент и основатель компании ONETRAK.

                  В редакторском жюри:


                  Призы от «Нетологии»:

                  • Победителям — 15 000 рублей или программу обучения на выбор.
                  • Вторым местам — скидку 50% на обучение или годовой доступ к библиотеке видеокурсов.
                  • Третьим местам — скидку 25% на обучение или полугодовой доступ к библиотеке видеокурсов.
                  • Все участники конкурса независимо от результатов получают месяц подписки на библиотеку видеокурсов Нетологии.

                  Призы от спонсоров и партнеров:
                  1. Годовой доступ к тарифу Personal Tilda — Tilda Publishing
                  2. Годовой доступ победителю, скидки призёрам — Яндекс.Трекер
                  3. Книги по теме категории каждому победителю — МИФ
                  4. Год онлайн-обучения английскому всем участникам — EnglishDom
                  5. Месяц бесплатных разговорных клубов трем призерам — EnglishDom
                  6. Книга «С первой фразы» всем участникам — Альпина Паблишер
                  7. Подборка книг каждому победителю — Альпина Паблишер
                  8. Три месяца подписки трем призерам — Rush Analytics
                  9. Доступ на год с 10 заданиями — StarComment
                  10. Два доступа на полгода — StarComment
                  11. 30 заданий на полгода лучшему кейсу — StarComment
                  12. Доступ победителю на 6 месяцев — Icon8
                  13. Доступ второму и третьему местам на 3 месяца — Icon8
                  14. Скидка 50% всем участникам — Icon8
                  15. Два билета на MBLT — e-legion
                  16. Два билета на MBLTdev — e-legion
                  17. Полгода максимального тарифа всем участникам — AmoCRM
                  18. Билет победителю Прага или Санкт-Петербург на выбор — WHITE NIGHTS
                  19. Скидка 50% на билет для второго места — WHITE NIGHTS
                  20. Подборка книг О'Reilly победителям категории «Программирование» — Питер
                  21. Антивирусный пакет ESET NOD32 на год шести призерам — ESET
                  22. Антивирусный пакет ESET NOD32 на полгода девятерым призерам — ESET
                  23. Полгода тарифа «ПРО» компании с лучшим кейсом — webasyst
                  24. Пакет «Агентство» на полгода троим призерам — Reportkey
                  25. Скидка 20% всем участникам конкурса — Reportkey
                  26. По две книги каждому участнику — ЛитРес
                  27. Подписка на год одному призеру — Sorge
                  28. Подписка на полгода двум призерам — Sorge
                  29. Доступ на полгода команде до 10 человек — Kaiten
                  30. Пакет «Premium» на год двум призерам — Церебро
                  31. Пакет «Plus» на год одному призеру — Церебро
                  32. Три годовых подписки на дизайнерский дайджест — Awdee
                  33. Интенсив по английскому языку в Москве — Свобода слова
                  34. Годовой абонемент в фитнес-зал — Alex Fitness
                  35. Два билета на мероприятие в Москве или Санкт-Петербурге — DesignProsmotr

                  Как поучаствовать?

                  1. Написать статью или отредактировать уже опубликованную, чтобы она соответствовала требованиям конкурса. Статья должна быть опубликована не раньше 20 августа 2017 года. Количество работ не ограничено, размещаться можно на любом ресурсе: Хабрахабр, собственный сайт, медиа. Если негде опубликоваться, напишите нам и мы либо выпустим статью у себя, либо поможем найти подходящую площадку.
                  2. Главное: в статье должны быть пометка «Для статейного конкурса «Нетологии». Ссылки на сайт конкурса и на блог Нетологии обязательны.
                  3. Расшарить готовую статью в любой из своих соцсетей с хештегом #конкурс_блога_Нетологии.
                  4. Заполнить заявку на участие.
                  5. Готово! Вы великолепны!

                  Для компаний есть отдельная номинация на лучший кейс. Главный приз — обучение пяти сотрудников компании бесплатно или годовой корпоративный доступ к библиотеке видеокурсов + специальные подарки от партнеров.

                  Положение о конкурсе и все подробности можно прочесть на лендинге. Никаких сложностей. Все предельно просто. Удачи!
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338688/


                  Метки:  

                  [recovery mode] Финальный релиз 3CX Call Flow Designer и курсы 3CX в Беларуси

                  Понедельник, 25 Сентября 2017 г. 15:56 + в цитатник
                  snezhko сегодня в 15:56 Администрирование

                  Финальный релиз 3CX Call Flow Designer и курсы 3CX в Беларуси

                  Представляем финальный релиз 3CX Call Flow Designer


                  На этой неделе мы выпустили финальную версию среды разработки голосовых приложений 3CX Call Flow Designer.

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



                  Новые компоненты


                  • Date Time Conditional – выполняет различные ветвления в голосовом приложении, в зависимости от даты и времени, причем и для определенных DID линий. При этом не требуется использование выражений C#.
                  • Authentication – запрашивает у абонента ID и PIN, обрабатывает основные ошибки ввода и проверяет введенные значения во внешнем источнике (базе) данных.
                  • Credit Card – запрашивает номер кредитной карты, срок действия, CVV код, обрабатывает основные ошибки ввода и проверяет введенные значения во внешнем источнике (базе) данных.
                  • Web Service REST – для работы с REST веб-запросами используя различные методы аутентификации.
                  • 3CX Get Extension Status – получает текущий статус (профиль) добавочного номера 3CX (включая возможные «наложения» политики профилей), а также проверяет, занят ли добавочный номер (пользователь) разговором или свободен.
                  • 3CX Get Queue Extensions – получает список добавочных номеров (операторов), подключенных к выбранной Очереди вызовов, а также их статусы: подключен / не подключен.
                  • Новая переменная сессии session.transferingExtension – передает номер Extension, с которого пошла переадресация вызова на голосовое приложение (если такой номер существует). Используется для перевода вызова обратно на добавочный номер, после завершения работы приложения.
                  • Новые функции для работы с длинными цифровыми аргументами: SUM_LONG, MULTIPLY_LONG, DIVIDE_LONG, NEGATIVE_LONG, ABS_LONG.
                  • Новые функции GET_LIST_ITEM_COUNT и GET_LIST_ITEM, для работы со списками, возвращаемыми новым компонентом 3CX Get Queue Extensions.


                  Загрузки и документация



                  Бесплатное обучение 3CX в Республике Беларусь


                  На этой неделе мы проведем замечательные учебные курсы по 3CX Phone System г. Минске, республика Беларусь! Курсы пройдут в среду-четверг 27-28 сентября 2017 года в гостинице «Беларусь». Обучение проводится на русском языке.



                  Курсы совершенно бесплатны для любого партнера 3CX. Заметим, что аналогичные курсы по VoIP-системам других вендоров стоят от нескольких сотен долларов за участника, а у нас еще и вкусный обед!

                  На тренинге полностью рассматриваются возможности системы, а также проводится подготовка к сдаче сертификационных экзаменов. Сертификация 3CX необходима для получения статуса Предпочтительного партнера (Preferred Partner) 3CX и размещения на сайте 3CX в разделе «Где купить».

                  Курсы 3CX состоят из двух частей: базовой и расширенной. Среди прочего рассматриваются:

                  • начальная установка АТС и клиентов 3CX
                  • настройка сетевых экранов
                  • обновление и восстановление системы
                  • добавочные номера, удаленные подключения
                  • безопасность VoIP

                  Информация о регистрации и подробное расписание:


                  Мы рекомендуем не медлить с регистрацией, т.к. количество мест ограничено.
                  До встречи в Минске!
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338676/


                  Machine Learning: State of the art

                  Понедельник, 25 Сентября 2017 г. 15:51 + в цитатник
                  varagian сегодня в 15:51 Разработка

                  Machine Learning: State of the art



                    В 2015 году в мир искусства вошло новое слово: «инцепционизм» (inceptionism). Машины научились перерисовывать картины, а уже в 2016 Prisma скачали миллионы людей. Сегодня мы поговорим об искусстве, машинном обучении и искусственном интеллекте с Иваном Ямщиковым, автором нашумевшей «Нейронной Обороны».

                    Знакомьтесь: Иван Ямщиков. Получил PhD по прикладной математике в Бранденбургском Технологическом университете (Котбус, Германия). В данный момент — научный сотрудник Института Макса Планка (Лейпциг, Германия) и аналитик/консультант Яндекса.

                    — Neurona, Нейронная оборона и Пианола — как началось столь серьезное увлечение творческим ИИ? В какой момент Вы решили действительно всерьез заниматься этой темой?

                    Иван Ямщиков:
                    Я бы не стал называть это серьезным увлечением творческим искусственным интеллектом. Просто однажды Алексей Тихонов поделился своими идеями по нейро-поэту, и летом 2016 мы вместе решили записать альбом «Нейронной обороны». С тех пор стало понятно, что область существенно шире, и сейчас я занимаюсь темой искусственного интеллекта на постоянной основе.

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

                    — Идея совместить матмодели и музыку/живопись не нова, но почему подход выстрелил именно сейчас?

                    Иван Ямщиков: Это пожалуй одна из моих любимых тем: когда в 90-е годы вы играли в шутеры, вы неосознанно помогали развитию ИИ.

                    Видеокарты (GPU) апргейдились для развития графических интерфейсов и игр, но в какой-то момент люди разобрались, что их можно использовать для параллельных вычислений, появилась CUDA. Изначально — в научной сфере в гидро-газодинамике, где ряд моделей можно хорошо обсчитывать на графической карте: подобный расчет на CPU вышел бы в несколько раз дороже. А через несколько лет выяснилось, что нейронные сети тоже отлично параллелизуются и обучаются с использованием графических карт. И этот бум развития научных вычислений позволил создавать нейронные сети таких размеров, которые раньше были недоступны.

                    Определенную роль также сыграли облачные вычисления: сейчас даже не обязательно покупать GPU, его можно взять в аренду; таким же образом можно арендовать нужное количество CPU. Это снизило порог вхождения, а в технологиях всегда так: когда порог ниже — результаты появляются существенно быстрее.

                    Что касается живописи, ключевая статья здесь: Neural Artistic Style, написанная исследователями из Тюбингина. В результате экспериментов выяснилось, что на одном из слоев нейронной сети собрались признаки, отвечающие за стиль (как нарисовано), а на другом — за семантику (что находится: содержание). Из этой статьи родилось известное приложение Prisma.

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

                    В целом работа с музыкой куда более прагматичная, чем с текстом: когда ты работаешь со словарем, то в основе его лежит one-hot encoding (все слова нумеруются, и i-ое слово — это вектор, где на i-ой позиции стоит 1, а не всех остальных — 0). После обработки набора документов получается пространство очень большой размерности. Далее размерность искусственно снижается с помощью ряда методов, например, word2vec (https://ru.wikipedia.org/wiki/Word2vec; https://habrahabr.ru/post/249215/).

                    Так или иначе, мы говорим о пространстве размерности в несколько сотен, а не трех- или четырех-мерном. Обычно с пространством такой размерности тяжело работать: одни области имеют высокую плотность данных, а другие, наоборот, слишком разреженные — структура пqолучатся очень сложной. А если мы говорим о музыке и берем ноты, то каждая нота — это комбинация октавы и ноты; 12 нот (с диезами/бемолями) в октаве и 4-5 октав. И с этой точки зрения у этого пространства куда более низкая размерность.

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

                    — С чего лучше всего начать техническому человеку знакомство с творческим ИИ, есть по этой теме хорошие ресурсы, курсы, лекции?

                    Иван Ямщиков: Будем есть слона по частям. Первое, нейронные сети != искусственный интеллект. С другой стороны, НС — одна из самых популярных тем, и по ней доступно достаточно много материалов. По ИИ и машинному обучению курсы и материалы тоже есть. Перечислим основные, русскоязычные: совместный курс Вышки и Яндекса, курс Воронцова по машинному обучению, курс Ветрова по байесовым методам, курс Лемпицкого по глубокому обучению, англоязычные: курсы на Udacity (в том числе и по TensorFlow), на Coursera.

                    Курсов по творческому ИИ как таковому еще нет — сама тема лежит на пересечении науки и искусства; и большинство вопросов тут, на стыке, открытые.

                    Что действительно рекомендую посмотреть и на что потратить время — так это на курсы по машинному обучению (cм. выше), в том числе и глубокому.

                    — Многие люди, говорят, что современные методы машинного обучения всего лишь копируют куски из уже созданных произведений и комбинируют их согласно найденным канонам, было ли что-то такое, что действительно удивило Вас в произведениях, созданных ИИ?

                    Иван Ямщиков: В целом это конечно разумная и оправданная критика, но у меня на нее есть два контраргумента: технический и философский.

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

                    С философской стороны: постмодернист делает то же самое. И если мы живем в эпоху постмодернизма, то фактически любой автор в некотором смысле копирует, имитирует или вдохновляется опытом. И в целом если рассмотреть проблему обучения (конечно, не для всего есть полностью формализованный мат-аппарат), то это преобразование потока информации в знания. А знания — это отфильтрованная,  организованная и ранжированная определенным образом информация. И если посмотреть глубже, то в общем суть любого обучения, в том числе и человеческого — в основе лежит опыт, скомбинированный и преобразованный. И кажется, что получилось что-то новое, но в реальности оно вытекает из комбинации опыта, полученного ранее.

                    Что касается удививших вещей. У меня есть любимая строчка из Нейроны (Neurona): «The God who’s always welcome to Iraq.» (Бог, которому всегда рады в Ираке) — совершенно неожиданная строчка.

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

                    — Продолжая предыдущий вопрос: в матче AlphaGo vs. Le Sedol AlphaGo сыграла на 5-ой линии — ход, который бы ни один человек не сделал (что вызвало бурю в ГО сообществе) — какие есть примеры в созданных произведениях чего-то явно не присущего человеческому стилю?

                    Иван Ямщиков: Человеку доступен огромный массив данных: тактильные и вкусовые ощущения, запахи, и многие другие. И это огромный опыт, доступный человеку, в некотором смысле определяет сознание. У машин такого объема нет и, соответственно, их бытие куда менее разнообразное и интересное, чем у человека. Как результат тексты, написанные машиной, радикально отличаются от написанных человеком.

                    Фундаментальные вопросы здесь: поняли ли мы принцип, по-которому человек создает тексты. И тут в научном сообществе нет однозначного и четкого ответа. Задача о генерации дискретных последовательностей, будь то текст или музыка, — это открытый вопрос, на самой границе научного знания, и над ним бьются сейчас разные люди по всему миру.

                    — Ряд технических экспертов называет одной из проблем оценки работы творческого ИИ отсутствие объективных критериев качества работы: а как вообще люди оценивают качество сгенерированной музыки и нарисованных с помощью нейросетей картин?

                    Иван Ямщиков:
                    Мне очень нравится этот вопрос, и если у вас есть идеи: приходите, пишите — вместе напишем статью. Я не шучу.

                    Сейчас рабочий критерий проверки качества основан на коллективной оценке людьми. Нейронную оборону прослушали 400 тысяч человек в первую неделю, и на основе распределения оценок и комментариев можно оценить, сильно ли это понравилось людям и насколько похожим это получилось.

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


                    — Чрезвычайно интересно, как именно были сгенерированы тексты Нейронной обороны? Можно ли интуитивно рассказать о мат-аппарате генератора?

                    Иван Ямщиков:
                    Сотрудник Яндекса Юрий Зеленков разработал ряд поэтических эвристик, оценивающих ритм и рифму в русском языке. Мы использовали комбинацию этих эвристик и LSTM-сеть (Long Short Term Memory: https://habrahabr.ru/company/wunderfund/blog/331310/), которая прочитала массив русской поэзии: ей подавалась пара <стихи, автор>, причем в массиве данных была вся русская поэззия, которую мы могли найти, то есть условно от Пушкина и до наших дней, включая русский рок и эстраду. Однако даже этого количества данных было недостаточно, и мы давали машине читать каждый текст в случайном порядке — так чтобы каждое стихотворение было прочитано раз 10. Это позволило существенно увеличить объем данных и значительно повысило качество.

                    Дальше на вход подаем автора и говорим «давай как этот автор». И мы подали на вход Егора Летова. Подробнее я расскажу об этом на конференции SmartData 2017, где раскрою много деталей.

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

                    — ИИ уже играет в покер и ГО, перерисовывает картины и видео, пишет музыку и стихи: что же дальше? Какая следующая непокоренная вершина для творческого ИИ?

                    Иван Ямщиков: Уже есть и короткометражка, снятая по сюжету, созданному RNN. К сожалению, она довольно посредственная. Люди пока еще не умеют «объяснять» нейросети концепцию сюжета.

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

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

                    Например, когда ты слушаешь музыку, а она звучит как живой концерт и с певцом/группой/музыкой можно взаимодействовать. Простой пример: Яндекс.Музыка или Spotify могут подстраивать ритм и музыку под настроение или специально подбирать треки для, к примеру, занятия спортом.

                    Если вспомнить живые фотографии от Apple — это по сути несколько вариантов кадра. Соответственно, можно предположить, что когда музыкант будет записывать альбом, он в некоторым смысле запишет несколько версий или вариаций композиции в некоторых границах. И тогда трек сможет подстраиваться под настроение слушателя, ориентируясь на какие-то внешние данные.  Аналогия здесь довольно простая — если сесть с друзьями и исполнить песню под гитару, то в зависимости от настроения одна и та же песня выйдет по-разному, но это будет одна и та же песня. Я уверен, что что-то похожее можно уже сейчас реализовать технологически и в музыке.

                    — Сейчас одна из самых популярных тем для обсуждения — это работа в паре машина + человек, такие игры проводятся на шахматных и ГО турнирах. Есть ли какие-то интересные примеры работы в паре человек + машина в искусстве?

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

                    Есть такая когнитивная ловушка: когда мы говорим про искусственный интеллект, мы думаем, что он будет похож на человеческий — то есть как наш, только больше!

                    К примеру, когда в начале XIX века фантасты пытались придумать будущее, в нем был гигантский дирижабль, а не самолет. В целом, человек легко предугадывает количественные изменения, но с трудом может представить себе качественные. Несложно вообразить, что все будет быстрее, дешевле, больше (меньше)…  А вот скачки технологий предугадываются плохо. И мне кажется, что то же самое происходит сейчас с искусственным интеллектом.

                    Но качественный (а не только количественный) прорыв уже сейчас происходит в приложениях и работах, связанных с понимаем того, что же человек хочет: что ищет, собирается купить. А на базе генерации текстов мы сможем сделать принципиально иные методы коммуникации с человеком. Человек сможет использовать новые инструменты по мере их появления. Например, у программиста появятся умные помощники написания кода, для художника это может быть система по подбору красок, а для композитора — система, дающая вдохновение и помогающая правильно передать эмоции в произведении.



                    Если темы машинного обучения вам близки так же, как и нам, хотим обратить ваше внимание на ряд ключевых докладов на грядущей конференции SmartData 2017, которая пройдет 21 октября в Санкт-Петербурге:

                    Original source: habrahabr.ru (comments, light).

                    https://habrahabr.ru/post/338654/


                    Метки:  

                    Сети для самых матёрых. Часть тринадцатая. MPLS Traffic Engineering

                    Понедельник, 25 Сентября 2017 г. 15:31 + в цитатник
                    eucariot сегодня в 15:31 Администрирование

                    Сети для самых матёрых. Часть тринадцатая. MPLS Traffic Engineering

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

                    Однако сеть linkmeup выросла до размеров федерального оператора. Возможность управления трафиком и быстрого восстановления сервисов стали очень важным требованием в MPLS-сети.
                    Пора внедрять Traffic Engineering.



                    Содержание выпуска:
                    • Предпосылки появления MPLS TE
                    • Принципы работы MPLS TE
                    • Способы направления трафика в TE-туннели
                    • Способы управления туннелями

                      • Метрики
                      • Ограничения по полосе пропускания
                      • Приоритеты туннелей
                      • Explicit-Path
                      • SRLG
                      • Affinity и Attribute-Flag

                    • Обеспечение надёжности и сходимость

                      • Path Protection
                      • Local Protection — Fast ReRoute
                    • MPLS QoS

                      • MPLS TE IntServ
                      • MPLS TE DiffServ
                      • Режимы работы MPLS QoS
                    • Упрощение настройки туннелей
                    • Заключение
                    • Полезные ссылки




                    Зачем вообще может понадобиться инжиниринг трафика?


                    Приведу простой пример.
                    Конвергентная сеть мобильного оператора.



                    Два типа трафика:

                    • Мобильный
                    • ШПД

                    Левое плечо — широкий оптический канал 10G. Правое — резерв через арендованную линию — 1G.
                    Общий объём трафика — 2,5 Гб/с, мобильного: 800 Мб/с.
                    В случае разрыва основного канала, нужно переключить на резервный только мобильный трафик и сделать это за 50мс.

                    Подумайте, можем ли мы сделать это стандартными средствами? Разделить трафик разных сервисов разными VPN, безусловно, можем, но направить разными маршрутами — нет.

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

                    Кроме того, скорость сходимости OSPF или ISIS даже при использовании BFD исчисляется десятками мс, но после этого ещё и транспортные LSP должны перестроиться. В наши дни это уже не пройдёт незамеченным для абонентов.

                    Принципы работы MPLS Traffic Engineering


                    Какие же функции по управлению трафиком предоставляет MPLS Traffic Engineering?

                    • Расширяет возможности стандартных IGP, позволяя маршрутизировать трафик разных классов разными способами.
                    • Передаёт трафик через сеть, используя коммутацию MPLS, что означает поддержку всяческих VPNов.
                    • При построении маршрута учитывает заданные ограничения, например, какие ресурсы необходимы этому классу трафика и сколько их доступно на всех узлах и линиях по пути, или по каким линиям нельзя строить туннели.
                    • Быстрое перестроение путей в соответствии с требованиями в случае аварии.
                    • Периодическая оптимизация путей.

                    Базовые механизмы работы MPLS TE были рассмотрены в выпуске СДСМ 10, куда я вас и шлю за подробным рассмотрением. А здесь приведу лишь короткую сводку.



                    Data Plane


                    С точки зрения передачи данных TE несколько отличается от LDP. Жирным выделены отличия:

                    1. В TE-туннель трафик нужно поместить насильно, тогда как в LDP он попадает автоматически
                      Juniper здесь — исключение.
                    2. Первый маршрутизатор навешивает внешнюю MPLS-метку (PUSH LABEL)
                    3. Транзитные маршрутизаторы смотрят на какой интерфейс поступил пакет и значение метки и, поменяв её на новую согласно таблице меток, отправляют её в выходной интерфейс (SWAP LABEL)
                    4. Предпоследний маршрутизатор снимает транспортную метку (POP LABEL, PHP — зависит от реализации и настроек)
                    5. В случае обрыва на пути трафик можно спасти путём перенаправления пакетов в заранее подготовленный туннель.



                    Control Plane


                    А вот в плане управления отличия гораздо более значительные. C ними всю оставшуюся дорогу и будем разбираться.

                    Терминология

                    LSPLabel Switched Path — вообще говоря, любой путь через сеть MPLS, но порой подразумевают LDP LSP. Однако мы не будем столь категоричны — при необходимости я буду указывать, что имею в виду именно LDP LSP.
                    RSVP LSP — соответственно LSP, построенный с помощью RSVP TE с учётом наложенных ограничений. Может также иногда называться CR-LSP — ConstRaint-based LSP.
                    Туннелем мы будем называть один или несколько MPLS LSP, соединяющих два LSR-маршрутизатора. Метка MPLS — это по сути туннельная инкапсуляция.
                    В случае LDP — каждый LSP — это отдельный туннель.
                    В случае RSVP туннель может состоять из одного или нескольких LSP: основной, резервный, best-effort, временный.
                    Говоря TE-туннель, мы будем подразумевать уже конкретно MPLS Traffic Engineering туннель, построенный RSVP-TE.
                    TEDBTraffic Engineering Data Base — тот же LSDB протоколов IS-IS/OSPF, но с учётом ресурсов сети, которые интересны модулю TE.
                    CSPFConstrained Shortest Path First — расширение алгоритма SPF, которое ищет кратчайший путь с учётом наложенных ограничений.
                    Итак, MPLS TE хочет строить LSP с учётом требуемых ресурсов и пожеланий оператора, поэтому столь простой LDP с его лучшим маршрутом тут не у дел.

                    И его место занимает RSVP-TE — наследник отвергнутого стеком TCP/IP протокола RSVP.
                    TE работает в тесном симбиозе с IGP. Хотя правильнее это называть паразитизмом. Он вынуждает их (OSPF или IS-IS) служить себе: переносить нужную ему информацию и тем самым наполнять TEDB.

                    Процесс выглядит следующим образом:

                    1. IGP собирает со всей сети информацию:
                      — о линиях и сетях,
                      — о метриках,
                      — о доступных ресурсах,
                      — о характеристиках линий.
                      И заполняет TEDB, где всё это отражено.
                    2. Когда RSVP-TE хочет построить LSP до какого-то узла, он просто обращается к CSPF и говорит: «Хочу кратчайший маршрут до точки G с вот этими ограничениями». Ограничения могут быть следующими:
                      — требуемая полоса пропускания,
                      — определённый путь или линии,
                      — характеристики линии.
                    3. Из запроса RSVP-TE CSPF берёт ограничения, а из TEDB — реальную информацию о сети. И выдаёт маршрут… или не выдаёт, если ограничения удовлетворить не удалось.
                    4. Когда маршрут получен, RSVP-TE отправляет RSVP PATH в эту точку G с запросом на резервирование ресурсов.
                    5. А точка G возвращает RSVP RESV — так резервируются ресурсы на всём пути. И если RESV вернулся с хорошими новостями, RSVP LSP/туннель поднимается.

                    Всё это подробно и в красках в статье СДСМ10. А ещё там же самый простой пример на практике.

                    Далее мы будем ходить вокруг да около вот этой схемы:



                    У нас есть L3VPN-клиент, офисы которого подключены к Linkmeup_R1 и Linkmeup_R4.



                    Способы направления трафика в TE-туннель


                    В отличие от LDP LSP, по которым трафик бежит по умолчанию и так, в TE-туннели трафик нам нужно направить.

                    И есть для этого следующие способы:

                    1. Статический маршрут
                    2. PBR
                    3. IGP Shortcut
                    4. Tunnel-policy*
                    5. Или всё-таки автоматом в туннель попадёт?*

                    Статический маршрут


                    Самый простой в понимании и самый сложный в обслуживании способ.

                    Linkmeup_R1(config) ip route 4.4.4.4 255.255.255.255 Tunnel 4

                    PBR


                    По сути тот же статический маршрут.

                    Linkmeup_R1(config) ip access-list extended lennut
                    Linkmeup_R1(config-ext-nacl)) permit ip 172.16.0.0 0.0.0.255 172.16.1.0 0.0.0.255
                    
                    Linkmeup_R1(config) route-map lennut permit 10
                    Linkmeup_R1(configconfig-route-map) match ip address lennut
                    Linkmeup_R1(config-route-map) set interface Tunnel4
                    
                    Linkmeup_R1(config) interface Ethernet0/3
                    Linkmeup_R1(config-if) ip policy route-map lennut

                    IGP Shortcut


                    Этот способ наиболее распространённый и поддерживается почти всеми производителями.
                    Маршрутизатор рассматривает туннель, как виртуальный интерфейс. И через этот интерфейс удалённые маршрутизаторы словно бы непосредственно подключены к локальному, а не находятся в десятках хопов. Этакая телекоммуникационная червоточина. Она и называется — shortcut — сокращённый путь.


                    Червоточина Фламма

                    Но протоколы IGP по умолчанию не хотят этого видеть и используют для отправки трафика физический интерфейс.

                    С помощью IGP Shortcut (в цисконародье AutoRoute Announce) мы вынуждаем протокол маршрутизации на Ingress LSR рассматривать туннель как обычную линию — Egress LSR будто бы подключен непосредственно. А соответственно и все сети, находящиеся за Egress LSR, будут доступны через туннель.

                    Таким образом всё, чьей точкой назначения является этот маршрутизатор, или узлы за ним, будет отправлено в туннель. В том числе и VPN-пакеты.



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

                    Метрика туннеля


                    Во-первых, есть два типа метрик:

                    Метрика IGP — хорошо известная нам из курса базовой маршрутизации метрика интерфейсов.
                    Метрика TE — та метрика, которая будет использована при расчёте метрики TE-туннеля.

                    • По умолчанию, TE=IGP.
                    • По умолчанию, используется TE.
                    • По умолчанию, метрика туннеля равна сумме TE-метрик всех линий от Ingress до Egress по кратчайшему IP-пути (а не по тому, по которому туннель идёт). То есть метрики обычных IP-маршрутов и маршрутов через туннель будут одинаковыми, даже если туннель фактически намного длиннее.
                      Почему выбирается по кратчайшему пути? Логично, чтобы метрика туннеля должна перебить метрику лучшего IP-пути.
                    • При равенстве метрик маршрутизатор выберет именно туннель, поскольку IGP shortcut именно это и подразумевает.
                      Если есть IP-пути, которые не имеют общих сегментов с туннельным LSP, и при этом их метрики равны, будет иметь место балансировка.

                    Во-вторых, у нас есть следующие способы управления метрикой туннеля:

                    1. Изменить значение метрики TE на физических интерфейсах.
                    2. Указать MPLS TE использовать IGP метрику вместо TE.
                    3. Соответственно, изменить IGP метрику физического интерфейса.
                    4. Настроить непосредственно метрику туннельного интерфейса:

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










                    Ну и вообще рекомендую ресурс: labminutes.com/video/sp

                    Forwarding adjacencies


                    Forwarding adjacencies — штука сходной c IGP Shortcut природы с той лишь (существенной) разницей, что туннель теперь будет анонсироваться Ingress LSR IGP-соседям, как обычный линк. Соответственно, все окружающие маршрутизаторы будут учитывать его в своих расчётах SPF.

                    IGP Shortcut же влияет только на таблицу маршрутизации на Ingress LSR, и окружающие соседи про этот туннель не знают.

                    Tunnel-policy*


                    *Этот способ зависит от производителя — у кого-то есть, у кого-то нет.
                    Tunnel-policy применяется для перенаправления исключительно трафика VPN в туннели.
                    То есть в режиме настройки VPN (не важно, L2 или L3) указывается какой туннель должен быть использован.

                    Существует две возможности:

                    1. Tunnel binding mode. В зависимости от Egress PE выбирать конкретный туннель. Применимо только к RSVP LSP.
                    2. Select-Seq mode. Тунель будет выбираться в порядке, указанном в конфигурации. Это может быть TE-туннель, LDP-туннель, с балансировкой или без.

                    Особенности Juniper


                    У джуна зачастую свой подход (ещё сегодня в этом убедитесь). Так у него существует несколько таблиц маршрутизации:

                    1. IP routing table (inet.0)
                    2. MPLS routing table (inet.3)
                    3. MPLS forwarding table (mpls.0).

                    При помещении VPN-маршрутов в таблицу IP-маршрутизации BGP сверяется с таблицей MPLS inet.3. Если в ней он находит LSP до Next Hop'а маршрутра VPN, то автоматически трафик загоняется в этот LSP. Никаких дополнительных действий не требуется.

                    Это в некотором смысле похоже на микс Tunnel-Policy и IGP Shortcut, только автоматически.



                    Практика


                    Всё та же сеть, но с ограничениями по пропускной способности.



                    Нам нужно обеспечить L3VPN клиенту.
                    У клиента есть требования: 8 Мб/с. Вынь да положь.
                    Направляем трафик в туннель через Auto-Route.
                    В лаборатории ограничение интерфейса — 10000 кб/с. Поэтому при задании требований туннеля и доступных полос, отталкиваемся исключительно от этой цифры.
                    Поехали!

                    Итак, начнём с того, что никакого LDP — только RSVP-TE. То есть LSP нет, пока мы не настроим туннель.

                    Хоть мы всё это уже и делали в прошлый раз, но начнём настройку сначала.

                    1. Базовая конфигурация уже имеется (IP+IGP)
                      Файл конфигурации.
                    2. Включаем возможности TE

                      Linkmeup_R1(config) mpls traffic-eng tunnels 

                      И заодно на всех интерфейсах сразу настроим ограничение по полосе пропускания

                      Router(config-if) ip rsvp bandwidth значение_ограничения

                      При указании требования по полосе для туннеля данная команда является обязательной — полосу нужно задать явно, иначе IGP эту информацию не анонсирует, а CSPF соответственно не будет учитывать эту линию и не вычислит путь под требования туннеля.

                      На схеме выше я обозначил, какие из интерфейсов имеют ограничение в 5Мб/с. Если не подписано, то ограничения нет — ставим 10.
                      Следует всегда помнить, что это только референсное значение для расчёта пути TE, и фактически команда никак не ограничивает реальную скорость TE-трафика, через интерфейс.

                      Linkmeup_R1(config) interface FastEthernet 0/0
                      Linkmeup_R1(config-if) mpls traffic-eng tunnels 
                      Linkmeup_R1(config-if) ip rsvp bandwidth 5000
                      
                      Linkmeup_R1(config) interface FastEthernet 0/1
                      Linkmeup_R1(config-if) mpls traffic-eng tunnels 
                      Linkmeup_R1(config-if) ip rsvp bandwidth 10000

                      Обратите внимание, что команда ip rsvp bandwidth указывает полосу только в одном направлении. То есть если мы настроили её на интерфейсе E0/0 в сторону Linkmeup_R2, то это означает, что в 5Мб/с ограничена полоса только для исходящего трафика.
                      Чтобы ограничить в другую сторону, нужно настроить интерфейс E0/1 со стороны Linkmeup_R2.

                      Конфигурация других узлов


                      Linkmeup_R2(config) mpls traffic-eng tunnels 
                      
                      Linkmeup_R2(config)  interface FastEthernet 0/0
                      Linkmeup_R2(config-if)  mpls traffic-eng tunnels 
                      Linkmeup_R2(config-if)  ip rsvp bandwidth 5000
                      
                      Linkmeup_R2(config)  interface FastEthernet 0/1
                      Linkmeup_R2(config-if)  mpls traffic-eng tunnels 
                      Linkmeup_R2(config-if)  ip rsvp bandwidth 10000
                      
                      Linkmeup_R2(config)  interface FastEthernet 0/2
                      Linkmeup_R2(config-if)  mpls traffic-eng tunnels 
                      Linkmeup_R2(config-if)  ip rsvp bandwidth 10000
                      
                      Linkmeup_R2(config)  interface FastEthernet 0/3
                      Linkmeup_R2(config-if)  mpls traffic-eng tunnels 
                      Linkmeup_R2(config-if)  ip rsvp bandwidth 10000
                      
                      
                      Linkmeup_R3(config) mpls traffic-eng tunnels Linkmeup_R3(config) interface FastEthernet 0/0 Linkmeup_R3(config-if) mpls traffic-eng tunnels Linkmeup_R3(config-if) ip rsvp bandwidth 10000 Linkmeup_R3(config) interface FastEthernet 0/1 Linkmeup_R3(config-if) mpls traffic-eng tunnels Linkmeup_R3(config-if) ip rsvp bandwidth 10000 Linkmeup_R3(config) interface FastEthernet 0/2 Linkmeup_R3(config-if) mpls traffic-eng tunnels Linkmeup_R3(config-if) ip rsvp bandwidth 10000 Linkmeup_R3(config) interface FastEthernet 0/3 Linkmeup_R3(config-if) mpls traffic-eng tunnels Linkmeup_R3(config-if) ip rsvp bandwidth 10000
                      Linkmeup_R4(config) mpls traffic-eng tunnels Linkmeup_R4(config) interface FastEthernet 0/0 Linkmeup_R4(config-if) mpls traffic-eng tunnels Linkmeup_R4(config-if) ip rsvp bandwidth 10000 Linkmeup_R4(config) interface FastEthernet 0/1 Linkmeup_R4(config-if) mpls traffic-eng tunnels Linkmeup_R4(config-if) ip rsvp bandwidth 10000
                      Linkmeup_R5(config) mpls traffic-eng tunnels Linkmeup_R5(config) interface FastEthernet 0/0 Linkmeup_R5(config-if) mpls traffic-eng tunnels Linkmeup_R5(config-if) ip rsvp bandwidth 10000 Linkmeup_R5(config) interface FastEthernet 0/1 Linkmeup_R5(config-if) mpls traffic-eng tunnels Linkmeup_R5(config-if) ip rsvp bandwidth 5000 Linkmeup_R5(config) interface FastEthernet 0/2 Linkmeup_R5(config-if) mpls traffic-eng tunnels Linkmeup_R5(config-if) ip rsvp bandwidth 10000 Linkmeup_R5(config) interface FastEthernet 0/3 Linkmeup_R5(config-if) mpls traffic-eng tunnels Linkmeup_R5(config-if) ip rsvp bandwidth 10000
                      Linkmeup_R6(config) mpls traffic-eng tunnels Linkmeup_R6(config) interface FastEthernet 0/0 Linkmeup_R6(config-if) mpls traffic-eng tunnels Linkmeup_R6(config-if) ip rsvp bandwidth 10000 Linkmeup_R6(config) interface FastEthernet 0/1 Linkmeup_R6(config-if) mpls traffic-eng tunnels Linkmeup_R6(config-if) ip rsvp bandwidth 10000 Linkmeup_R6(config) interface FastEthernet 0/2 Linkmeup_R6(config-if) mpls traffic-eng tunnels Linkmeup_R6(config-if) ip rsvp bandwidth 10000 Linkmeup_R6(config) interface FastEthernet 0/3 Linkmeup_R6(config-if) mpls traffic-eng tunnels Linkmeup_R6(config-if) ip rsvp bandwidth 10000
                      Linkmeup_R7(config) mpls traffic-eng tunnels Linkmeup_R7(config) interface FastEthernet 0/0 Linkmeup_R7(config-if) mpls traffic-eng tunnels Linkmeup_R7(config-if) ip rsvp bandwidth 10000 Linkmeup_R7(config) interface FastEthernet 0/1 Linkmeup_R7(config-if) mpls traffic-eng tunnels Linkmeup_R7(config-if) ip rsvp bandwidth 10000 Linkmeup_R7(config) interface FastEthernet 0/3 Linkmeup_R7(config-if) mpls traffic-eng tunnels Linkmeup_R7(config-if) ip rsvp bandwidth 10000




                    3. Настраиваем IS-IS на возможность сбора и передачи TE данных

                      Linkmeup_R1(config) router isis 
                      Linkmeup_R1(config-router)  metric-style wide
                      Linkmeup_R1(config-router)  mpls traffic-eng router-id Loopback0
                      Linkmeup_R1(config-router)  mpls traffic-eng level-1

                      Команда metric-style wide — обязательна, напоминаю. Дело в том, что TE использует новые TLV с расширенными метками, а по умолчанию ISIS генерирует только короткие.

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


                    4. Настраиваем TE-туннель.

                      Linkmeup_R1(config) interface Tunnel4
                      Linkmeup_R1(config-if) description To Linkmeup_R4
                      Linkmeup_R1(config-if) ip unnumbered Loopback0
                      Linkmeup_R1(config-if) tunnel mode mpls traffic-eng
                      Linkmeup_R1(config-if) tunnel destination 4.4.4.4
                      Linkmeup_R1(config-if) tunnel mpls traffic-eng bandwidth 8000
                      Linkmeup_R1(config-if) tunnel mpls traffic-eng path-option 1 dynamic

                      Здесь мы указали, что туннель строим до узла 4.4.4.4, требуется 8 Мб/с, а LSP строится динамически (без Explicit-Path)

                      Сразу после этого видим, что туннель поднялся.



                      То есть CSPF рассчитал маршрут с учётом нашего ограничения, RSVP PATH успешно сигнализировал путь, а RSVP RESV зарезервировал ресурсы на всём пути.

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



                      А в сообщении RSVP PATH можно увидеть, что он несёт информацию о требуемой полосе.



                      В дампе вы можете видеть начало объекта ERO с перечислением всех узлов по пути будущего RSVP LSP и запрос резервирования полосы пропускания.
                      Здесь стоит 1000000 Байтов в секунду или ровно 8 Мегабит в секунду (если мы не путаем Мега с Меби). Величина эта дискретная и меняется с некоторым шагом. В случае данной лабы — это 250 кб/с.

                      Можете поиграться с параметрами и увидеть, как туннель реагирует на изменения в сети.
                      То же самое на обратной стороне:

                      Linkmeup_R4(config) interface Tunnel1
                      Linkmeup_R4(config-if) description To Linkmeup_R1
                      Linkmeup_R4(config-if) ip unnumbered Loopback0
                      Linkmeup_R4(config-if) tunnel mode mpls traffic-eng
                      Linkmeup_R4(config-if) tunnel destination 1.1.1.1
                      Linkmeup_R4(config-if) tunnel mpls traffic-eng bandwidth 8000
                      Linkmeup_R4(config-if) tunnel mpls traffic-eng path-option 1 dynamic

                    5. Создаём VPN (см. как)

                      Linkmeup_R1(config) ip vrf TARS
                      Linkmeup_R1(config-vrf)  rd 64500:200
                      Linkmeup_R1(config-vrf)  route-target export 64500:200
                      Linkmeup_R1(config-vrf)  route-target import 64500:200
                      
                      Linkmeup_R1(config-vrf)  interface Ethernet0/3
                      Linkmeup_R1(config-if)  description To TARS_1
                      Linkmeup_R1(config-if)  ip vrf forwarding TARS
                      Linkmeup_R1(config-if)  ip address 172.16.0.1 255.255.255.0
                      
                      Linkmeup_R1(config-if)  router bgp 64500
                      Linkmeup_R1(config-router)  neighbor 4.4.4.4 remote-as 64500
                      Linkmeup_R1(config-router)  neighbor 4.4.4.4 update-source Loopback0
                      
                      Linkmeup_R1(config-router)  address-family vpnv4
                      Linkmeup_R1(config-router-af)   neighbor 4.4.4.4 activate
                      Linkmeup_R1(config-router-af)   neighbor 4.4.4.4 send-community both
                      
                      Linkmeup_R1(config-router)  address-family ipv4 vrf TARS
                      Linkmeup_R1(config-router-af)   redistribute connected

                      Настройка на Linkmeup_R4


                      Linkmeup_R4(config) ip vrf TARS
                      Linkmeup_R4(config-vrf) rd 64500:200
                      Linkmeup_R4(config-vrf) route-target export 64500:200
                      Linkmeup_R4(config-vrf) route-target import 64500:200
                      
                      Linkmeup_R4(config-vrf) interface Ethernet0/3
                      Linkmeup_R4(config-if) description To TARS_2
                      Linkmeup_R4(config-if) ip vrf forwarding TARS
                      Linkmeup_R4(config-if) ip address 172.16.1.1 255.255.255.0
                      Linkmeup_R4(config-if) mpls traffic-eng tunnels
                      
                      Linkmeup_R4(config-if) router bgp 64500
                      Linkmeup_R4(config-router) neighbor 1.1.1.1 remote-as 64500
                      
                      Linkmeup_R4(config-router) address-family vpnv4
                      Linkmeup_R4(config-router-af) neighbor 1.1.1.1 activate
                      Linkmeup_R4(config-router-af) neighbor 1.1.1.1 send-community both
                      
                      Linkmeup_R4(config-router-af) address-family ipv4 vrf TARS


                      Если сейчас попробуем пропинговать, то облом — ничего не будет.
                      Обратите внимание, что BGP распространил маршруты VPN вместе с их метками, но нет передачи данных.
                      Это потому, что пока нет привязки к транспортному LSP, а без этого нет никакого смысла и в метках VPN.
                    6. Направляем в него трафик через IGP Shortcut.
                      Для этого достаточно одной команды на обоих PE:

                      Linkmeup_R1(config) interface Tunnel4
                      Linkmeup_R1(config-if) tunnel mpls traffic-eng autoroute announce

                      Linkmeup_R4(config) interface Tunnel1
                      Linkmeup_R4(config-if) tunnel mpls traffic-eng autoroute announce

                      При необходимости можно также настроить метрику туннельного интерфейса:

                      Linkmeup_R1(config-if) tunnel mpls traffic-eng autoroute metric relative -5

                      Linkmeup_R4(config-if) tunnel mpls traffic-eng autoroute metric relative -5






                    7. Есть пинг, есть счастье!



                    Итак, что произошло?

                    1. Сначала мы настроили базовую поддержку TE,
                      а) Включили поддержку TE в глобальном режиме,
                      б) Включили функцию TE на магистральных интерфейсах,
                      г) Указали доступную пропускную способность физических интерфейсов,
                      д) Заставили IGP анонсировать данные TE.

                      На этом шаге IGP уже составил TEDB.
                    2. Создали туннель (прямой и обратный):
                      а) Указали точку назначения,
                      б) Режим работы — TE,
                      в) Указали требуемую полосу,
                      г) Разрешили строить LSP динамически.

                      На этом шаге сначала CSPF вычисляет список узлов, через которые нужно проложить LSP. Выхлоп этого процесса помещается в объект ERO. потом RSVP-TE с помощью сообщений PATH и RESV резервирует ресурсы и строит LSP.

                      Но этого ещё недостаточно для практического использования туннеля.

                    3. Настроили L3VPN (см. как).
                      Когда MP-BGP обменялся маршрутными данными VRF, Next Hop'ом для этих маршрутов стал Loopback адрес удалённого PE.
                      Однако маршруты из таблицы BGP не инсталлируются в таблицу маршрутизации данного VRF, поскольку трафик в LSP мы пока не запустили.
                    4. Заставили IGP рассматривать TE-туннель, как возможный выходной интерфейс.
                      Это не влечёт никаких изменений в других частях сети — исключительно локальное действие — IGP только меняет таблицу маршрутизации этого узла.

                      Теперь LoopBack удалённого PE стал доступен через туннель, а маршруты добавились в таблицу маршрутизации VRF.

                      То есть когда IP-пакет приходит от клиента,
                      а) он получает метку VPN (16).
                      б) из FIB VRF TARS ему известно, что для данного префикса пакет должен быть отправлен на адрес 4.4.4.4
                      в) До 4.4.4.4 есть TE-туннель (Tunnel 4) и известна его пара выходной интерфейс/метка — Ethernet0/1, 18 — она будет транспортной.




                    На этой иллюстрации решительно нечего выделить — всё абсолютно прекрасно — вся информация о TE-туннеле в одной команде.



                    Сейчас путь от R1 до R4 выглядит так: R1->R5->R2->R6->R3->R4 — всё из-за этих чёртовых ограничений.

                    Теперь начинаем баловаться.
                    Попробуем разорвать наш рабочий линк R3->R4, пока длится непрерывный пинг.



                    LSP перестроился на R1->R5->R2->R6->R3->R7->R4 с потерей одного пакета. Это время может значительно увеличиться, если физического падения линии не будет на маршрутизаторах.

                    Что при этом происходило?

                    1. Сначала R1 через сообщение RSVP PATH ERROR узнал о том, что линия испорчена.
                    2. R1 отправил RSVP PATH TEAR по направлению к 4.4.4.4, а обратно идущий RSVP RESV TEAR удалил LSP.
                    3. Тем временем на R1 CSPF рассчитал новый маршрут в обход сломанного линка.
                    4. Потом RSVP-TE сигнализировал новый LSP R1->R5->R2->R6->R3->R7->R4


                    Если у нас не останется путей, удовлетворяющих заданным условиям — беда — LSP не будет.

                    Например, выключим линию R2-R5 и наблюдаем падения TE-туннеля на R1 без его дальнейшего восстановления.

                    Переоптимизация туннелей


                    Если линк R3->R4 восстановится, туннель перестроится обратно?
                    Да. Но не скоро. Пролетит много пакетов, прежде чем Ingress PE шевельнёт своим RSVP. (На самом деле зависит от производителя)
                    Это называется переоптимизацией туннелей (Tunnel reoptimization). С некоторой периодичностью Ingress PE заставляет CSPF проверить, а не появилось ли более оптимальных маршрутов.

                    1. CSPF находит новый путь, удовлетворяющий всем условиям. В нашем случае R1->R5->R2->R6->R3->R4.
                    2. Ingress PE сигнализирует новый RSVP LSP, отправляя RSVP PATH.
                    3. Получив RSVP RESV, он понимает, что новый LSP готов.
                    4. Отправляет RSVP PATH TEAR, чтобы сломать старый LSP.
                    5. Когда RSVP RESV TEAR возвращается — всё закончено.

                    То есть сначала он строит новый RSVP LSP, пускает туда трафик и только потом ломает старый. Этот механизм называется Make-Before-Break, о котором в конце.

                    Способы управления туннелями


                    Итак, у нас достаточно способов, как повлиять на путь трафика с помощью TE:

                    1. Метрика пути MPLS TE
                    2. Ограничение по полосе пропускания
                    3. Explicit-Path
                    4. SRLG
                    5. Administrative Groups/Affinity

                    Метрика пути MPLS TE


                    Первый самый очевидный способ — это метрики интерфейсов.
                    Как мы помним есть IGP-метрики, а есть TE-метрики. Вторые по умолчанию равны первым.
                    TE-метрика на линковых интерфейсах не только влияет на метрику туннеля с точки зрения IGP Shortcut, но и учитывается при построении LSP.
                    Для чего может понадобиться настраивать TE-метрику отличной от IGP?
                    Например, есть линия с высоким значением задержки. Ей задаём бОльшее значение TE-метрики.
                    Тогда:
                    При построении туннелей для голосового трафика будем использовать TE-метрику,
                    В туннелях для прочих данных — IGP.
                    Используется для этого команда

                    Router(config-if) mpls traffic-eng administrative-weight значение TE-метрики

                    Чтобы указать туннелю, какую учитывать метрику:
                    Значение по умолчанию:

                    Router(config)  mpls traffic-eng path-selection metric {igp | te}

                    Конкретный туннель:

                    Router(config-if)  tunnel mpls traffic-eng path-selection metric {igp | te}

                    Cisco подробно про метрики.

                    Ограничение по полосе пропускания


                    На практике мы познакомились с базовой функцией TE — возможностью строить MPLS туннели с резервированием ресурсов на всём протяжении LSP.

                    Но не беспокоит ли вас вот эта идея с Bandwidth? Не возвращаемся ли мы в каменный век, когда не было переподписки. Да и как вообще определять величину этого ограничения? А что делать с тем, что она плавает в течение суток на порядки?

                    Offline Bandwidth


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

                    Полосу можно настроить для всего туннеля, как мы делали это выше на практике:

                    Router(config-if) tunnel mpls traffic-eng bandwidth значение требуемой полосы

                    А можно для конкретного RSVP LSP:

                    Router(config-if) tunnel mpls traffic-eng path-option 1 dynamic bandwidth значение требуемой полосы

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

                    При этом для другого LSP (path-option 2, например), значение может отличаться — мол, если уж не получается зарезервировать 8 Мб/с, давай хотя бы 5 попробуем?

                    У Offline Bandwidth есть два существенных минуса:
                    — Ручная работа, которой хороший инженер старается избегать.
                    — Неоптимальное использование ресурсов. Ну, назначим мы полосу в 300 Мб/с клиенту, зарезервируем на каждой линии, а на деле ему надо-то от силы 30. И только в пике, когда у него бэкапятся БД, нужно 300. Неаккуратненько.

                    Этот вариант практиковался на заре появления TE. Существует он и сейчас.
                    Однако, следуя в ногу со временем, нужно быть более гибким и податливым.

                    Auto-Bandwidth


                    А Autobandwidth молодец.
                    Этот механизм отслеживает загрузку туннеля в течение определённого периода и потом адаптирует резервирование.

                    Терминология

                    Adjust Interval — время, в течение которого маршрутизатор наблюдает за трафиком и отслеживает пики.
                    Adjust Threshold — порог, после которого RSVP перезапрашивает резервирование.
                    Ближе к телу.



                    Например, Adjust Interval у нас 2 часа. Текущее значение зарезервированной полосы пропускания — 90 Мб/с.
                    Adjust Threshold — 20 Мб/с.

                    В первом интервале всплеск 119 Мб/с (до 119 Мб/с) — больше порога. Значит RSVP-TE пытается построить новый туннель с новыми значениями для полосы пропускания.

                    Во втором — 23Мб/с (до 142) — опять больше порога. Обновляем резервирование по возможности.

                    В третьем максимальное значение падает до 137 Мб/с — разница только 5. Ничего не происходит.

                    В четвёртом всплеск падает до 116 (разница 21) — RSVP сигнализирует новый LSP с пониженными требованиями по полосе.

                    Так, каждые два часа будет происходить проверка и, возможно, перестроение туннелей.
                    Чем короче Adjust Interval, тем, соответственно, чаще будет обновляться резервирование и более рационально использоваться доступная полоса пропускания.

                    Примерно так при двухчасовом интервале будет выглядеть 24-часовое поведение auto-bandwidth.



                    Уже заметили проблему?
                    Возьмём типичный профиль утреннего трафика:


                    И такая дребедень целый день.

                    Вот измерили мы в 8 утра всплеск — 200 Мб/с. И два часа держится это значение для туннеля. А за это время на работу уже пришёл народ и запустил ютуб — средняя скорость уже 240, а всплески до 300. До 10 утра будет происходить тихая деградация. Тихая, потому что ни туннель, ни Auto-Bandwidth о ней не знают. А вот пользователи знают и их ИТшник тоже знает, уж поверьте.

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

                    Для решения этой и других проблем существуют механизмы Overflow и Underflow. Первый — для слежения за ростом трафика, второй — за снижением.
                    Если разница между текущим резервированием и всплесками трафика превосходит порог Overflow несколько раз подряд, RSVP TE будет пробовать построить новый LSP, не дожидаясь истечения Adjust Interval.

                    То же и для Underflow — RSVP-TE будет пересегнализировать LSP с более низкими требованиями, если заметил тенденцию к уменьшению объёма трафика.

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

                    Мы с этим будем бороться с помощью приоритезации туннелей, о которой ниже.

                    Для включения функции AutoBandwidth глобально и одновременно настройки Adjust Interval:

                    Router(config) mpls traffic-eng auto-bw timers frequency [sec]

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

                    Router(config) tunnel mpls traffic-eng auto-bw max-bw Значение min-bw Значение

                    Для настройки Overflow:

                    Router(config) tunnel mpls traffic-eng auto-bw [overflow-limit количество раз overflow-threshold Процент изменения]

                    Подробнее о Auto-Bandwidth можно почитать в очень честном документе.

                    Приоритеты туннелей


                    Это механизм, который приоритезирует туннели: какой из них важнее. Он применим, как для случая Auto-Bandwidth в частности, так и для любого построения RSVP LSP вообще.

                    Всё предельно логично:
                    Setup Priority — приоритет установки RSVP LSP.
                    Hold Priority — приоритет удержания RSVP LSP.

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

                    Оба имеют 8 значений: от 0 до 7. Для обоих 0 — это наивысший, 7 — наинизший.

                    Например, у нас есть туннель LSP1, у которого Hold priority 4.
                    Тут приходит запрос от RSVP-TE на LSP2 с Setup Priority 6 и Hold Priority тоже 6. Если полосы пропускания достаточно, то он просто построится. Если нет — то маршрутизатор не даст этого сделать — потому что уже существующий туннель приоритетнее нового (4>6).
                    Допустим, полосы достаточно и оба туннеля поднялись нормально.
                    И тут приходит новый запрос на LSP3 с Setup/Hold Priority 5. Это выше, чем у LSP2, но ниже, чем у LSP1. И ему полосы уже не хватает. LSP1 точно не будет тронут, потому что его Hold приоритет до сих пор самый высокий. И тогда есть два варианта:

                    1. Если сломать LSP2, полосы хватает для LSP3. В этом случае Setup приоритет LSP3 выше, чем Hold LSP2. Ingress PE LSP2 узнаёт, что его LSP вероломно разломали и будет искать новый путь — его удача, если он найдёт.
                    2. Если сломать LSP2, полосы всё равно не хватит для LSP3. LSP1 маршрутизатор не отдаст. И тогда LSP1 и LSP2 остаются, а Ingress PE LSP3 будет искать другие возможности для самореализации.

                    Касательно значений — обычно выбираются одинаковые для Setup и Hold. И не стоит настраивать Hold ниже, чем Setup. Во-первых это не логично. Во-вторых, может случиться ситуация, когда два туннеля войдут в петлю, когда они будут постоянно перебарывать друг друга — как только установится один, второй его сломает и построится сам, потом первый сломает второй итд.

                    Существует два режима замещения туннелей:
                    Hard preemption — LSP с более высоким приоритетом просто замещает LSP с низким. Даже если потом LSP с низким приоритетом найдёт новый путь, часть трафика будет потеряна.
                    Soft preemption — применяется механизм Make-Before-Break. Маршрутизатор через RSVP-TE сообщает Ingress LSR низкоприоритетного LSP, что нужно искать новый путь. LSP с высоким приоритетом ожидает, пока трафик низкоприоритетного LSP переключится на новый LSP.
                    При этом, если путь найти не удалось в течение некоторого времени, низкоприоритетный LSP всё равно ломается и строится высокоприоритетный.

                    Данные о приоритетах замещения передаются в RSVP-TE PATH и учитываются при резервировании ресурсов на промежуточных узлах.

                    Практика


                    Если вы обратили внимание, то после настройки tunnel mpls traffic-eng badnwidth на туннельном интерфейсе, в конфигурации автоматически появляется строка tunnel mpls traffic-eng priority 7 7.

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

                    Но, как только появилось требование, по полосе, приоритеты начинают играть роль.
                    7 — это значение по умолчанию — наименьшее.

                    Давайте на Linkmeup_R1 настроим новый туннель до 4.4.4.4 с более высоким приоритетом?

                    Linkmeup_R1(config) interface Tunnel42
                    Linkmeup_R1(config-if) ip unnumbered Loopback0
                    Linkmeup_R1(config-if) tunnel mode mpls traffic-eng
                    Linkmeup_R1(config-if) tunnel destination 4.4.4.4
                    Linkmeup_R1(config-if) tunnel mpls traffic-eng priority 4 4
                    Linkmeup_R1(config-if) tunnel mpls traffic-eng bandwidth 4000
                    Linkmeup_R1(config-if) tunnel mpls traffic-eng path-option 1 dynamic

                    Необходимая полоса всего 4Мб/с. Поэтому туннель должен пройти по пути R1->R2->R3->R4.



                    Так и есть, вот его трассировка:



                    С Tunnel4 у них только один общий линк R3->R4, но его полоса пропускания только 10. А двум туннелям нужно 8+4=12.
                    Tunnel42 с приоритетом установки 4 выдавливает Tunnel4 с приоритетом удержания 7.
                    И тому приходится искать новый путь.

                    И он находится:



                    Сначала удаляется старый RSVP LSP Tunnel4 и сигнализируется новый по доступному пути



                    Потом RSVP-TE сигнализирует LSP для Tunnel42.







                    В этот момент вернёмся к Autobandwidth. Именно связка Tunnel priority + Autobandwidth даёт элегантное решение.

                    Одним ранним утром было трафика мало, autobandwidth подсчитал сколько именно его в каждом туннеле, и TE везде хватило пропускной способности.

                    Потом ближе к обеду трафик подрос, autobandwidth адаптировался, перерезервировал новые полосы — всё ещё хватает.

                    К вечеру один за другим туннели начинают вылетать, потому что TE не может зарезервировать новую полосу.

                    И тут важно, чтобы туннели жирных клиентов, IP-телефонии и канал для МВД никогда не падали. Тогда задаём для этих туннелей Hold priority выше, чем Setup priority других.

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

                    Получается, что

                    • без Autobandwidth мы либо настраиваем требования полосы вручную на всей сети, либо вообще не делаем этого, пуская на самотёк,
                    • без Autobandwidth мы никогда не знаем, сколько реально трафика в туннеле,
                    • без Autobandwidth мы никак не можем его ограничить,
                    • без Tunnel priority мы не можем сказать наверняка, какие туннели пострадают.



                    Explicit-Path


                    Идея Explicit-Path более чем полно была раскрыта в 10-м выпуске СДСМ.

                    Как вы помните, CSPF вычисляет кратчайший путь с учётом ограничений. Далее этот путь трансформируется в объект ERO (Explicit Route Object) сообщения RSVP-TE PATH, который явно сообщает, по какому пути этот PATH нужно передать.

                    Так вот если, вы хотите, чтобы какие-то узлы обязательно присутствовали или наоборот отсутствовали в этом пути, можно это явно указать в Explicit-Path, который станет одним из входных ограничений для CSPF.

                    Итак, мы вручную задаём, через какие узлы должен пролечь LSP, а через какие не должен.
                    RSVP-TE просит CSPF рассчитать маршрут с учётом Explicit-Path и других ограничений туннеля.
                    Если одно входит в противоречие с другим — беда, не будет LSP.
                    Explicit-Path — это строго локальное ограничение — только Ingress LSR о нём знает и не передаёт ни в анонсах IGP, ни в сообщениях RSVP-TE.
                    Настройка Explicit-path выполняется в два этапа:
                    1) Создание самого explicit-path с ограничениями:

                    Router(config)  ip explicit-path name Имя 
                    Router(cfg-ip-expl-path)  next-address IP-адрес
                    Router(cfg-ip-expl-path)  exclude-address IP-адрес
                    ...

                    2) Примение его к path-option на туннеле:

                    Router(config-if) tunnel mpls traffic-eng path-option 1 explicit name Имя

                    SRLG


                    SRLGShared Risk Link Group. Ещё один способ повлиять на LSP и отличная идея против плоских колец.

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

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

                    SRLG-группа — группа интерфейсов, которые «разделяют риск». О! Группа риска.

                    Вручную (конечно, а как иначе маршрутизатор узнает, что это физически идентичные линии) настраиваются интерфейсы, которые являются членами одной SRLG-группы.
                    Информация о SRLG распространяется по сети вместе с анонсами IGP, как и доступная полоса или значение Attribute-Flag, и помещается потом в TEDB.
                    Далее CSPF должен учитывать эту информацию при расчёте кратчайших маршрутов.

                    Имеется два режима:
                    Force Mode заставляет CSPF учитывать данные SRLG обязательно — если иного пути нет, то резервный LSP не будет построен вообще.
                    Preffered Mode допускает построение запасных туннелей через SRLG-линии, если нет иных возможностей.
                    Режим задаётся на Ingress LSR.

                    Для добавления интерфейсов в одну группу риска на любых узлах вводится команда:

                    Router(config-if)  mpls traffic-eng srlg номер группы

                    А на Ingress PE включить проверку SRLG:

                    Router(config)  mpls traffic-eng auto-tunnel backup srlg exclude force/preffered

                    Что это за команда, поговорим в разделе FRR.



                    Administrative Groups или Affinity


                    Вот сейчас должно стать страшно. Мне страшно.

                    Итак, к данному моменту мы узнали про четыре инструмента управления трафиком:

                    • Метрика MPLS TE.
                    • Требования к полосе пропускания канала и приоритет замещения.
                    • Explicit-path.
                    • SRLG.

                    RFC3630 для OSPF, а для ISIS определяют TLV для Administrative Group, который передаётся IGP вместе с другими характеристиками линиями.

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

                    Огромнейшая сеть linkmeup. Своя оптика, свои РРЛ пролёты, куски лапши, доставшиеся от купленных домонетов, куча арендованных каналов у разных операторов. И через всё это хозяйство MPLS, хуже того — TE-туннели.

                    И для разных сервисов важно, чтобы они шли определённым путём.
                    Например, трафик 2G ни в коем случае не должен идти через РРЛ-пролёты — проблемы с синхронизацией нас съедят.
                    Трафик ШПД нельзя пускать через линии Балаган Телеком, потому что эти паразиты из 90-х берут деньги за объём пропущенного трафика.
                    Разрешать строить туннели через сети доступа вообще запрещено категорически.

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

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

                    Marketing Bullshit! Непонятно? Мне тоже.

                    Итак.
                    Administrative Group (у Juniper: admin-group, у Cisco: Attribute-Flag) — это атрибут физического интерфейса, который может описать 32 его дискретных характеристики.
                    Какой бит из 32 за что отвечает решает оператор самостоятельно.
                    Раз уж примеры у нас в консоли Cisco, то далее буду использовать термин Attribute-Flag наравне с Administrative group, что не совсем правильно.

                    Например,
                    считаем с наименее значимых битов (с конца):
                    первый бит в 1 означает, что это оптика
                    второй бит в 1 означает, что это РРЛ
                    третий бит в 0 означает, что это линия в сторону сети доступа, а 1 — магистральный интерфейс.
                    четвёртый бит в 1 означает, что это аренда
                    пятый бит в 1 означает, что это Балаган-Телеком
                    шестой бит в 1 означает, что это Филькин-Сертификат
                    седьмой бит в 1 означает, что это канал через интернет без гарантий.

                    десятый бит в 1 означает, что полоса пропускания меньше 500 Мб/с
                    итд. я так могу все 32 утилизировать.

                    Affinity и маска — это требования туннеля к своему пути.
                    Какие отношения могут сложиться в этом треугольнике {Affinity, Mask, Attribute-Flag}?

                    (AFFINITY && MASK) == (ATTRIBUTE && MASK)

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

                    Рассмотрим на примере.
                    У нас есть 32 бита и политика — за что отвечает каждый из них (возьмём пример выше).

                    В Mask мы указываем, какие характеристики канала нас интересуют. Например, для туннеля с трафиком 2G важно

                    1. РРЛ это или нет
                    2. Магистральная линия или в сторону сегмента доступа
                    3. Канал через интернет или нет

                    Поэтому в маске выставляем 1 там, где важно, что стоит:

                    Mask: 0100 0110
                    Взяли только первые 8 бит для простоты.
                    Заметьте, что это Wildcard Mask.


                    В Affinity мы указываем, что именно нам нужно.

                    1. Чтобы это не был РРЛ (0)
                    2. Чтобы это был магистральный линк (1)
                    3. Канал не через интернет (0)

                    Affinity: 0000 0100.



                    Выполняем операцию и получаем: 0000 0100.



                    Теперь возьмём для примера три интерфейса.

                    1. Attribute-Flag 0000 0100 — Не РРЛ, магистральный и не через Интернет. Attribute-Flag && Mask = 0000 0100 = Affinity && Mask — сюда можно пускать трафик.


                    2. Attribute-Flag 0100 0000 — Не РРЛ, но в сторону сегмента доступа, да ещё и через интернет. Attribute-Flag && Mask = 0100 0000 /= Affinity && Mask — сюда нельзя пускать трафик.


                    3. Attribute-Flag 0000 0101 — Оптика, не РРЛ, магистральный и не через Интернет. Attribute-Flag && Mask = 0000 0100 = Affinity && Mask — сюда можно пускать трафик. Не важно, оптика или нет — результат тот же.



                    То есть при построении LSP на каждом линке будет учитываться значение Attribute-Flag.
                    По умолчанию значение Attribute-Flag на интерфейсе — 0x0. И в некотором смысле — это прискорбно — ведь результат операции «И» с маской будет отличаться от результата с Affinity, а значит мы должны настроить Attribute-Flag на всех интерфейсах.

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

                    Но в любом случае это не умаляет человеческого фактора с одной стороны и просто непостижимой сложности отладки и обслуживания с другой.

                    Однако случаи комплексного внедрения Administrative Group даже на сетях российиских операторов имеются.

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

                    В этом свете 32 бита оказывается очень мало, поэтому RFC 7308 определяет расширенные административные группы, количество бит в которых ограничено естественым пределом LSA или вообще MTU.

                    Парень на пальцах разжёвывает Affinity и в рот стопочкой складывает.

                    Практика


                    Очень очень короткая. Просто посмотрим, что работает. Короткая, потому что применение Affinity требует настройки Attribute-Flag на всех узлах и всех интерфейсах. А это то, чего меньше всего хочется, если честно.



                    Продолжаем с последней конфигурации, где у нас два туннеля.
                    Файл конфигурации.
                    Tunnel42 идёт по пути R1-R2-R3-R4. С ним и поиграем.

                    Значение Attribute-Flag по умолчанию 0x0. Поэтому его и возьмём в качестве Affinity — то есть все интерфейсы у нас подпадают под условие. Кроме R3-R4, на котором мы настроим Attribute-Flag 0x1. Поскольку равенство не выполнится — CSPF не сможет строить кратчайший путь через этот линк.

                    Linkmeup_R1(config) interface Tunnel4
                    Linkmeup_R1(config-if) tunnel mpls trafаic-eng affinity 0x0 mask 0x1

                    Linkmeup_R3(config) interface e0/0
                    Linkmeup_R3(config-if) mpls trafаic-eng attribute-flags 0x1

                    И наблюдаем, как туннель пошёл в обход этого линка.



                    Однако при этом благополучно развалился Tunnel4. Значение Affinity по-умолчанию тоже 0x0, но маска 0xFFFF. Поэтому он тоже не вписался в перенастроенный линк R3-R4.

                    Но, мы могли бы настроить на нём маску 0x0 — не учитывать никакие биты Affinity и Attribute-Flag:

                    Linkmeup_R1(config) interface Tunnel4
                    Linkmeup_R1(config-if) tunnel mpls trafаic-eng affinity 0x0 mask 0x0

                    И тогда туннель поднимется, не учитывая эти ограничения.

                    Надёжность и сходимость


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

                    Вся история развития компьютерных сетей — это история борьбы с авариями, борьбы за скорость сходимости, за уменьшение времени перерыва.
                    Что у нас есть на вооружении?

                    1. Защита на физическом уровне. Например, APS в SONET или LAG в Ethernet.
                    2. IP — решение всех проблем. IGP, BGP, VRRP итд.
                    3. Набор технологий в MPLS.

                    Если бы эволюция строила людей по этому принципу, мы бы умирали преимущественно от старости (вторая причина по числу смертей была бы «погиб под собственным весом»).
                    Защита на физическом уровне обычно предоставляет время сходимости в ±50 мс.
                    IP хорош, но сходится за секунды, а то и минуты.

                    MPLS TE предлагает две опции для повышения стабильности и уменьшения времени прерывания сервисов.

                    • Path Protection
                    • Local Protection



                    Первая реализует защиту на уровне всего LSP, вторая — на уровне линка или узла — и она называется FRR — Fast ReRoute.

                    Path Protection


                    При настройке туннеля мы можем указать, сколько и каких LSP мы хотим построить.



                    1. Primary — это основной LSP, который и будет использоваться для передачи трафика.
                    2. Secondaryзапасной LSP. Если Ingress PE узнаёт от падении основного — он переводит трафик на запасной.
                      Последний в свою очередь тоже может быть:

                      • Standby — всегда наготове: путь заранее вычислен и LSP сигнализиован. То есть он сразу готов подхватить трафик. Может также называться Hot-standby.
                      • Non-standby — путь заранее вычислен, но LSP не сигнализирован. При падении основного LSP Ingress LSP сначала с помощью RSVP-TE строит запасной, потом пускает в него трафик. Зато полоса не простаивает зарезервированная. Может называться Ordinary.
                    3. Best Effort — если основной и запасной пути сломались или не могут быть удовлетворены условия, то RSVP-TE построит хоть как-нибудь без резервирования ресурсов.

                    Protection — это не только и не столько про восстановление сервиса, сколько про скорость этого восстановления.

                    В этом ключе понятное дело, что non-standby совсем не дело. Опираясь на IGP, RSVP-TE сначала ждёт обновления маршрутной информации, потом сам должен отработать — счёт на секунды. Сигналом является уведомление от RSVP-TE или BFD, что LSP больше не живой, либо информация от IGP об изменении топологии.

                    Для случая Standby строится одновременно основной RSVP LSP и резервный. Соответственно, как только Ingress LSR фиксирует разрыв шаблона основного LSP, трафик сразу переключается на запасной — нам грозит потеря только тех пакетов, которые были посланы ровно до момента, как авария была зафиксирована.

                    Local Protection (FRR)


                    А вот FRR — Fast Reroute — позволяет спасти даже те машинки, которые прямо сейчас уже стремятся к назначению, не подозревая ещё, что там мост обвалился. То есть FRR — это как объезд на участке трассы, где ведутся ремонтные работы, а Backup LSP — это другая трасса.

                    FRR использует обходные пути и описан в RFC4090 Среднее время переключения после детектирования аварии — 50мс.

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

                    Как это обычно и бывает, вещи которые просто настраиваются, скрывают под пальто нечто интересное.

                    Итак, у FRR есть две функции:

                    • Защитить линию — Link Protection.
                    • Защитить один узел — Node Protection.

                    Поэтому он и называется Local Protection — не следит за всем LSP, а проверяет доступность только ближайшего линка или узла.



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



                    На иллюстрации а) показана защита линии. На б) — защита узлов.
                    Берём LSP от R1 до R4. Каждый узел по пути, кроме R4, будет пытаться строить свои обходные пути.
                    Так R1 для защиты линии R1-R2 выберет путь R1->R5->R2. А для защиты от падения узла R2: R1->R5->R6->R3.
                    R2 должен защитить линию R2-R3 и узел R3.
                    ИТД.

                    Терминология

                    PLRPoint of Local Repair — точка расхода. Это узел, который инициирует защиту линии или узла. Может быть Ingress PE или любой транзитный P, но не Egress PE
                    MPMerge Point — точка схода, куда приземляется защитный туннель. Любой транзитный P или Egress PE, но не Ingress PE.
                    Primary LSP или Protected LSPисходный LSP, который требует защиты.
                    Bypass LSPзащитный LSP.
                    NHOPNext Hop — следующий после PLR узел в Primary LSP.
                    NNHOPNext Next Hop — соответственно следующий узел после Next Hop.
                    Давайте сначала с Link Protection разберёмся?

                    FRR Link Protection



                    [Перевод] Профилирование сборки проекта

                    Понедельник, 25 Сентября 2017 г. 15:02 + в цитатник
                    tangro сегодня в 15:02 Разработка

                    Профилирование сборки проекта

                    • Перевод
                    Пару месяцев назад я прикрутил профилирование к нашей билд-системе (форке JamPlus). Оно было реализовано на уже описанном мной ранее Chrome Tracing View, так что добавить его поддержку в Jam было просто. Jam написан на С, так что я просто нашел подходящую библиотеку для профилирования на С (это была minitrace) и буквально несколькими строками обернул интересующие меня места (собственно, сборку).

                    image

                    Здесь нет ничего выдающегося. Однако… как только у вас появляются первые результаты профилирования, они чаще всего заставляют задуматься и начать кое-что замечать.

                    Замеченные вещи


                    Как-то раз я занимался чем-то не связанным с темой данной статьи и для чего-то взглянул на вывод профилировщика для свежесобранного билда моего продукта. Опыт подсказывает, что в сборке С++ кода львиную долю времени занимает линковка. В этот раз, однако, дело было не в этом:

                    image

                    На диаграмме легко заметна большая задержка перед этапом линковки. Большая часть кода уже скомпилирована и лишь один файл с С++ кодом продолжает собираться. Тогда я был занят другой задачей, так что всего-лишь добавил задачу разобраться в этом на нашу доску с задачами. В другой раз я собирал билд другого компонента нашего продукта и снова взглянул на вывод профилировщика сборки:

                    image

                    И вот здесь дела выглядели уже откровенно плохо. Общее время сборки было около 10 минут и почти 7 из них занимала компиляция всего одного файла (5 из которых больше ничего не компилировалось). В этот момент стало ясно, что проблема в системе сборке такого масштаба, который не позволяет больше её игнорировать или откладывать.

                    Среднее время компиляции С++ файлов в данном проекте и в данной конфигурации составляло около 2 секунд. Была парочка файлов, которые собирались по 30 секунд, но 400+ секунд для сборки выходило за все разумные рамки. Что же происходит?

                    Я сделал несколько экспериментов и выяснил, что:

                    • Наша сборочная система, построенная на принципе Unity-билдов, не была виновником происходящего. Всё дело было в одном конкретном cpp-файле.
                    • Такое поведение показывал толко компилятор MSVC (clang работал в 10 раз быстрее), но нам тогда был нужен именно MSVC
                    • Проблема касалась только Release-сборок (а вернее тех сборок, где был включен инлайнинг)
                    • Проблема касалась не только относительно старого компилятора VS2010. Компиляция с помощью VS2015 работала даже ещё медленнее
                    • Общим моментом для всех файлов, компиляция которых занимала более 30 секунд, было использование нашей «математической SIMD-библиотеки», которая давала возможность писать код в стиле HLSL. Реализация была основана на весьма заковыристых макросах и шаблонах
                    • Тот самый файл, компиляция которого занимала 7 минут, включал в себя очень большую и сложную SIMD-функцию, которая к тому же за счет использования шаблонов требовала создание нескольких типизированных реализаций на этапе компиляции (так мы избавлялись от накладных расходов на рантайме, так что этот подход имел смысл)

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

                    Ускорение компиляции


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

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

                    Этот трюк на самом деле ни на секунду не ускорил нашу 7-минутную сборку того «плохого» файла, но его было легко сделать и он сразу дал около минуты общего выиграша на всей сборке (которая до этого занимала 10 минут).

                    А после этого я сделал то, на что у меня вообще-то вообще не было надежд — я разбил в том «медленном» файле самую большую шаблонную функцию на несколько более мелких (некоторые из которых уже не были шаблонными). Тривиальный рефакторинг. Некоторые IDE умеют делать подобные вещи в режиме «выделил мышкой часть кода, правый клик, Extract Function». Ну вот только это С++ и код, как я уже говорил, содержал много макросов и шаблонов, так что пришлось всё делать вручную.

                    После выделения около 5 функций время компиляции проблемного файла упало с 420 секунд до 70. Стало в 6 раз быстрее!

                    Конечно, выделение функций означает, что они больше не являются инлайновым кодом и у нас появляются затраты на их вызов (передача аргументов, jump, возврат). В то же время такой подход всё-же позволяет вызывающей функции использовать регистры (лучше или хуже), уменьшить общий объём кода и т.д. Мы замерили скорость работы изменённого кода на разных платформах и пришли к выводу, что изменения производительности незначительны. Так что, в этот раз всё сработало!

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

                    Сборка после сделанных изменений выглядит уже лучше. Больше нет кучи процессорных ядер, ожидающих завершения процесса компиляции на одном из них. Линковка всё ещё последовательна, но это не новость. Общее время сборки упало с 10 минут до 5 минут 10 секунд, т.е. стало почти в 2 раза быстрее.

                    image

                    Мораль


                    • Иметь хотя бы какую-нибудь систему профилирования сборки проекта, это лучше, чем не иметь вообще никакой. Если бы у нас подобной системы не было — мы бы так и теряли по 5 минут на каждой сборке проекта (не только на билд-сервере, но и на машинах разработчиков).
                    • Когда ваша шаблонная функция компилируется, то создаётся N её типизированных представлений. И каждое представление — это отдельный код, который сначала автоматически генерируется, а потом компилируется. При этом для разных версий такого кода, в зависимости от используемых типов, компилятор может ещё и применять различные оптимизации. Разделение большой шаблонной функции на более мелкие (и, возможно, не шаблонные) может реально ускорить компиляцию.
                    • Сложные шаблонные функции могут компилироваться долго из-за слишком долгой работы оптимизатора. Например, компилятор MSVC тратит основное время именно на это.
                    • Ускорение сборки — хорошая штука. Ну, помните, тот комикс — "-Эй, вы куда? — Код компилируется!". Чем меньше такого случается в жизни, тем лучше.
                    Original source: habrahabr.ru (comments, light).

                    https://habrahabr.ru/post/338672/


                    Метки:  

                    [Перевод] Kali Linux: мониторинг и логирование

                    Понедельник, 25 Сентября 2017 г. 14:54 + в цитатник

                    Метки:  

                    Поиск сообщений в rss_rss_hh_new
                    Страницы: 1437 ... 1159 1158 [1157] 1156 1155 ..
                    .. 1 Календарь