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

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

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

 

 -Постоянные читатели

 -Статистика

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

Habrahabr








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

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

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

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/


    Метки:  

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

    Понедельник, 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/


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

      Понедельник, 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/


        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/


          Метки:  

          [Перевод] Профилирование сборки проекта

          Понедельник, 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 + в цитатник

          Метки:  

          Визуализация результатов выборов в Москве на карте в Jupyter Notebook

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

          Визуализация результатов выборов в Москве на карте в Jupyter Notebook


            Всем привет!


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


            В качестве примера возьмем недавно отгремевшие муниципальные выборы в Москве. Сами данные можно взять с сайта мосгоризбиркома, в можно просто забрать датасеты с https://gudkov.ru/. Там даже есть какая-никакая визуализация, но мы пойдем глубже. Итак, что же у нас в итоге должно получиться?


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


            импорты
            import pandas as pd
            import numpy as np
            import os
            import pickle

            Я работаю в jupyter notebook на Linux-машине. Если вы захотите использовать мой код на Windows машине, то обращайте внимание на написание путей, а также на важные отступления в тексте.


            Обычно я использую отдельную папку для проекта, поэтому для простоты задаю текущую директорию:


            os.chdir('/data01/jupyter/notebooks/habr/ods_votes/')

            Дальше нам трубуется забрать данные с самого сайта Избиркома. Для разбора данных я написал отдельный парсер. Весь процесс занимает 10-15 минут. Забрать его можно из репозитория.


            Я решил создать большой словарь с датафреймами внутри. Для превращения html-страниц в датафреймы я использовал read_html, эмпирически подбирал нужные датафрейс, а после этого делал небольшую обработку, выкидывая лишнее и добавляя недостающее. Предварительно я уже обработал данные по партиям. Изначально они были не особо читаемы. К тому же, встречается разное написание одних и тех же партий (забавно, но в некоторых случаях это не разное написание, а реально разные партии).


            Разбор данных избиркома


            Непосредственно сборка справочника. Что здесь происходит:


            • собираются структура административных и муниципальных округов;
            • собираются все ссылки на Территориальные Избирательные Комиссии (ТИК);
            • для каждого ТИК собирается список кандидатов;
            • внутри каждого ТИК собираются Окружные Избирательные Комиссии (ОИК);
            • для каждого ОИК собирается статистика по ОИК и статистика по кандидатам;
            • из полученного датасета собираем статистику по муниципальным округам.

            В репозитории этой статьи лежат уже готовые данные. Их мы и будем использовать.


            Разбор данных
            import glob
            
            # забираем справочник сокращений для партий
            with open('tmp/party_aliases.pkl', 'rb') as f:
                party_aliases = pickle.load(f)
            
            votes = {}
            # забираем список округов и мунициальных образований
            votes['atd'] = pd.read_csv('tmp/atd.csv', index_col=0, sep=';')
            votes['data'] = {}
            # идем по мунициальным образованиям и собираем статистику ТИК
            for v in votes['atd']['municipal'].values:
                votes['data']
                # забираем статистику по кандидатам
                candidates = glob.glob('tmp/data_{}_candidates.csv'.format(v))[0]
                votes['data'][v]['candidates'] = pd.read_csv(candidates, index_col=0, sep=';')
                votes['data'][v]['votes'] = {}
                # теперь по каждому ОИК собираем его статистику
                # статистика по УИК
                okrug_stats_list = glob.glob('tmp/data_{}*_okrug_stats.csv'.format(v))
                for okrug_stats in okrug_stats_list:
                    okrug = int(okrug_stats.split('_')[2])
                    try:
                        votes['data'][v]['votes'][okrug]
                    except:
                        votes['data'][v]['votes'][okrug] = {}
                    votes['data'][v]['votes'][okrug]['okrug_stats'] = pd.read_csv(okrug_stats, index_col=0, sep=';')
                # статистика по кандидатам
                candidates_stats_list = glob.glob('tmp/data_{}*_candidates_stats.csv'.format(v))
                for candidates_stats in candidates_stats_list:
                    okrug = int(candidates_stats.split('_')[2])
                    votes['data'][v]['votes'][okrug]['candidates_stats'] = pd.read_csv(candidates_stats, index_col=0, sep=';')
            
            # теперь собираем статистику в удобной нам форме
            data = []
            
            # пройдемся по муниципальным округам
            for okrug in list(votes['data'].keys()):
            
                #чистим данные
                candidates = votes['data'][okrug]['candidates'].replace(to_replace={'party':party_aliases})
                group_parties = candidates[['party','elected']].groupby('party').count()
            
                # создаем общую статистику по избирателям
                stats = np.zeros(shape=(12))
                for oik in votes['data'][okrug]['votes'].keys():
                    stat = votes['data'][okrug]['votes'][oik]['okrug_stats'].iloc[:,1]
                    stats += stat
            
                # создаем статистику по партиям
                # количество мест
                sum_parties = group_parties.sum().values[0]
            
                # количество полученных мест
                data_parties = candidates[['party','elected']].groupby('party').count().reset_index()
            
                # процент полученных мест
                data_parties['percent'] = data_parties['elected']/sum_parties*100
            
                # собираем итоговую таблицу по округу
                tops = data_parties.sort_values('elected', ascending=False)
                c = pd.DataFrame({'okrug':okrug}, index=[0])
                c['top1'], c['top1_elected'], c['top1_percent'] = tops.iloc[0,:3]
                c['top2'], c['top2_elected'], c['top2_percent'] = tops.iloc[1,:3]
                c['top3'], c['top3_elected'], c['top3_percent'] = tops.iloc[2,:3]
                c['voters_oa'], c['state_rec'], c['state_given'], c['state_anticip'], c['state_out'], c['state_fired'], c['state_box'], c['state_move'], c['state_error'], c['state_right'], c['state_lost'] , c['state_unacc'] = stats 
                c['voters_percent'] = (c['state_rec'] - c['state_fired'])/c['voters_oa']*100
                c['total'] = sum_parties
                c['full'] = (c['top1_elected']== sum_parties)
            
                # добавляем полученный датафрейм в список
                data.append(c)
            
            # создаем итоговый датафрейм
            winners = pd.concat(data,axis=0)

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


            Базовая работа с геоданными в geopandas


            Для работы с геоданными мы будем использовать библиотеку geopandas. Что такое geopandas? Это расширение функциональности pandas географическими абстракциями (унаследованными из Shapely), которые позволяют нам проводит аналитические географические операции с геоданными: выборки, оверлей, аггрегация (как, например, в PostGIS для Postgresql).


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


            Важное отступление

            Следует обратить внимание, что geopandas неохотно ставится через pip в стандартной установке Python в среде Windows. Проблема, как обычно, в зависимостях. Geopandas опирается на абстракции библиотеки fiona, у которой нет официальных сборок под Windows. Идеально использовать среду Linux, например, в docker-контейнере. Кроме того, в Windows можно использовать менеджер conda, он все зависимости подтягивает из своих репозиториев.


            C геометрией муниципальных образований все достаточно просто. Их можно легко забрать из OpenStreetMap (подробнее тут) или, например, из выгрузок NextGIS. Я использую уже готовые шейпы.


            Итак, начнем! Выполняем нужные импорты, активируем графики matplotlib...


            import geopandas as gpd
            %matplotlib inline
            mo_gdf = gpd.read_file('atd/mo.shp')
            mo_gdf.head()


            Как видите, это привычный DataFrame. Поле geometry — представление географических объектов (в данном случае — полигонов) в виде WKT, well known text (подробнее — https://en.wikipedia.org/wiki/Well-known_text). Можно довольно просто построить карту наших объектов.


            mo_gdf.plot()


            Угадывается Москва! Правда, не совсем привычно выглядит. Причина в проекции карты. На Хабре уже есть отличный ликбез по ним.


            Итак, представим наши данные в более привычной проекции Web Mercator (исходную проекцию можно легко получить по параметру crs). Окрасим полигоны по названию Административного округа. Ширину линий выставим 0,5. Метод окраски cmap использует стандартные значения matplotlib (если вы, как и я, не помните их наизусть, то вот шпаргалка). Чтобы увидеть легенду карты, задаем параметр legend. Ну а figsize отвечает за размер нашей карты.


            mo_gdf_wm = mo_gdf.to_crs({'init' :'epsg:3857'}) #непосредственно преобразование проекции
            mo_gdf_wm.plot(column = 'ABBREV_AO', linewidth=0.5, cmap='plasma', legend=True, figsize=[15,15])


            Можно построить карту и по типу муниципального образования:


            mo_gdf_wm.plot(column = 'TYPE_MO', linewidth=0.5, cmap='plasma', legend=True, figsize=[15,15])


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


            winners['municipal_low'] = winners['okrug'].str.lower()
            winners['municipal_low'] = winners['municipal_low'].str.replace('ё', 'е')
            mo_gdf_wm['name_low'] = mo_gdf_wm['NAME'].str.lower()
            mo_gdf_wm['name_low'] = mo_gdf_wm['name_low'].str.replace('ё', 'е')
            full_gdf = winners.merge(mo_gdf_wm[['geometry', 'name_low']], left_on='municipal_low', right_on='name_low', how='left')
            full_gdf = gpd.GeoDataFrame(full_gdf)

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


            full_gdf.plot(column = 'top1', linewidth=0, cmap='GnBu', legend=True, figsize=[15,15])


            Явка:


            full_gdf.plot(column = 'voters_percent', linewidth=0, cmap='BuPu', legend=True, figsize=[15,15])


            Жители:


            full_gdf.plot(column = 'voters_oa', linewidth=0, cmap='YlOrRd', legend=True, figsize=[15,15])


            Отлично! У нас получилась симпатичная визуализация. Но хочется и базовую карту, и навигацию! На помощь нам придет библиотека cartoframes.


            Визуализация геоданных с помощью cartoframes


            Одним из самых удобных инструментов для визуализации геоданных является Carto. Для работы с этим сервисом существуюет библиотеке cartoframes, которая позволяет работать с функциями сервиса прямо из тетрадок Jupyter.


            Важное отступление

            Библиотека cartoframes требует внимательного обращения под Windows в силу особенностей разработки (например, при заливке датасета библиотека пытается использовать стиль папок linux, что приводит к печальным последствиям). С кириллическими данными можно легко отстрелить себе ногу (кодировка cp1251 может быть превращена в кракозябры). Лучше ее использовать или в docker-контейнере, или на полноценном Linux. Ставится библиотека только через pip. В windows ее можно успешно установить, предварительно поставив geopandas через conda (или поставив все зависимости руками).


            Cartoframes работает с проекцией WGS84. В нее и перепроецируем наш датасет. После соединения двух датафреймов может теряться информация о проекции. Зададим ее заново и перепроецируем.


            full_gdf.crs = ({'init' :'epsg:3857'})
            full_gdf = full_gdf.to_crs({'init' :'epsg:4326'})

            Делаем нужные импорты...


            import cartoframes
            import json
            import warnings
            warnings.filterwarnings("ignore")

            Добавляем данные от аккаунта Carto:


            USERNAME = 'ваш пользователь Carto'
            APIKEY = 'ваш ключ API'

            И, наконец, подключаемся к Carto и заливаем наш датасет:


            cc = cartoframes.CartoContext(api_key=APIKEY, base_url='https://{}.carto.com/'.format(USERNAME))
            cc.write(full_gdf, encode_geom=True, table_name='mo_votes', overwrite=True)

            Датасет можно выгрузить с Carto обратно. Но полноценный геодатафрейм пока только в проекте. Правда, можно с помощью gdal и shapely сконвертировать бинарное представление геометрии PostGIS снова в WKT.
            Особенностью работы плагина является приведением типов. Увы, в текущей версии датафрейм заливается в таблицу с назначением типа str для каждого столбца. Об этом надо помнить при работе с картами.
            Наконец, карта! Разукрасим данные, положим на базовую карту и включим навигацию. Подсмотреть схемы окрашивания можно здесь.


            Для нормальной работы с разбиением классов напишем запрос с приведением типов. Синтаксис PostgreSQL


            query_layer = 'select cartodb_id, the_geom, the_geom_webmercator, voters_oa::integer, voters_percent::float, state_out::float from mo_votes'

            Итак, явка:


            from cartoframes import Layer, BaseMap, styling, QueryLayer
            l = QueryLayer(query_layer, color={'column': 'voters_percent', 'scheme': styling.darkMint(bins=7)})
            map = cc.map(layers=[BaseMap(source='light', labels='front'), l], size=(990, 500), interactive=False)


            Количество жителей


            l = QueryLayer(query_layer, color={'column': 'voters_oa', 'scheme': styling.burg(bins=7)})
            map = cc.map(layers=[BaseMap(source='light', labels='front'), l], size=(990, 500), interactive=False)


            И, например, надомное голосование


            l = QueryLayer(query_layer, color={'column': 'state_out', 'scheme': styling.sunsetDark(bins=5)})
            map = cc.map(layers=[BaseMap(source='light', labels='front'), l], size=(990, 500), interactive=False)


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


            А теперь попробуем более сложный, но весьма гибкий способ встраивания карт в Jupyter Notebook...


            Визуализация геоданных с помощью folium


            Итак, нам хотелось бы получить не только навигацию, но и инфоокна на карте. А еще получить возможность публикации визуализации на своем сервере или на github. Нам поможет folium.


            Важное отступление

            Библиотека folium — довольно специфичная штука. Она представляет собой python-обертку вокруг JS-библиотеки Leaflet, которая как раз и отвечает за картографическую визуализацию. Следующие манипуляции выглядят не очень pythonic, но не пугайтесь, я все поясню.


            import folium

            Простая визуализация наподобие Carto делается достаточно просто.
            Что происходит?


            • мы создаем инстанс карты, m, с центром в выбранных координатах;
            • добавляем инстанс картограммы (choropleth)
              В инстансе картограммы мы задаем много атрибутов:
            • geo_data — геоданные, мы конвертируем данные нашего датафрейма в geojson;
            • name — задаем имя слоя;
            • data — непосредственно данные, их мы выбираем тоже из датафрейма;
            • key_on — ключ для соединения (обратите внимание, в geojson все атрибуты сложены в отдельный элемент, properties);
            • columns — ключ и атрибут для раскрашивания;
            • fill_color, fill_opacity, line_weight, line_opacity — цветовая шкала заливки, прозрачность заливки, ширина и прозрачность линий;
            • legend_name — заголовок легенды;
            • highlight — добавление интерактива (подсветки при наведении и приближения при клике) у объектов.

            Цветовая шкала основывается на библиотеке Color Brewer. Я крайне рекомендую при работе с картами пользоваться ей.


            m = folium.Map(location=[55.764414, 37.647859])
            m.choropleth(
                geo_data=full_gdf[['okrug', 'geometry']].to_json(),
                name='choropleth',
                data=full_gdf[['okrug', 'voters_oa']],
                key_on='feature.properties.okrug',
                columns=['okrug', 'voters_oa'],
                fill_color='YlGnBu',
                line_weight=1,
                fill_opacity=0.7,
                line_opacity=0.2,
                legend_name='type',
                highlight = True
            )
            m


            Итак, у нас получилась интерактивная картограмма. Но хотелось бы и инфоокон...


            Здесь нам придется немного хакнуть библиотеку. У нас есть партии-победители в каждом ТИК. Для каждой из них мы определим базовый цвет. Но не в каждом округе победа партии означает 100% голосов. К каждому базовому цвету мы определим 3 градации: абсолютная власть (100%), контрольный пакет (>50%) и кооперация (<50%). Напишем функцию определения цвета:


            def party_color(feature):
                party = feature['properties']['top1']
                percent = feature['properties']['top1_percent']
                if party == 'Единая Россия':
                    if percent == 100:
                        color = '#969696'
                    elif 50 < percent < 100:
                        color = '#bdbdbd'
                    else:
                        color = '#d9d9d9'
                elif party == 'Яблоко':
                    if percent == 100:
                        color = '#78c679'
                    elif 50 < percent < 100:
                        color = '#addd8e'
                    else:
                        color = '#d9f0a3'
                elif party == 'КПРФ':
                    if percent == 100:
                        color = '#ef3b2c'
                    elif 50 < percent < 100:
                        color = '#fb6a4a'
                    else:
                        color = '#fc9272'
                elif party == 'Справедливая Россия':
                    if percent == 100:
                        color = '#2171b5'
                    elif 50 < percent < 100:
                        color = '#4292c6'
                    else:
                        color = '#6baed6'
                elif party == 'Самовыдвижение':
                    if percent == 100:
                        color = '#ec7014'
                    elif 50 < percent < 100:
                        color = '#fe9929'
                    else:
                        color = '#fec44f'
                return {"fillColor":color, "fillOpacity":0.8,"opacity":0}

            Теперь напишем функцию формирования html для инфоокна:


            def popup_html(feature):
                html = '
            Распределение мест в ТИК {}
            '.format(feature['properties']['okrug']) for p in ['top1', 'top2', 'top3']: if feature['properties'][p + '_elected'] > 0: html += '
            {}: {} мест'.format(feature['properties'][p], feature['properties'][p + '_elected']) return html

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


            m = folium.Map(location=[55.764414, 37.647859], zoom_start=9)
            
            for mo in json.loads(full_gdf.to_json())['features']:
                gj = folium.GeoJson(data=mo, style_function = party_color, control=False, highlight_function=lambda x:{"fillOpacity":1, "opacity":1}, smooth_factor=0)
                folium.Popup(popup_html(mo)).add_to(gj)
                gj.add_to(m)
            m



            Наконец, мы сохраняем нашу карту. Ее можно опубликовать, например, на Github:


            m.save('tmp/map.html')

            Заключение


            С помощью простых инструментов визуализации геоданных можно найти бесконечный простор для инсайтов. А немного поработав над данными и визуализацией, можно успешно опубликовать ваши инсайты на Carto или на github. Репозиторий этот статьи: https://github.com/fall-out-bug/izbirkom_viz.


            Поздравляю, теперь вы политолог!

            Вы научились анализировать результаты выборов. Поделитесь инсайтами в коментах!

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

            https://habrahabr.ru/post/338554/


            Метки:  

            HR-робот обзванивает тысячи людей одновременно: рассказываем, как

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

            HR-робот обзванивает тысячи людей одновременно: рассказываем, как

              Хабр, привет. Период отпусков закончился, так что вливаемся в работу. Мы работаем и пишем, вы — читаете и тоже работаете (надеемся, и с нашей помощью тоже). Сегодня хотим поделиться еще одним кейсом – расскажем о нашем сотрудничестве с Роботом Верой. Эта компания помогает подбирать персонал для тех, кому нужны новые кадры. Частичная (и эффективная) автоматизация процесса рекрутинга не отменяет того, что нужно много звонить. Здесь на помощь Вере приходим мы – на Voximplant компания автоматизирует телефонный дозвон кандидатам.


              Что делает автоматика в HR?


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

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

              Обработав базу резюме, Робот Вера приступает к обзвону. Если вызов по какой-то причине не прошел (отключен телефон, занято, сбой сети), то она пытается “достучаться” по другим каналам – например, email. На усмотрение работодателя, письмо может содержать, помимо описания вакансии, ссылку для отклика, ссылку для прохождения видеоинтервью и номер телефона.

              Как рассказала нам команда Веры, 50% откликов на вакансии они получают по телефону. Оставшиеся 50 распределяются по остальным каналам привлечения кандидатов — лидогенерирующая страничка в интернете, email. Давайте рассмотрим, как устроен самый эффективный канал в рекрутинге.

              Зима Сингулярность близко!


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

              Спама, кстати, нет. Если кандидат говорит, что он не ищет работу, звонить не будут.

              В процессе звонка задействованы технологии Voximplant. Вера анализирует звонок и предоставляет своим клиентам отчет.

              Вся система телефонной связи у робота — это задача Voximplant. При этом компания может делать со звонками все, что захочет: облачные сценарии Voximplant пишутся на JavaScript и любой веб разработчик может сделать сложную телефонию за пару часов. В команде Веры экспериментируют и прикручивают “свой” синтез голоса. Модульность – это всегда хорошо, правда-правда. Добавить или убрать что-то к основной платформе Voximplant может любой программист.

              Что касается распознавания голоса Верой, то здесь бывают проблемы, винить в которых нельзя ни нас, ни ее. Практически любая современная система, которая занимается распознаванием речи, не справляется с сильными сторонними шумами. Проезжающие машины, разговоры коллег во время звонка звуки — все это очень мешает. Так что из 100% звонков около 80% оказываются успешными, в 20% наблюдаются проблемы. В случае обнаружения проблемного звонка на помощь приходит email-рассылка.

              Положительный момент — это то, что потенциальные кандидаты, которые по какой-то причине не были на связи во время телефонного звонка Веры или не увидели e-mail, могут связаться с ней позже, и работодатель увидит отклик.

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

              Очень упрощенный пример кода, как это сделать:


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

              Кроме Веры сейчас с клиентами работает и робот Захар — то есть, добавлен и мужской голос. У Веры и Захара только голоса разные, суть – одна.

              Почему Voximplant, а не Asterisk?


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

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

              Вторая причина, которая побудила обратиться к нам — возможность работы с JavaScript. Если возникает проблема, нужно добавить, изменить или убрать что-то, то, не требуется вызывать специалиста откуда-то, все можно сделать своими силами.

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

              Вера, вперед! Чемпионские результаты робота


              Вера (и Захар, да) работают очень эффективно. О процессе их работы дольше писать, чем все происходит в реальности. Обзвон соискателей Верой по заданию конкретного клиента, то есть сформированной в кабинете заявки, выполняется всего за полтора часа. Средняя конверсия поиска кандидатов — 15%. То есть из 100 человек, которых нашел робот, остается 15, которые соответствуют всем критериям и сами заинтересованы в сотрудничестве.

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

              Единовременно Робот обзванивает десятки тысяч человек. В день число звонков достигает 30-50 тысяч. С начала работы Вера провела 2300 интервью с кандидатами на разные позиции, совершила 440000 звонков соискателям, обработала миллионы анкет на работных сайтах.

              Об эффективности работы робота можно судить и по результатам, полученным компанией МТС после формирования заказа по поиску сотрудников. Компания получила 5000 откликов за месяц. Вера совершила более 40000 звонков, отправила 37000 сообщений электронной почты, более 100 кандидатов прошли видео-интервью.

              В общем и целом, у нас с Верой получился отличный симбиоз технологий, куда входят распознавание голоса, звонки, синтез речи, работа с Big Data и многое другое. Определить, где заканчивается Voximplant и начинается робот, непосвященному человеку реально сложно. И главное — все это работает!
              Original source: habrahabr.ru (comments, light).

              https://habrahabr.ru/post/338660/


              Метки:  

              Как чат-боты помогают выстраивать омниканальный опыт

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

              Как чат-боты помогают выстраивать омниканальный опыт

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

                Тотальная цифровизация и омниканальность


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

                Омниканальность – одна из главных составляющих цифровизации бизнеса. У
                этого понятия множество определений, но наиболее точно выражает его суть такое: бесшовное взаимодействие бренда с клиентами, позволяющее совершать непрерывный клиентский путь, используя разные платформы. При омниканальности все каналы объединены вокруг пользователя. Клиент, совершая customer journey, может безболезненно переключаться между каналами, и при этом получать персонализированное обслуживание. Главная цель омниканальности – создание позитивного клиентского опыта.

                По данным Gartner к 2018 году половина компаний постарается так изменить бизнес-модель, чтобы улучшить свой пользовательский опыт. А к 2020 году пользовательский опыт обгонит по своей значимости для потребителя цены и качество самого продукта (Walker).

                Омниканальность – это ключ к первоклассному клиентскому опыту, а, следовательно, и повышению прибыльности бизнеса. По данным Форбс сегодня организации используют в среднем 35 (!) разных систем для сбора данных, которые практически не интегрированы между собой. Получается, что большинство компаний не умеют идентифицировать клиента и не понимают механики его customer journey по различным цифровым каналам.

                Современным же пользователям, а особенно миллениалам и поколению Z, при общении с брендами важны:

                1. мгновенная и адекватная обратная связь
                2. качественный клиентский сервис онлайн
                3. бесшовное взаимодействие (омниканальность)
                4. понятный и удобный интерфейс, возможность заказать и оплатить товар или услугу в пару кликов.

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

                На этом пути есть несколько главных барьеров:

                — компании не могут самостоятельно работать с Big Data
                — не умеют идентифицировать клиента. Результаты исследования Dimension Data по всему миру показывают, что только 36% организаций могут отслеживать переходы между несколькими каналами.
                — не понимают, как автоматизировать работу клиентского сервиса

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

                Чат-боты и омниканальность


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

                По данным BI Intelligence, November 2016 чат-боты позволяют экономить до 30% ресурсов, пропорционально повышая и общую доходность бизнеса.

                image

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

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

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

                По данным аналитической компании iKS-Consulting среднегодовой рост рынка аутсорсинговых контакт-центров до 2020 года останется на уровне 5,5 %.

                И второй момент – качественный клиентский сервис без обработки текстовых каналов сегодня невозможен. Текстовые каналы увеличивают долю в общем объеме коммуникаций, а это ставит задачу перед бизнесом уметь с ними эффективно работать. Для общения с компаниями 90% современных потребителей предпочитают использовать мессенджеры (по данным Twilio). Это один из ключевых моментов, на который делают ставку разработчики чат-ботов – автоматизация работы по обработке простых первичных обращений. Например, внедрение в службу поддержки бота каршеринга YouDrive помогло на 2/3 снизить число звонков в компанию.

                Большинство современных потребителей не против первых контактов с бизнесом при помощи чат-ботов. Чтобы быстро получить ответы свои вопросы, многие готовы взаимодействовать с чат-ботами. По сведениям emarketer задавать вопросы компаниям в онлайн-чатах и мессенджерах уже предпочитает треть всех активных интернет-пользователей.
                Веб-помощник Nina крупного шведского банка Swedbank ведет до 30 000 разговоров в мессенджере в месяц и может обрабатывать более 350 различных запросов клиентов. Такой уровень сервиса — это то, к чему стремятся многие компании.

                Известны цифры, согласно которым повышение качества обработки запросов клиентов на 10% может повысить эффективность продаж почти в 2 раза. Используя чат-ботов, можно добиться повышения качества клиентского сопровождения, не делая при этом дополнительных расходов на расширение штата отдела продаж.

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

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

                Результаты исследования Dimension Data по всему миру показывают, что лишь 17% способны определить проблемные точки взаимодействия на пути клиента. Для большинства компаний составить карту переходов клиентов между всеми каналами и проанализировать проблемные точки клиентского опыта – непосильная задача. А именно эти места являются точками роста для проактивного цифрового общения с клиентами. Воплощать в жизнь сценарии проактивного взаимодействия с пользователями помогают умные чат-боты в связке с искусственным интеллектом и Big Data.

                Где и в чем бизнесу пригодятся боты?


                Согласно исследованиям businesswire.com сегодня самые перспективные отрасли для применения ботов связаны с клиентским обслуживанием. В первую очередь, это банковская сфера, страхование и e-commerce, а также бронирование билетов и туров.

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

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

                В стартапе HelloAva бот работает как эксперт, который дает клиентам персональные рекомендации по уходу за кожей.

                А вот пример успешного применения продвинутого бота — умный чат-бот Зоряна. Его внедрил в свою работу украинский оператор связи Киевстар. В базе Зоряны 12 000 стандартизированных ответов на вопросы клиентов, бот помогает с решением 70% входящих вопросов. Он работает на сайте компании, в ее соцсетях и мессенджерах, помогает он и колл-центру оператора. Ссылка на Зоряну есть в стандартном голосовом меню, при желании пользователь может задать свои вопросы боту: 25% звонящих переходят из IVR к Зоряне. И только 10% из этих 25% потом снова перезванивают в КЦ. Это говорит о том, что бот прекрасно справляется с решением простых клиентских запросов, разгружает живых операторов и берет основную рутину общения с клиентами на себя.

                По прогнозам Market Research Future мировой рынок чат-ботов вырастет к 2023 году на 37% и достигнет оборота в 6 млрд долларов. Использование ботов для эффективного общения с клиентами в цифровых каналах, только набирает обороты и в ближайшем будущем откроет бизнесу широкие перспективы.

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

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

                Что же в сухом остатке?


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

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

                Поддержка клиентов по цифровым каналам – это обещание скорости, эффективности и, в значительной мере, ощущение контроля. Чат-боты – отличный инструмент для этого, с помощью которого можно создавать настоящий омниканальный клиентский опыт. Однако, важно понимать, как можно грамотно адаптировать ботов к бизнес-процессам и структуре компании.
                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/338656/


                Метки:  

                Comodo Group сообщают о четырехкратном увеличении числа киберугроз

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

                Comodo Group сообщают о четырехкратном увеличении числа киберугроз

                  Компания Comodo Group Inc. сообщает, что во втором квартале этого года количество вредоносных программ выросло почти в 4 раза по сравнению с первым кварталом. Согласно отчету, количество заражений увеличилось с 25 млн до 97 млн.

                  По данным Лаборатории Касперского, им удалось обнаружить и отразить 45 тыс. атак червя WannaCry в более чем 74 странах. А Petya, новая итерация которого (NotPetya) появилась 27 июня, поразил 2 тыс. компаний с помощью EternalBlue.


                  / Flickr / Christoph Scholz / CC

                  Чаще всего заражения происходили с помощью троянов — 5,8 млн случаев. За ними следуют черви — 4,5 млн заражений и 2,6 млн традиционных вирусов. Также было выявлено 209 тыс. использований бэкдоров.

                  «Инфекции» были зафиксированы в 236 из 253 доменов высшего уровня. Лидерами по числу атак оказались Россия, Индонезия и Филиппины. США же заняли первое место по числу заражений «троянскими конями».

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

                  Поэтому многие государства усиливают работу в сфере противодействия киберпреступлениям. Холгер Мунк (Holger Muench), президент Федерального ведомства уголовной полиции Германии призывает к ужесточению законов для борьбы с киберпреступностью в даркнете и другими криминальными группировками. А Япония запускает несколько тренировочных центров для подготовки специалистов по безопасности и исследования кибергуроз.

                  В США член палаты представителей штата Джорджия Том Грейвс (Tom Graves) внес на рассмотрение законопроект, предоставляющий жертвам продолжающихся кибератак более широкие права, касающиеся ответных действий. В частности, пострадавшие от деятельности хакеров смогут предпринимать агрессивные контрмеры для защиты своей информации, то есть взламывать системы злоумышленников в ответ. Документ также описывает «активные меры киберзащиты», под которыми подразумеваются: установление преступника и передача этой информации правоохранительным органам.

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

                  Чего ожидать к концу года


                  Согласно прогнозам РАЭК и отчету об актуальных киберугрозах от Positive Technologies, число и сложность атак будут только расти. Есть даже вероятность еще одной крупной атаки типа DDoS, так как сервисы-вымогатели по сдаче троянов в аренду продолжают набирать популярность. Атаки будут эволюционировать в таких средах, как облачные технологии и мобильное ПО.

                  Стоит отметить, что опасность грозит и IoT-технологиям. По данным Nexusguard, рост числа атак на IoT-сети вырос на 380% за последние полгода. Это объясняется как растущей популярностью IoT, так и уязвимостью технологии. Подробнее о других трендах в киберугозах можно почитать здесь и здесь.

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


                  / Flickr / Henri Bergius / CC

                  Интеллектуальные методы защиты


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

                  Одним из таких интеллектуальных решений является Deep Instinct, которое использует глубокое обучение для распознавания вредоносного кода. Разработчики отобрали миллионы файлов всех разновидностей, классифицировали их и передали сети для тренировки. Конечным результатом стала модель прогнозирования, которую компания назвала «инстинктом». Решение может обнаруживать уязвимости нулевого дня, новые вредоносные программы и изощренные целевые кибератаки (APT).

                  Еще один способ борьбы за безопасность с помощью ИИ был представлен компанией Microsoft. Они создали инструмент для разработчиков — Microsoft Security Risk Detection — который ищет ошибки и уязвимости в ПО, готовящемся к релизу.

                  По словам исследователя Microsoft Дэвида Молнара (David Molnar), для проведения фаззинга компании обычно нанимают экспертов по безопасности. Но поскольку объем создаваемого и используемого программного обеспечения увеличился, тестирование усложнилось. При этом важность этой задачи выросла в несколько раз из-за стремительного роста числа кибератак.

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

                  Представители компании также заявили, что Windows Defender в новом обновлении Creators Update для Windows использует возможности искусственного интеллекта для защиты от вредоносного ПО.

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

                  О Comodo Group

                  Comodo Group — американская компания-производитель программного обеспечения. Является одним из крупнейших поставщиков сертификатов, предлагая бесплатные сертификаты для персональной электронной почты. Основана в 1998 году.

                  P.S. Несколько материалов по теме из нашего блога:

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

                  https://habrahabr.ru/post/338482/


                  Метки:  

                  Почта России: страшно ли жить после Страшнова?

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

                  Почта России: страшно ли жить после Страшнова?

                    image
                    Ждун или дрон? Бесконечный выбор в российской Матрице.

                    Август-2017. Одно из отделений Почты России. Слева закуток Почты Банка, в котором двое сотрудников играются в своих гаджетах. Вокруг них пустота. Прямо — три окошка Почты. Работает только одно. Очередь человек в 20 к нему. Надо стоять — деться некуда. Терминал электронной очереди сломался через пару недель после установки.

                    Почти каждый посетитель впереди, когда подходит его очередь, напряжённо спрашивает, куда делась его посылка, должна была прийти давным-давно. Кассир извиняется, говорит, что уже несколько месяцев работает одна за десятерых, и даже посылки месячной давности ещё не отсортированы. Или не извиняется, а просто кричит, потому что задолбали с одним и тем же вопросом, который её начальству надо задать. За окошком на полу видны последствия работы “одной за десятерых”: проходы завалены коробками и пакетами.

                    Это “Почта России”-2017. Страшнов ушёл в июле. Но судя по тому, что проблемы того же Иркутского УФПС (а сценка вначале — как раз из отделения Иркутска) начались весной, Страшнов “ушёл” ещё раньше. Связь, конечно, опосредованная, но тут стоит сказать про большую рыбу, к голове которой пришла прокуратура. И голова в своих беспокойствах про хвост совсем перестала думать, а хвост без головы — шевелиться. Страшно ли жить Почте после Страшнова? Надо разобраться.

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

                    1. Коллапс


                    ...стал первой проблемой, с которой столкнулся новый гендир Почты, и поводом, по которому он вообще очутился здесь. Чтобы не допустить подобного, Страшнов стал вкладываться в современные автоматизированные сотртировочные центры. И первый был запущен во Внуково в ноябре того же года. С остальными всё происходило не так быстро и паралича всё-таки избежать не удалось. В 2016 новопостроенный (в 2013) ЛЦ Внуково переоснащён на автоматизированный манер, однако в декабре того же года не выдержал напора (хотя пример довольно спорный, тут нужны очевидцы). Другой пример объективнее — Казанский ЛЦ был запущен в тестовом порядке в декабре 2016, однако запуск провалился. И некоторые примеры помельче — касаемые рядовых ОПС — Рязань, например, или Томск (тут можно чуть ли не каждое ОПС в пример привести).
                    С другой стороны, в аэропорту Толмачево г. Новосибирска внедрена в том же 2016-м японская технология сортировки — на пробки там никто громко не жаловался.
                    С остальными автоматизированными сортировочными центрами как-то не сложилось. Год назад мы уже писали статью в том числе на эту тему. В соответствии с планами Минкомсвязи годичной давности уже должны быть сданы ЛСЦ Ростова, Санкт-Петербурга, и начато строительство Екатеринбургского и Красноярского ЛСЦ. Ни один не сдан — а сроки сдвинуты.
                    А ЛСЦ Хабаровска лучше всех вписывается в “концепцию понедельника” (“в понедельник точно начну бегать/строить/курить”) — взгляните на новости за 2014, 2015, 2016, 2017. В последней радует заголовок — “В Хабаровске в 2018 году начнут строить логистический центр “Почты России”. Ждём очередной новости о радужных перспективах.

                    Но! Несмотря на оставшуюся проблему со скоростью доставки, Почта России продемонстрировала успешное продвижение среди операторов доставки EMS. Шестое место из 198. Рядом с тройкой первых операторов (Финляндия, Молдавия и Латвия) наша огромная Почта выглядит несуразно. Для сравнения — положение сервисов стран, сравнимых по размеру территорий: США — 35, Китай — 94. За счёт чего же сделан такой рывок?

                    1. Это всего лишь итоги первого квартала 2017 года, в конце года наверняка будет откат. Но с приходом Страшнова Почта каждый год только прибавляла (с 92-го, через 81-е к 59-му). Проблема только в том, что на англоязычных ресурсах EMS никакого рейтинга найти не удалось. Может, плохо искали. Может, рейтинг не так популярен в остальном мире. Остаётся принять на веру данные ПР о крутизне этого рейтинга.
                    2. Экспорт — за счёт увеличения количества экспортных отправлений EMS на 25%. А это один из основных показателей рейтинга.
                    3. Собственно скорость доставки. К которой можно добавить скорость ответов на претензии и скорость передачи данных о статусах почтовых отправлений в систему отслеживания.

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

                    2. Субсидии


                    “… развращают любое предприятие” — золотые слова Дмитрия Страшнова, сказанные уже после прожитых на Почте лет. Ни одна копейка, доставшаяся на известном блюдечке, не ценится так, как мокрая от чёрного пота. Позиция всех дотационных, субсидируемых и инвестируемых компаний и просто любых подобных лиц (позиция внутренняя, конечно, — негласная), как правило, такая: “Зачем развиваться? Дадут же ещё?”.

                    И Почта бы жила так же. Если бы в конце 2014 года государство не прекратило её субсидировать. Страшнов говорит, что новость оказалась для них неожиданной. Потому что стратегия развития, разработанная в 2013-м Минкомсвязи, предполагала постепенный отказ от субсидий, начиная с 2018-го — заканчивая 2023-м. Хотя если Страшнов ставил цель выйти на IPO, то о субсидиях надо было забывать как можно раньше. Кризис рубля и нефтедобычи поспособствовал.
                    Чтобы ликвидировать дефицит, пришлось повышать цены на тарифы. Начали с подписок и пересмотра соглашений с издательскими домами. Те бунтовали, ненавидели, судились, но в конце концов соглашались.
                    И по итогам 2015 года вместо дефицита Почта получила чистую прибыль в 1,5 млрд. рублей. То есть отыграла и 5,5 млрд. положенных субсидий и в хороший плюс вышла. Насколько велика здесь именно роль повышения тарифов на подписку, не совсем понятно, но говоря о прекращении субсидирования, Страшнов упоминает именно этот шаг. Хотя долю среди доходов Почты подписка занимает скромную (всего 3%). Минутка арифметики помогает выяснить, что из 140 млрд. рублей доходов за 2014-й год, подписка принесла примерно 4,2 млрд. Чтобы получить дополнительный доход в 7 млрд. только за счёт подписки, нужно было увеличить её тарифы примерно в 2,7 раза. Читаем новости — всё сходится — в 2,5 раза в конце 2014-го и +10% в начале 2015-го. Хорошо, когда всё сходится. Плохо, когда только на бумаге.

                    image

                    С тех пор прибыль планомерно растёт. Цены на услуги, правда, тоже. Но основным фактором всё-таки считается рост интернет-торговли в целом, и трансграничной торговли, в частности (читай, с Китаем). И соответственно рост обрабатываемых отправлений.

                    Итого: 2014 год — прибыль 1,2 млрд (при живом ещё субсидировании), 2015 — 1,5 млрд, 2016 — 1,7 млрд. рублей.

                    image

                    Почти наверняка 2017-й год тоже закончится прибылью. Тем не менее, первым стратегическим решением новоиспечённого главы Николая Подгузова становится ходатайство Правительству о возвращении государственной поддержки (впрочем, пока неудачное). Что за этим скрывается? Искажение показателей прежним руководством, и на самом деле на Почте сейчас пустые амбары и два самолёта? Или же неумение Подгузова строить бизнес предприятия так, как это делал Страшнов? Покажет только время. Или чистосердечные признания. Да. Точно время.

                    3. Почта.Маркет


                    … Страшновым воспринимался как неуместное явление. Для глобального рынка, во всяком случае. Внутри соперничество с рядом интернет-гигантов будет тяжёлым и проигрышным. Снаружи Амазон, Алибаба и другие. Остаются только две перспективы. Предоставление площадкой услуг для отдалённых регионов. И связующее звено между заграницей и Россией, т.е. инструмент проникновения зарубежных площадок на российский рынок.
                    В целом состояние почтового маркетплейса в настоящее время можно оценить удовлетворительно.
                    Функционал неплох. Баги встречаются, но исправляются. Ассортимент дороговат по сравнению с конкурентами. Всего на площадке на 2016 год имелось более 100 тыс. товаров. И оформлено более 500 тыс. заказов.
                    Развитие видно. Например, из последнего — это внедрение торговли смартфонами и планшетами и договор с Samsung. Есть развитие. Но тестовый период по сути не закончен. И китайские конкуренты пока не видят смысла проникать в Россию через Почту.Маркет. Может, дождёмся. Хотя надо ли?

                    4. Direct mail, CRM и остальное


                    Сервис таргетированной почтовой рассылки. Когда есть миллионная база подписчиков, рано или поздно придёт мысль, что по ней можно рассылать ещё и рекламу. До выхода Почты на этот рынок объём direct mail оценивался в 600 млн. рублей. К 2020-му году эксперты предрекали пятикратный рост этого рынка за счёт участия Почты.
                    Опять же пару лет Почта России уже тестирует этот сервис. Но о кратном увеличении ФГУП пока не хвастается. Хотя понятно — копеечка в бюджет падает. Например, в Тюмени.
                    Ещё одним небольшим достижением при Страшнове стала разработка CRM-системы федерального масштаба вместо существовавших ранее локальных проектов. Ушло на это пока около 100 млн. рублей. Внедрив систему (по плану 1 октября 2017), станет проще взаимодействовать с юридическими лицами и осуществлять ту же рассылку.
                    К технологичным новинкам периода Страшнова можно добавить онлайн-услуги курьера и посылок, модернизацию сайта. И, конечно, трекинг-сервис, творящий с посылками не поддающиеся логике вещи, но жизнь всё же облегчающий.

                    5. Почта Банк и блокчейн


                    Почтовый банк — одно из главных достижений Страшнова сотоварищи. 15 лет об этом говорили. В 2016-м наконец-то совместно с группой ВТБ преобразовали Лето-банк в “Почта Банк”. Стратегия развития предусматривает скачок в тройку банков-лидеров к 2023 году. За два года банк уже поднялся по финансовым показателям с 69-го на 41-е место (по народному рейтингу занимает 15-е место). За 2016-й чистая прибыль составила 1,2 млрд. рублей. Рост активов, кредитного портфеля, клиентских пассивов, развитие digital-каналов, мобильного приложения — вот все цифры.
                    Почта России (за счёт дочернего ООО “Почтовые финансы”) владеет минус одной акцией плюс 50% банка. То есть очередные лишние 600 млн.рублей за 2016-й год у Почты есть.

                    Из положительных моментов взаимодействия с ПР можно выделить проект выдачи посылок через банковские окна. Увеличено в 10 раз присутствие в регионах (более 6 тыс. точек).

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

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

                    6. Премия и самолёты


                    — А помнишь, были времена, когда самолётов на Почте ещё не было? Молодец Страшнов, что решился. С него этот авиапарк начался. Только вот летают медленно, да крюка через Йоханнесбург дают.
                    — Да нет, это не при Страшнове. Тот не мог. Он только и сделал, что премию себе выписал в 100 млн., а затем ушёл…- утрированный диалог между любителями вести утрированные диалоги лет эдак через 10.
                    Сколько бы позитивного не внёс Страшнов в Почту, навсегда запомнится именно главный его косяк. Косвенно он не виноват. Это всё министерство связи намышковало. Но по-человечески его не поймёт ни один из нынешних и будущих рядовых почтальонов и людей. Да — топ-менеджер, да — управляет огромным предприятием, причём достаточно прогрессивно управляет, да — в том же Газпроме или Роснефти премии в разы больше. Но если у простого почтальона зарплата минимальная — то морального права принимать такую премию у руководителя нет. Вот и выходит, что формальное право на премии Страшнов и его заместители имеют, но вернуть должны. Тем более что начислялась она в 2014-м году фактически не с прибыли, а с дотаций, которые покрывали убытки.

                    Что ни говори, а собственные самолёты давно были нужны Почте. Тем интереснее позиция главы профсоюза ПР Татьяны Соколовой (с жалобы которой началась вторая проверка Генпрокуратуры по незаконной покупке самолётов, и которая, если вникнуть, олицетворяла и возглавляла борьбу старой системы с группой управленцев Страшнова). Если кратко разобрать основные тезисы, то самолёты, во-первых, достались втридорога (кредит в Альфа-банке под 13%), во-вторых, вовсе не нужны, а в-третьих, Страшнов — контрабандист. Почта ответила, что самолёты взяты в субсидированный кредит по госпрограмме “Развитие авиационной промышленности” (ставка 2,7%). Собственные самолёты экономят время, исключая лишнее взаимодействие с кем бы то ни было. А Страшнов не контрабандист, а Дмитрий Евгеньевич.
                    Генпрокуратура же отправила проверенные материалы по известному маршруту в Следственный комитет, где скорее всего, уже с мая пылится постановление об отказе в возбуждении дела. С подшитым за ним постановлением об отмене постановления об отказе. И с новым постановлением об отказе. И так до бесконечности, если понадобится.

                    7. Перед зависшим IPO


                    Наследство Николаю Подгузову досталось интересное. С одной стороны, целая россыпь инноваций, каких Почта не видела никогда до этого. Вектор в сторону модернизации всех элементов системы Страшнов держал крепко. С другой, — так и не дошедшие до приятных (или хотя бы удовлетворяющих) цифр зарплаты почтальонов, никуда не исчезнувшие проблемы с коллапсами, и это алчное эхо от премии, которое будет громыхать рядом с Почтой ещё очень много зим.
                    Единственное, чего самому Страшнову не хватило в работе, и что он считает своей главной неудачей — это так и несостоявшееся акционирование Почты России. Причём готовность к выходу на биржу, по его мнению, была ещё в 2015-м году. Страшнов добился финансовой прозрачности предприятия, регулярно публикуя подробные отчёты. Долю в Почте России готов был купить китайский Алибаба. На многочисленных конференциях Страшнов предлагал десятки разнообразных выгодных вариантов, возникающих после проведения IPO, японскую, немецкую и другие модели развития. Не вышло. Про причины он говорит следующее:

                    1. Непринятие законов о связи и акционировании
                    2. Отсутствие политического спонсорства
                    3. Не поговорил с Путиным на эти темы.

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

                    https://habrahabr.ru/post/338610/


                    Переход с ASP.NET к ASP.NET Core 2.0

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

                    Переход с ASP.NET к ASP.NET Core 2.0

                    • Tutorial

                    Эта статья является переводом справочного руководства по переносу приложений из ASP.NET в ASP.NET Core 2.0. Ссылка на оригинал
                    В силу некоторых причин, у нас возникла необходимость перейти с ASP.NET в ASP.NET Core 1.1., о том, как это у нас получилось, читайте тут.


                    Содержание


                    1. Требования
                    2. Выбор Фреймворка
                    3. Различия в структуре проекта
                    4. Замена Global.asax
                    5. Хранение конфигураций
                    6. Встроенный механизм Dependency Injection
                    7. Работа со статическими файлами

                    Требования


                    • .NET Core 2.0.0 SDK или более поздняя версия.


                    Выбор фреймворка


                    Для работы с ASP.NET Core 2.0 проектом, разработчику предстоит сделать выбор – использовать .NET Core, .NET Framework или использовать сразу оба варианта. В качестве дополнительной информации можно использовать руководство Choosing between .NET Core and .NET Framework for server apps (вкратце можно сказать что .NET core является кроссплатформенной библиотекой, в отличие от .NET Framework) для того чтобы понять, какой Фреймворк для вас окажется наиболее предпочтительным.
                    После выбора нужного Фреймворка в проекте необходимо указать ссылки на пакеты NuGet.
                    Использование .NET Core позволяет устранить многочисленные явные ссылки на пакеты, благодаря объединенному пакету (мета пакету) ASP.NET Core 2.0. Так выглядит установка мета пакета Microsoft.AspNetCore.All в проект:


                    
                      
                    

                    Различия в структуре проекта


                    Структура файла проекта .csproj была упрощена в ASP.NET Core. Вот некоторые значительные изменения:
                    • Явное указание файлов является необязательным для добавления их в проект. Таким образом, уменьшается риск конфликтов в процессе слияния XML, если над проектом работает большая команда
                    • Больше нет GUID ссылок на другие проекты, что улучшает читаемость
                    • Файл можно редактировать без его выгрузки из Visual Studio:



                    Замена Global.asax


                    Точкой входа для ASP.NET приложений является Global.asax файл. Такие задачи, как конфигурация маршрута и регистрация фильтров и областей, обрабатываются в файле Global.asax


                    public class MvcApplication : System.Web.HttpApplication
                    {
                        protected void Application_Start()
                        {
                            AreaRegistration.RegisterAllAreas();
                            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                            RouteConfig.RegisterRoutes(RouteTable.Routes);
                            BundleConfig.RegisterBundles(BundleTable.Bundles);
                        }
                    }

                    Этот подход тесно связывает приложение и сервер, на котором развернуто приложение. Для уменьшения связности был представлен OWIN как средство, обеспечивающее более правильный путь совместного использования нескольких фреймворков вместе.
                    OWIN позволяет добавить в конвейер запроса только необходимые модули. Среда выполнения использует Startup для конфигурации сервисов и конвейера запросов.
                    Startupрегистрирует набор промежуточных сервисов (middleware) вместе с приложением. Для каждого запроса приложение вызывает поочередно каждый из набора промежуточных сервисов, имеющих указатель на первый элемент связанного списка обработчиков.
                    Каждый компонент промежуточного сервиса может добавить один или несколько обработчиков в конвейер обработки запросов. Это происходит с помощью возврата ссылки на обработчик, который находится в начале списка.
                    И обработчик, закончив свою работу, вызывает следующий обработчик из очереди.
                    В ASP.NET Core, точкой входа в приложении является класс Startup, с помощью которого мы нивелируем зависимость от Global.asax.
                    Если изначально был выбран .NET Framework то при помощи OWIN мы можем сконфигурировать конвейер запросов как в следующем примере:


                    using Owin;
                    using System.Web.Http;
                    
                    namespace WebApi
                    {
                        // Заметка: По умолчанию все запросы проходят через этот конвейер OWIN. В качестве альтернативы вы можете отключить это, добавив appSetting owin: AutomaticAppStartup со значением «false».
                        // При отключении вы все равно можете использовать приложения OWIN для прослушивания определенных маршрутов, добавив маршруты в файл global.asax с помощью MapOwinPath или расширений MapOwinRoute на RouteTable.Routes
                    
                        public class Startup
                        {
                            // Вызывается один раз при запуске для настройки вашего приложения.
                            public void Configuration(IAppBuilder builder)
                            {
                                HttpConfiguration config = new HttpConfiguration();
                    //Здесь настраиваем маршруты по умолчанию, 
                                config.Routes.MapHttpRoute("Default", "{controller}/{customerID}", new { controller = "Customer", customerID = RouteParameter.Optional });
                    //Указываем на то что в качестве файла конфигурации мы будем использовать xml вместо json 
                    
                                config.Formatters.XmlFormatter.UseXmlSerializer = true;
                                config.Formatters.Remove(config.Formatters.JsonFormatter);
                                // config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;
                    
                                builder.UseWebApi(config);
                            }
                        }
                    }

                    Также при необходимости здесь мы можем добавить другие промежуточные сервисы в этот конвейер (загрузка сервисов, настройки конфигурации, статические файлы и т.д.).
                    Что касается версии фреймворка .NET Core, то здесь используется подобный подход, но не без использования OWIN для определения точки входа. В качестве альтернативы используется метод Main в Program.cs (по аналогии с консольными приложениям), где и происходит загрузка Startup:


                    using Microsoft.AspNetCore;
                    using Microsoft.AspNetCore.Hosting;
                    
                    namespace WebApplication2
                    {
                        public class Program
                        {
                            public static void Main(string[] args)
                            {
                                BuildWebHost(args).Run();
                            }
                    
                            public static IWebHost BuildWebHost(string[] args) =>
                                WebHost.CreateDefaultBuilder(args)
                                    .UseStartup()
                                    .Build();
                        }
                    }

                    Startup должен включать метод Configure. В Configure определяется, какие сервисы будут использоваться в конвейере запроса. В следующем примере (взятом из стандартного шаблона web-сайта), несколько методов расширения используются для настройки конвейера с поддержкой:
                    • BrowserLink
                    • Error pages
                    • Static files
                    • ASP.NET Core MVC
                    • Identity


                    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
                    {
                        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
                        loggerFactory.AddDebug();
                    
                        if (env.IsDevelopment())
                        {
                            app.UseDeveloperExceptionPage();
                            app.UseDatabaseErrorPage();
                            app.UseBrowserLink();
                        }
                        else
                        {
                            app.UseExceptionHandler("/Home/Error");
                        }
                    
                        app.UseStaticFiles();
                    
                        app.UseIdentity();
                    
                        app.UseMvc(routes =>
                        {
                            routes.MapRoute(
                                name: "default",
                                template: "{controller=Home}/{action=Index}/{id?}");
                        });
                    }

                    В итоге мы имеем разделение среды выполнения и приложения, что дает нам возможность осуществить переход на другую платформу в будущем.
                    Заметка: Для более глубокого понимания ASP.NET Core Startup и Middleware, можно изучить Startup in ASP.NET Core


                    Хранение конфигураций


                    ASP.NET поддерживает сохранение настроек. Например, это настройки, которые используются средой выполнения, где было развернуто приложение. Сам подход заключался в том, что для хранение пользовательских key-value пар использовалась секция в файле Web.config:


                    
                      
                      
                    

                    Приложение получало доступ к этим настройкам с помощью коллекции ConfigurationManager.AppSettings из пространства имен System.Configuration :


                    string userName = System.Web.Configuration.ConfigurationManager.AppSettings["UserName"];
                    string password = System.Web.Configuration.ConfigurationManager.AppSettings["Password"];

                    В ASP.NET Core мы можем хранить конфигурационные данные для приложения в любом файле и загружать их с помощью сервисов на начальном этапе загрузки.
                    Файл, используемый по умолчанию в новом шаблонном проекте appsettings.json:


                    {
                      "Logging": {
                        "IncludeScopes": false,
                        "LogLevel": {
                          "Default": "Debug",
                          "System": "Information",
                          "Microsoft": "Information"
                        }
                      },
                      // Здесь можно указать настраиваемые параметры конфигурации. Поскольку это JSON, все представлено в виде пар символов: значение  
                     // Как назвать раздел, определяет сам разработчик
                      "AppConfiguration": {
                        "UserName": "UserName",
                        "Password": "Password"
                      }
                    }

                    Загрузка этого файла в экземпляр IConfiguration для приложения происходит в Startup.cs:


                    public Startup(IConfiguration configuration)
                    {
                        Configuration = configuration;
                    }
                    
                    public IConfiguration Configuration { get; }

                    А вот так приложение использует Configuration для получения этих настроек:


                    string userName = Configuration.GetSection("AppConfiguration")["UserName"];
                    string password = Configuration.GetSection("AppConfiguration")["Password"];

                    Есть другие способы, основанные на данном подходе, которые позволяют сделать процесс более надежным, например Dependency Injection (DI).
                    Подход DI обеспечивает доступ к строго типизированному набору объектов конфигурации.


                    // Предположим, AppConfiguration - это класс, который представляет строго типизированную версию раздела AppConfiguration
                    services.Configure(Configuration.GetSection("AppConfiguration"));

                    Заметка: Для более глубокого понимания конфигураций ASP.NET Core, можно ознакомится с Configuration in ASP.NET Core.


                    Встроенный механизм Dependency Injection


                    Важной целью при создании больших масштабируемых приложений является ослабление связи между компонентами и сервисами. Dependency Injection – распространенная техника для решения данной проблемы и ее реализация является встроенным в ASP.NET Core компонентом.
                    В приложениях ASP.NET разработчики использовали сторонние библиотеки для внедрения Injection Dependency. Примером такой библиотеки является Unity .
                    Пример настройки Dependency Injection с Unity — это реализация UnityContainer, обернутая в IDependencyResolver:


                    using Microsoft.Practices.Unity;
                    using System;
                    using System.Collections.Generic;
                    using System.Web.Http.Dependencies;
                    
                    public class UnityResolver : IDependencyResolver
                    {
                        protected IUnityContainer container;
                    
                        public UnityResolver(IUnityContainer container)
                        {
                            if (container == null)
                            {
                                throw new ArgumentNullException("container");
                            }
                            this.container = container;
                        }
                    
                        public object GetService(Type serviceType)
                        {
                            try
                            {
                                return container.Resolve(serviceType);
                            }
                            catch (ResolutionFailedException)
                            {
                                return null;
                            }
                        }
                    
                        public IEnumerable GetServices(Type serviceType)
                        {
                            try
                            {
                                return container.ResolveAll(serviceType);
                            }
                            catch (ResolutionFailedException)
                            {
                                return new List();
                            }
                        }
                    
                        public IDependencyScope BeginScope()
                        {
                            var child = container.CreateChildContainer();
                            return new UnityResolver(child);
                        }
                    
                        public void Dispose()
                        {
                            Dispose(true);
                        }
                    
                        protected virtual void Dispose(bool disposing)
                        {
                            container.Dispose();
                        }
                    }

                    Создаем экземпляр своего UnityContainer, регистрируем свою службу и устанавливаем разрешение зависимости для HttpConfiguration в новый экземпляр UnityResolver для нашего контейнера:


                    public static void Register(HttpConfiguration config)
                    {
                        var container = new UnityContainer();
                        container.RegisterType(new HierarchicalLifetimeManager());
                        config.DependencyResolver = new UnityResolver(container);
                    
                        // Опустим остальную часть реализации
                    }

                    Далее производим инъекцию IProductRepository там, где это необходимо:


                    public class ProductsController : ApiController
                    {
                        private IProductRepository _repository;
                    
                        public ProductsController(IProductRepository repository)  
                        {
                            _repository = repository;
                        }
                    
                    }

                    Поскольку Dependency Injection является частью ядра ASP.NET Core, мы можем добавить свой сервис в метод ConfigureServices внутри Startup.cs:


                    public void ConfigureServices(IServiceCollection services)
                    {
                        //Добавляем сервис приложения
                        services.AddTransient();
                    }

                    И далее инъекцию репозитория можно осуществить в любом месте, как и в случае с Unity.
                    Заметка: Подробности можно посмотреть в Dependency Injection in ASP.NET Core


                    Работа с статическими файлами


                    Важной частью веб-разработки является возможность обслуживания статики. Самые распространенные примеры статики — это HTML, CSS, JavaScript и картинки.
                    Эти файлы нужно сохранять в общей папке приложения (или например в CDN) чтобы в дальнейшем они были доступны по ссылке. В ASP.NET Core был изменен подход для работы с статикой.
                    В ASP.NET статика хранится в разных каталогах.
                    А в ASP.NET Core статические файлы по умолчанию хранятся в «web root» (/ wwwroot). И доступ к этим файлам осуществляется с помощью метода расширения UseStaticFiles из Startup.Configure:

                    public void Configure(IApplicationBuilder app)
                    {
                        app.UseStaticFiles();
                    }

                    К примеру, изображения находящееся в папке wwwroot/images будет доступно из браузера по адресу http:///images/.
                    Заметка: Если был выбран .NET Framework, то дополнительно нужно будет установить NuGet пакет Microsoft.AspNetCore.StaticFiles.
                    Заметка: Для более подробной ссылки на обслуживание статических файлов в ядре ASP.NET см. Introduction to working with static files in ASP.NET Core.

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

                    https://habrahabr.ru/post/338298/


                    Метки:  

                    Переход с ASP.NET к ASP.NET Core 2.0

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

                    Переход с ASP.NET к ASP.NET Core 2.0

                    • Tutorial

                    Эта статья является переводом справочного руководства по переносу приложений из ASP.NET в ASP.NET Core 2.0. Ссылка на оригинал
                    В силу некоторых причин, у нас возникла необходимость перейти с ASP.NET в ASP.NET Core 1.1., о том, как это у нас получилось, читайте тут.


                    Содержание


                    1. Требования
                    2. Выбор Фреймворка
                    3. Различия в структуре проекта
                    4. Замена Global.asax
                    5. Хранение конфигураций
                    6. Встроенный механизм Dependency Injection
                    7. Работа со статическими файлами

                    Требования


                    • .NET Core 2.0.0 SDK или более поздняя версия.


                    Выбор фреймворка


                    Для работы с ASP.NET Core 2.0 проектом, разработчику предстоит сделать выбор – использовать .NET Core, .NET Framework или использовать сразу оба варианта. В качестве дополнительной информации можно использовать руководство Choosing between .NET Core and .NET Framework for server apps (вкратце можно сказать что .NET core является кроссплатформенной библиотекой, в отличие от .NET Framework) для того чтобы понять, какой Фреймворк для вас окажется наиболее предпочтительным.
                    После выбора нужного Фреймворка в проекте необходимо указать ссылки на пакеты NuGet.
                    Использование .NET Core позволяет устранить многочисленные явные ссылки на пакеты, благодаря объединенному пакету (мета пакету) ASP.NET Core 2.0. Так выглядит установка мета пакета Microsoft.AspNetCore.All в проект:


                    
                      
                    

                    Различия в структуре проекта


                    Структура файла проекта .csproj была упрощена в ASP.NET Core. Вот некоторые значительные изменения:
                    • Явное указание файлов является необязательным для добавления их в проект. Таким образом, уменьшается риск конфликтов в процессе слияния XML, если над проектом работает большая команда
                    • Больше нет GUID ссылок на другие проекты, что улучшает читаемость
                    • Файл можно редактировать без его выгрузки из Visual Studio:



                    Замена Global.asax


                    Точкой входа для ASP.NET приложений является Global.asax файл. Такие задачи, как конфигурация маршрута и регистрация фильтров и областей, обрабатываются в файле Global.asax


                    public class MvcApplication : System.Web.HttpApplication
                    {
                        protected void Application_Start()
                        {
                            AreaRegistration.RegisterAllAreas();
                            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                            RouteConfig.RegisterRoutes(RouteTable.Routes);
                            BundleConfig.RegisterBundles(BundleTable.Bundles);
                        }
                    }

                    Этот подход тесно связывает приложение и сервер, на котором развернуто приложение. Для уменьшения связности был представлен OWIN как средство, обеспечивающее более правильный путь совместного использования нескольких фреймворков вместе.
                    OWIN позволяет добавить в конвейер запроса только необходимые модули. Среда выполнения использует Startup для конфигурации сервисов и конвейера запросов.
                    Startupрегистрирует набор промежуточных сервисов (middleware) вместе с приложением. Для каждого запроса приложение вызывает поочередно каждый из набора промежуточных сервисов, имеющих указатель на первый элемент связанного списка обработчиков.
                    Каждый компонент промежуточного сервиса может добавить один или несколько обработчиков в конвейер обработки запросов. Это происходит с помощью возврата ссылки на обработчик, который находится в начале списка.
                    И обработчик, закончив свою работу, вызывает следующий обработчик из очереди.
                    В ASP.NET Core, точкой входа в приложении является класс Startup, с помощью которого мы нивелируем зависимость от Global.asax.
                    Если изначально был выбран .NET Framework то при помощи OWIN мы можем сконфигурировать конвейер запросов как в следующем примере:


                    using Owin;
                    using System.Web.Http;
                    
                    namespace WebApi
                    {
                        // Заметка: По умолчанию все запросы проходят через этот конвейер OWIN. В качестве альтернативы вы можете отключить это, добавив appSetting owin: AutomaticAppStartup со значением «false».
                        // При отключении вы все равно можете использовать приложения OWIN для прослушивания определенных маршрутов, добавив маршруты в файл global.asax с помощью MapOwinPath или расширений MapOwinRoute на RouteTable.Routes
                    
                        public class Startup
                        {
                            // Вызывается один раз при запуске для настройки вашего приложения.
                            public void Configuration(IAppBuilder builder)
                            {
                                HttpConfiguration config = new HttpConfiguration();
                    //Здесь настраиваем маршруты по умолчанию, 
                                config.Routes.MapHttpRoute("Default", "{controller}/{customerID}", new { controller = "Customer", customerID = RouteParameter.Optional });
                    //Указываем на то что в качестве файла конфигурации мы будем использовать xml вместо json 
                    
                                config.Formatters.XmlFormatter.UseXmlSerializer = true;
                                config.Formatters.Remove(config.Formatters.JsonFormatter);
                                // config.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;
                    
                                builder.UseWebApi(config);
                            }
                        }
                    }

                    Также при необходимости здесь мы можем добавить другие промежуточные сервисы в этот конвейер (загрузка сервисов, настройки конфигурации, статические файлы и т.д.).
                    Что касается версии фреймворка .NET Core, то здесь используется подобный подход, но не без использования OWIN для определения точки входа. В качестве альтернативы используется метод Main в Program.cs (по аналогии с консольными приложениям), где и происходит загрузка Startup:


                    using Microsoft.AspNetCore;
                    using Microsoft.AspNetCore.Hosting;
                    
                    namespace WebApplication2
                    {
                        public class Program
                        {
                            public static void Main(string[] args)
                            {
                                BuildWebHost(args).Run();
                            }
                    
                            public static IWebHost BuildWebHost(string[] args) =>
                                WebHost.CreateDefaultBuilder(args)
                                    .UseStartup()
                                    .Build();
                        }
                    }

                    Startup должен включать метод Configure. В Configure определяется, какие сервисы будут использоваться в конвейере запроса. В следующем примере (взятом из стандартного шаблона web-сайта), несколько методов расширения используются для настройки конвейера с поддержкой:
                    • BrowserLink
                    • Error pages
                    • Static files
                    • ASP.NET Core MVC
                    • Identity


                    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
                    {
                        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
                        loggerFactory.AddDebug();
                    
                        if (env.IsDevelopment())
                        {
                            app.UseDeveloperExceptionPage();
                            app.UseDatabaseErrorPage();
                            app.UseBrowserLink();
                        }
                        else
                        {
                            app.UseExceptionHandler("/Home/Error");
                        }
                    
                        app.UseStaticFiles();
                    
                        app.UseIdentity();
                    
                        app.UseMvc(routes =>
                        {
                            routes.MapRoute(
                                name: "default",
                                template: "{controller=Home}/{action=Index}/{id?}");
                        });
                    }

                    В итоге мы имеем разделение среды выполнения и приложения, что дает нам возможность осуществить переход на другую платформу в будущем.
                    Заметка: Для более глубокого понимания ASP.NET Core Startup и Middleware, можно изучить Startup in ASP.NET Core


                    Хранение конфигураций


                    ASP.NET поддерживает сохранение настроек. Например, это настройки, которые используются средой выполнения, где было развернуто приложение. Сам подход заключался в том, что для хранение пользовательских key-value пар использовалась секция в файле Web.config:


                    
                      
                      
                    

                    Приложение получало доступ к этим настройкам с помощью коллекции ConfigurationManager.AppSettings из пространства имен System.Configuration :


                    string userName = System.Web.Configuration.ConfigurationManager.AppSettings["UserName"];
                    string password = System.Web.Configuration.ConfigurationManager.AppSettings["Password"];

                    В ASP.NET Core мы можем хранить конфигурационные данные для приложения в любом файле и загружать их с помощью сервисов на начальном этапе загрузки.
                    Файл, используемый по умолчанию в новом шаблонном проекте appsettings.json:


                    {
                      "Logging": {
                        "IncludeScopes": false,
                        "LogLevel": {
                          "Default": "Debug",
                          "System": "Information",
                          "Microsoft": "Information"
                        }
                      },
                      // Здесь можно указать настраиваемые параметры конфигурации. Поскольку это JSON, все представлено в виде пар символов: значение  
                     // Как назвать раздел, определяет сам разработчик
                      "AppConfiguration": {
                        "UserName": "UserName",
                        "Password": "Password"
                      }
                    }

                    Загрузка этого файла в экземпляр IConfiguration для приложения происходит в Startup.cs:


                    public Startup(IConfiguration configuration)
                    {
                        Configuration = configuration;
                    }
                    
                    public IConfiguration Configuration { get; }

                    А вот так приложение использует Configuration для получения этих настроек:


                    string userName = Configuration.GetSection("AppConfiguration")["UserName"];
                    string password = Configuration.GetSection("AppConfiguration")["Password"];

                    Есть другие способы, основанные на данном подходе, которые позволяют сделать процесс более надежным, например Dependency Injection (DI).
                    Подход DI обеспечивает доступ к строго типизированному набору объектов конфигурации.


                    // Предположим, AppConfiguration - это класс, который представляет строго типизированную версию раздела AppConfiguration
                    services.Configure(Configuration.GetSection("AppConfiguration"));

                    Заметка: Для более глубокого понимания конфигураций ASP.NET Core, можно ознакомится с Configuration in ASP.NET Core.


                    Встроенный механизм Dependency Injection


                    Важной целью при создании больших масштабируемых приложений является ослабление связи между компонентами и сервисами. Dependency Injection – распространенная техника для решения данной проблемы и ее реализация является встроенным в ASP.NET Core компонентом.
                    В приложениях ASP.NET разработчики использовали сторонние библиотеки для внедрения Injection Dependency. Примером такой библиотеки является Unity .
                    Пример настройки Dependency Injection с Unity — это реализация UnityContainer, обернутая в IDependencyResolver:


                    using Microsoft.Practices.Unity;
                    using System;
                    using System.Collections.Generic;
                    using System.Web.Http.Dependencies;
                    
                    public class UnityResolver : IDependencyResolver
                    {
                        protected IUnityContainer container;
                    
                        public UnityResolver(IUnityContainer container)
                        {
                            if (container == null)
                            {
                                throw new ArgumentNullException("container");
                            }
                            this.container = container;
                        }
                    
                        public object GetService(Type serviceType)
                        {
                            try
                            {
                                return container.Resolve(serviceType);
                            }
                            catch (ResolutionFailedException)
                            {
                                return null;
                            }
                        }
                    
                        public IEnumerable GetServices(Type serviceType)
                        {
                            try
                            {
                                return container.ResolveAll(serviceType);
                            }
                            catch (ResolutionFailedException)
                            {
                                return new List();
                            }
                        }
                    
                        public IDependencyScope BeginScope()
                        {
                            var child = container.CreateChildContainer();
                            return new UnityResolver(child);
                        }
                    
                        public void Dispose()
                        {
                            Dispose(true);
                        }
                    
                        protected virtual void Dispose(bool disposing)
                        {
                            container.Dispose();
                        }
                    }

                    Создаем экземпляр своего UnityContainer, регистрируем свою службу и устанавливаем разрешение зависимости для HttpConfiguration в новый экземпляр UnityResolver для нашего контейнера:


                    public static void Register(HttpConfiguration config)
                    {
                        var container = new UnityContainer();
                        container.RegisterType(new HierarchicalLifetimeManager());
                        config.DependencyResolver = new UnityResolver(container);
                    
                        // Опустим остальную часть реализации
                    }

                    Далее производим инъекцию IProductRepository там, где это необходимо:


                    public class ProductsController : ApiController
                    {
                        private IProductRepository _repository;
                    
                        public ProductsController(IProductRepository repository)  
                        {
                            _repository = repository;
                        }
                    
                    }

                    Поскольку Dependency Injection является частью ядра ASP.NET Core, мы можем добавить свой сервис в метод ConfigureServices внутри Startup.cs:


                    public void ConfigureServices(IServiceCollection services)
                    {
                        //Добавляем сервис приложения
                        services.AddTransient();
                    }

                    И далее инъекцию репозитория можно осуществить в любом месте, как и в случае с Unity.
                    Заметка: Подробности можно посмотреть в Dependency Injection in ASP.NET Core


                    Работа с статическими файлами


                    Важной частью веб-разработки является возможность обслуживания статики. Самые распространенные примеры статики — это HTML, CSS, JavaScript и картинки.
                    Эти файлы нужно сохранять в общей папке приложения (или например в CDN) чтобы в дальнейшем они были доступны по ссылке. В ASP.NET Core был изменен подход для работы с статикой.
                    В ASP.NET статика хранится в разных каталогах.
                    А в ASP.NET Core статические файлы по умолчанию хранятся в «web root» (/ wwwroot). И доступ к этим файлам осуществляется с помощью метода расширения UseStaticFiles из Startup.Configure:

                    public void Configure(IApplicationBuilder app)
                    {
                        app.UseStaticFiles();
                    }

                    К примеру, изображения находящееся в папке wwwroot/images будет доступно из браузера по адресу http:///images/.
                    Заметка: Если был выбран .NET Framework, то дополнительно нужно будет установить NuGet пакет Microsoft.AspNetCore.StaticFiles.
                    Заметка: Для более подробной ссылки на обслуживание статических файлов в ядре ASP.NET см. Introduction to working with static files in ASP.NET Core.

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

                    https://habrahabr.ru/post/338298/


                    Метки:  

                    [Перевод] Развертывание кода ES2015+ в продакшн сегодня

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

                    Развертывание кода ES2015+ в продакшн сегодня

                    • Перевод
                    Большинство веб-разработчиков, с которыми я общаюсь сейчас, любят писать JavaScript со всеми новейшими функциями языка — async/await, классами, стрелочными функциями и т.д. Однако, несмотря на то, что все современные браузеры могут исполнять код ES2015+ и изначально поддерживают упомянутый мной функционал, большинство разработчиков по-прежнему транспилируют свой код на ES5 и связывают его с полифиллами, чтобы удовлетворить небольшой процент пользователей, все еще работающих в старых браузерах.

                    Это отвратительно. В идеальном мире мы не будем развертывать ненужный код.


                    При работе с новыми API-интерфейсами JavaScript и DOM мы можем условно загружать полифиллы, т.к. мы можем выявить поддержку этих интерфейсов во время выполнения программы. Но с новым синтаксисом JavaScript сделать это намного сложнее, поскольку любой неизвестный синтаксис вызовет ошибку синтаксического анализа (parse error), и тогда наш код вообще не будет запущен.

                    Хотя в настоящее время у нас нет подходящего решения для создания функционала выявления нового синтаксиса, у нас есть способ установить базовую поддержку синтаксиса ES2015 уже сегодня.

                    Решим это с помощью тега script type="module".

                    Большинство разработчиков думают о script type="module" как о способе загрузки модулей ES (и, конечно же, это так), но script type="module" также имеет более быстрый и практичный вариант использования — загружает обычные файлы JavaScript с функциями ES2015+, зная, что браузер может справиться с ними!

                    Другими словами, каждый браузер, поддерживающий script type="module" также поддерживает большинство функций ES2015+, которые вы знаете и любите. Например:

                    • Каждый браузер, поддерживающий script type="module", также поддерживает async/await
                    • Каждый браузер, поддерживающий script type="module", также поддерживает классы.
                    • Каждый браузер, поддерживающий script type="module", также поддерживает стрелочные функции.
                    • Каждый браузер, поддерживающий script type="module", также поддерживает fetch, Promises, Map, Set, и многое другое!

                    Осталось только предоставить резервную копию для браузеров, которые не поддерживают script type="module". К счастью, если вы в настоящее время генерируете ES5-версию своего кода, вы уже сделали эту работу. Все, что вам теперь нужно — создать версию ES2015+!

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

                    Реализация


                    Если вы уже используете сборщик модулей (module bundler), например webpack или rollup для генерации своего кода на JavaScript, продолжайте по-прежнему это делать.

                    Затем, в дополнение к вашему текущему набору (bundle), вы создадите второй набор, как и первый; единственное различие будет заключается в том, что вы не будете транспилировать код в ES5, и вам не нужно будет подключать устаревшие полифиллы (legacy polyfills).

                    Если вы уже используете babel-preset-env (что должны), то второй шаг будет очень прост. Все, что вам нужно сделать, это изменить список браузеров только на те, которые поддерживают script type="module", и Babel автоматически не будет делать ненужные преобразования.

                    Иными словами, это будет вывод кода ES2015+ вместо ES5.

                    Например, если вы используете webpack, и вашей основной точкой входа является скрипт ./path/to/main.js, тогда конфигурация вашей текущей версии ES5 может иметь следующий вид (обратите внимание, так как это ES5, я называю набор (bundle) main-legacy):

                    module.exports = {
                      entry: {
                        'main-legacy': './path/to/main.js',
                      },
                      output: {
                        filename: '[name].js',
                        path: path.resolve(__dirname, 'public'),
                      },
                      module: {
                        rules: [{
                          test: /\.js$/,
                          use: {
                            loader: 'babel-loader',
                            options: {
                              presets: [
                                ['env', {
                                  modules: false,
                                  useBuiltIns: true,
                                  targets: {
                                    browsers: [
                                      '> 1%',
                                      'last 2 versions',
                                      'Firefox ESR',
                                    ],
                                  },
                                }],
                              ],
                            },
                          },
                        }],
                      },
                    };
                    

                    Для того, чтобы сделать современную версию для ES2015+, все, что вам нужно — это создать вторую конфигурацию и настроить целевую среду только для браузеров, поддерживающих script type="module". Вот как это может выглядеть:

                    module.exports = {
                      entry: {
                        'main': './path/to/main.js',
                      },
                      output: {
                        filename: '[name].js',
                        path: path.resolve(__dirname, 'public'),
                      },
                      module: {
                        rules: [{
                          test: /\.js$/,
                          use: {
                            loader: 'babel-loader',
                            options: {
                              presets: [
                                ['env', {
                                  modules: false,
                                  useBuiltIns: true,
                                  targets: {
                                    browsers: [
                                      'Chrome >= 60',
                                      'Safari >= 10.1',
                                      'iOS >= 10.3',
                                      'Firefox >= 54',
                                      'Edge >= 15',
                                    ],
                                  },
                                }],
                              ],
                            },
                          },
                        }],
                      },
                    };
                    

                    При запуске эти две конфигурации выведут на продакшн два JavaScript-файла:

                    • main.js (ES2015+ синтаксис)
                    • main-legacy.js (ES5 синтаксис)

                    Следующим шагом будет обновление вашего HTML для условной загрузки ES2015+ пакета (bundle) в браузерах, поддерживающих модули. Вы можете сделать это, используя script type="module" и script nomodule:

                    
                    
                    
                    
                    
                    
                    

                    Внимание! Единственная засада (gotcha) здесь — браузер Safari 10, который не поддерживает атрибут nomodule, но вы можете решить это, встроив JavaScript-сниппет в ваш HTML до использования любых тегов script nomodule. (Примечание: это было исправлено в Safari 11).

                    Важные моменты


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

                    1. Модули загружаются как script defer. Это означает, что они не выполняются до тех пор, пока документ не будет распарсен. Если какую-то часть вашего кода нужно запустить раньше, лучше разбить этот код и загрузить его отдельно.
                    2. Модули всегда запускают код в строгом режиме (strict mode), поэтому, если по какой-либо причине часть вашего кода должна быть запущена за пределами строгого режима, ее придется загружать отдельно.
                    3. Модули обрабатывают объявления верхнего уровня переменных (var) и функций (function) отлично от обычных сценариев. Например, к var foo = 'bar' и function foo() {…} в скрипте можно получить доступ через window.foo, но в модуле это не будет работать. Убедитесь, что в своем коде вы не зависите от такого поведения.

                    Рабочий пример


                    Я создал webpack-esnext-boilerplate, чтобы разработчики могли увидеть реальное применение описанной здесь техники.

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

                    • Разделение кода (Code splitting)
                    • Динамический импорт (Dynamic imports, условная загрузка дополнительного кода во время выполнения программы)
                    • Asset fingerprinting (для эффективного длительного кэширования)

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

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

                    Игра стоит свеч?


                    По-моему, определенно! Экономия может быть значительной. Например, ниже приведено сравнение общих размеров файлов для двух версий кода из моего блога:
                    Версия Размер (minified) Размер (minified + gzipped)
                    ES2015+ (main.js) 80K 21K
                    ES5 (main-legacy.js) 175K 43K

                    Устаревшая ES5-версия кода более чем в два раза превышает размер (даже gzipped) версии ES2015+.

                    Большие файлы занимают больше времени для загрузки, но они также занимают больше времени для анализа и оценки. При сравнении двух версий моего блога, время, затраченное на parse/eval, также было стабильно вдвое дольше для устаревшей ES5-версии (эти тесты выполнялись на Moto G4 с использованием webpagetest.org):
                    Версия Parse/eval time (по отдельности) Parse/eval time (среднее)
                    ES2015+ (main.js) 184ms, 164ms, 166ms 172ms
                    ES5 (main-legacy.js) 389ms, 351ms, 360ms 367ms

                    Хотя эти абсолютные размеры файлов и время parse/eval не особенно большие, поймите, что это блог, и я не загружаю много скриптов. Но для большинства сайтов это не так. Чем больше у вас скриптов, тем больше будет выигрыш, который вы получите, развернув код на ES2015+ в своем проекте.

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

                    Быстрый запрос данных HTTPArchive показывает, что из лучших сайтов по рейтингу Alexa, 85 181 включают в себя babel-polyfill, core-js или regenerator-runtime в своих пакетах (bundles) продакшн. Шесть месяцев назад их число было 34 588!

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

                    Пришло время собирать наши модули как ES2015


                    Главная засада (gotcha) для описанной здесь техники сейчас состоит в том, что большинство авторов модулей не публикуют ES2015+ версии исходного кода, а публикуют сразу транспилированную ES5-версию.

                    Теперь, когда развертывание кода на ES2015+ возможно, пришло время изменить это.

                    Я полностью осознаю, что такой шаг сопряжен с множеством проблем в ближайшем будущем. Сегодня большинство инструментов сборки публикуют документацию, рекомендующую конфигурацию, которая предполагает, что все модули написаны на ES5. Это означает, что если авторы модулей начнут публиковать исходный код на ES2015+ в npm, то они, вероятно, сломают некоторые сборки пользователей и просто вызовут путаницу.

                    Проблема заключается в том, что большинство использующих Babel разработчиков настраивают его так, чтобы код в node_modules не транспилировался. Однако, если модули опубликованы с исходным кодом ES2015+, возникает проблема. К счастью, она легко исправима. Вам просто нужно удалить исключение node_modules из конфигурации сборки:

                    rules: [
                      {
                        test: /\.js$/,
                        exclude: /node_modules/, // удалите эту строку
                        use: {
                          loader: 'babel-loader',
                          options: {
                            presets: ['env']
                          }
                        }
                      }
                    ]
                    

                    Недостаток заключается в том, что если такие инструменты как Babel должны начать транспилировать зависимости (dependencies) из node_modules, в дополнение к локальным зависимостям, это замедлит скорость сборки. К счастью, эту проблему можно отчасти решить на уровне инструментария с постоянным локальным кэшированием.

                    Несмотря на удары, мы, скорее всего, пройдем путь к тому, что ES2015+ станет новым стандартом публикации модулей. Я думаю, что борьба стоит своей цели. Если мы, как авторы модулей, публикуем в npm только ES5-версии нашего кода, мы навязываем пользователям раздутый (bloated) и медленный код.

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

                    Заключение


                    Хотя script type="module" предназначен для загрузки модулей ES (и их зависимостей) в браузере, его не нужно использовать только для этой цели.

                    script type="module" будет успешно загружать единственный файл Javascript, и это даст разработчикам столь необходимое средство для условной загрузки современного функционала в тех браузерах, которые могут его поддерживать.

                    Это, наряду с атрибутом nomodule, дает нам возможность использовать код ES2015+ в продакшн, и наконец-то мы можем прекратить отправку транспилированного кода в браузеры, которые в нем не нуждаются.

                    Написание кода ES2015 — это победа для разработчиков, а внедрение кода ES2015 — победа для пользователей.
                    Original source: habrahabr.ru (comments, light).

                    https://habrahabr.ru/post/338612/


                    Метки:  

                    [Перевод] Развертывание кода ES2015+ в продакшн сегодня

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

                    Развертывание кода ES2015+ в продакшн сегодня

                    • Перевод
                    Большинство веб-разработчиков, с которыми я общаюсь сейчас, любят писать JavaScript со всеми новейшими функциями языка — async/await, классами, стрелочными функциями и т.д. Однако, несмотря на то, что все современные браузеры могут исполнять код ES2015+ и изначально поддерживают упомянутый мной функционал, большинство разработчиков по-прежнему транспилируют свой код на ES5 и связывают его с полифиллами, чтобы удовлетворить небольшой процент пользователей, все еще работающих в старых браузерах.

                    Это отвратительно. В идеальном мире мы не будем развертывать ненужный код.


                    При работе с новыми API-интерфейсами JavaScript и DOM мы можем условно загружать полифиллы, т.к. мы можем выявить поддержку этих интерфейсов во время выполнения программы. Но с новым синтаксисом JavaScript сделать это намного сложнее, поскольку любой неизвестный синтаксис вызовет ошибку синтаксического анализа (parse error), и тогда наш код вообще не будет запущен.

                    Хотя в настоящее время у нас нет подходящего решения для создания функционала выявления нового синтаксиса, у нас есть способ установить базовую поддержку синтаксиса ES2015 уже сегодня.

                    Решим это с помощью тега script type="module".

                    Большинство разработчиков думают о script type="module" как о способе загрузки модулей ES (и, конечно же, это так), но script type="module" также имеет более быстрый и практичный вариант использования — загружает обычные файлы JavaScript с функциями ES2015+, зная, что браузер может справиться с ними!

                    Другими словами, каждый браузер, поддерживающий script type="module" также поддерживает большинство функций ES2015+, которые вы знаете и любите. Например:

                    • Каждый браузер, поддерживающий script type="module", также поддерживает async/await
                    • Каждый браузер, поддерживающий script type="module", также поддерживает классы.
                    • Каждый браузер, поддерживающий script type="module", также поддерживает стрелочные функции.
                    • Каждый браузер, поддерживающий script type="module", также поддерживает fetch, Promises, Map, Set, и многое другое!

                    Осталось только предоставить резервную копию для браузеров, которые не поддерживают script type="module". К счастью, если вы в настоящее время генерируете ES5-версию своего кода, вы уже сделали эту работу. Все, что вам теперь нужно — создать версию ES2015+!

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

                    Реализация


                    Если вы уже используете сборщик модулей (module bundler), например webpack или rollup для генерации своего кода на JavaScript, продолжайте по-прежнему это делать.

                    Затем, в дополнение к вашему текущему набору (bundle), вы создадите второй набор, как и первый; единственное различие будет заключается в том, что вы не будете транспилировать код в ES5, и вам не нужно будет подключать устаревшие полифиллы (legacy polyfills).

                    Если вы уже используете babel-preset-env (что должны), то второй шаг будет очень прост. Все, что вам нужно сделать, это изменить список браузеров только на те, которые поддерживают script type="module", и Babel автоматически не будет делать ненужные преобразования.

                    Иными словами, это будет вывод кода ES2015+ вместо ES5.

                    Например, если вы используете webpack, и вашей основной точкой входа является скрипт ./path/to/main.js, тогда конфигурация вашей текущей версии ES5 может иметь следующий вид (обратите внимание, так как это ES5, я называю набор (bundle) main-legacy):

                    module.exports = {
                      entry: {
                        'main-legacy': './path/to/main.js',
                      },
                      output: {
                        filename: '[name].js',
                        path: path.resolve(__dirname, 'public'),
                      },
                      module: {
                        rules: [{
                          test: /\.js$/,
                          use: {
                            loader: 'babel-loader',
                            options: {
                              presets: [
                                ['env', {
                                  modules: false,
                                  useBuiltIns: true,
                                  targets: {
                                    browsers: [
                                      '> 1%',
                                      'last 2 versions',
                                      'Firefox ESR',
                                    ],
                                  },
                                }],
                              ],
                            },
                          },
                        }],
                      },
                    };
                    

                    Для того, чтобы сделать современную версию для ES2015+, все, что вам нужно — это создать вторую конфигурацию и настроить целевую среду только для браузеров, поддерживающих script type="module". Вот как это может выглядеть:

                    module.exports = {
                      entry: {
                        'main': './path/to/main.js',
                      },
                      output: {
                        filename: '[name].js',
                        path: path.resolve(__dirname, 'public'),
                      },
                      module: {
                        rules: [{
                          test: /\.js$/,
                          use: {
                            loader: 'babel-loader',
                            options: {
                              presets: [
                                ['env', {
                                  modules: false,
                                  useBuiltIns: true,
                                  targets: {
                                    browsers: [
                                      'Chrome >= 60',
                                      'Safari >= 10.1',
                                      'iOS >= 10.3',
                                      'Firefox >= 54',
                                      'Edge >= 15',
                                    ],
                                  },
                                }],
                              ],
                            },
                          },
                        }],
                      },
                    };
                    

                    При запуске эти две конфигурации выведут на продакшн два JavaScript-файла:

                    • main.js (ES2015+ синтаксис)
                    • main-legacy.js (ES5 синтаксис)

                    Следующим шагом будет обновление вашего HTML для условной загрузки ES2015+ пакета (bundle) в браузерах, поддерживающих модули. Вы можете сделать это, используя script type="module" и script nomodule:

                    
                    
                    
                    
                    
                    
                    

                    Внимание! Единственная засада (gotcha) здесь — браузер Safari 10, который не поддерживает атрибут nomodule, но вы можете решить это, встроив JavaScript-сниппет в ваш HTML до использования любых тегов script nomodule. (Примечание: это было исправлено в Safari 11).

                    Важные моменты


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

                    1. Модули загружаются как script defer. Это означает, что они не выполняются до тех пор, пока документ не будет распарсен. Если какую-то часть вашего кода нужно запустить раньше, лучше разбить этот код и загрузить его отдельно.
                    2. Модули всегда запускают код в строгом режиме (strict mode), поэтому, если по какой-либо причине часть вашего кода должна быть запущена за пределами строгого режима, ее придется загружать отдельно.
                    3. Модули обрабатывают объявления верхнего уровня переменных (var) и функций (function) отлично от обычных сценариев. Например, к var foo = 'bar' и function foo() {…} в скрипте можно получить доступ через window.foo, но в модуле это не будет работать. Убедитесь, что в своем коде вы не зависите от такого поведения.

                    Рабочий пример


                    Я создал webpack-esnext-boilerplate, чтобы разработчики могли увидеть реальное применение описанной здесь техники.

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

                    • Разделение кода (Code splitting)
                    • Динамический импорт (Dynamic imports, условная загрузка дополнительного кода во время выполнения программы)
                    • Asset fingerprinting (для эффективного длительного кэширования)

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

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

                    Игра стоит свеч?


                    По-моему, определенно! Экономия может быть значительной. Например, ниже приведено сравнение общих размеров файлов для двух версий кода из моего блога:
                    Версия Размер (minified) Размер (minified + gzipped)
                    ES2015+ (main.js) 80K 21K
                    ES5 (main-legacy.js) 175K 43K

                    Устаревшая ES5-версия кода более чем в два раза превышает размер (даже gzipped) версии ES2015+.

                    Большие файлы занимают больше времени для загрузки, но они также занимают больше времени для анализа и оценки. При сравнении двух версий моего блога, время, затраченное на parse/eval, также было стабильно вдвое дольше для устаревшей ES5-версии (эти тесты выполнялись на Moto G4 с использованием webpagetest.org):
                    Версия Parse/eval time (по отдельности) Parse/eval time (среднее)
                    ES2015+ (main.js) 184ms, 164ms, 166ms 172ms
                    ES5 (main-legacy.js) 389ms, 351ms, 360ms 367ms

                    Хотя эти абсолютные размеры файлов и время parse/eval не особенно большие, поймите, что это блог, и я не загружаю много скриптов. Но для большинства сайтов это не так. Чем больше у вас скриптов, тем больше будет выигрыш, который вы получите, развернув код на ES2015+ в своем проекте.

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

                    Быстрый запрос данных HTTPArchive показывает, что из лучших сайтов по рейтингу Alexa, 85 181 включают в себя babel-polyfill, core-js или regenerator-runtime в своих пакетах (bundles) продакшн. Шесть месяцев назад их число было 34 588!

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

                    Пришло время собирать наши модули как ES2015


                    Главная засада (gotcha) для описанной здесь техники сейчас состоит в том, что большинство авторов модулей не публикуют ES2015+ версии исходного кода, а публикуют сразу транспилированную ES5-версию.

                    Теперь, когда развертывание кода на ES2015+ возможно, пришло время изменить это.

                    Я полностью осознаю, что такой шаг сопряжен с множеством проблем в ближайшем будущем. Сегодня большинство инструментов сборки публикуют документацию, рекомендующую конфигурацию, которая предполагает, что все модули написаны на ES5. Это означает, что если авторы модулей начнут публиковать исходный код на ES2015+ в npm, то они, вероятно, сломают некоторые сборки пользователей и просто вызовут путаницу.

                    Проблема заключается в том, что большинство использующих Babel разработчиков настраивают его так, чтобы код в node_modules не транспилировался. Однако, если модули опубликованы с исходным кодом ES2015+, возникает проблема. К счастью, она легко исправима. Вам просто нужно удалить исключение node_modules из конфигурации сборки:

                    rules: [
                      {
                        test: /\.js$/,
                        exclude: /node_modules/, // удалите эту строку
                        use: {
                          loader: 'babel-loader',
                          options: {
                            presets: ['env']
                          }
                        }
                      }
                    ]
                    

                    Недостаток заключается в том, что если такие инструменты как Babel должны начать транспилировать зависимости (dependencies) из node_modules, в дополнение к локальным зависимостям, это замедлит скорость сборки. К счастью, эту проблему можно отчасти решить на уровне инструментария с постоянным локальным кэшированием.

                    Несмотря на удары, мы, скорее всего, пройдем путь к тому, что ES2015+ станет новым стандартом публикации модулей. Я думаю, что борьба стоит своей цели. Если мы, как авторы модулей, публикуем в npm только ES5-версии нашего кода, мы навязываем пользователям раздутый (bloated) и медленный код.

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

                    Заключение


                    Хотя script type="module" предназначен для загрузки модулей ES (и их зависимостей) в браузере, его не нужно использовать только для этой цели.

                    script type="module" будет успешно загружать единственный файл Javascript, и это даст разработчикам столь необходимое средство для условной загрузки современного функционала в тех браузерах, которые могут его поддерживать.

                    Это, наряду с атрибутом nomodule, дает нам возможность использовать код ES2015+ в продакшн, и наконец-то мы можем прекратить отправку транспилированного кода в браузеры, которые в нем не нуждаются.

                    Написание кода ES2015 — это победа для разработчиков, а внедрение кода ES2015 — победа для пользователей.
                    Original source: habrahabr.ru (comments, light).

                    https://habrahabr.ru/post/338612/


                    Метки:  

                    [recovery mode] Быстрый пул для php+websocket без прослойки nodejs на основе lua+nginx

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

                    Быстрый пул для php+websocket без прослойки nodejs на основе lua+nginx

                    nginx + lua

                    Кратко: nginx не умеет пулить websockets, а php работает per request. Нужна прослойка которая будет держать открытыми вебсокеты и при поступлении данных соединяться с php (через тот же fastcgi) и отправлять обратно ответ.

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


                    Вот где-то внутри чувствовал, знал, что есть. Мне настолько давно хотелось иметь этот Middleware внутри Nginx, чтобы не использовать разные довольно медленные php библиотеки (раз и два) и обойти стороной однопоточность nodejs. А вебсокетов хочется много (и как можно больше), и чтобы лишние затраты на прослойку были поменьше. Так вот, дабы не плодить кучу машин с nodejs (в будущем при высоких нагрузках так и поступают обычно), воспользуемся тем, что предоставляет Nginx с некоторыми пристройками в виде lua + resty. Nginx+lua можно установить из пакета nginx-extras или же собрать самому. От Resty нам понадобятся только websockets. Скачиваем и закидываем содержимое каталога lib куда-нибудь себе в пути (у меня это /home/username/lib/lua/lib, а по-хорошему надо бы в /usr/local/share/lua).

                    Стандартно nginx+websockets работает так:
                    1. Клиент соединяется с nginx
                    2. Nginx проксирует в upstream/открывает прокси поток с другим сервером (Middle Server на основе nodejs + sockets.io например), обслуживающим websockets.
                    3. Middle Server сервер кидает socket соединение в какой-нибудь слушатель событий типа epoll и ждёт данных.
                    4. При получении данных, Middle Server сервер, в свою очередь, открывает Fastcgi соединение с php, ожидает и забирает ответ. Отправляет его в socket. Возвращает socket снова в ожидание данных.
                    5. И так по кругу, пока не прийдёт специальный фрейм закрытия websocket.

                    Всё просто, кроме накладных расходов на ресурсы и однопоточность этого решения.

                    В предлагаемой схеме MiddleServer превращается в middleware внутри nginx. К тому же нет никакого ожидания Fastcgi, всю работу делает тот же epoll, к которому nginx доверяет открытый сокет, а тем временем поток nginx'a может заняться другими делами. Схема позволяет одновременно работать с кучей вебсокетов раскиданными по потокам.

                    Здесь приведу только упрощённый код, который относится к задаче без остальных настроек хостинга. Я не старался сделать правильными все заголовки за ненадобностью оных.
                    lua_package_path "/home/username/lib/lua/lib/?.lua;;";
                    
                    server {
                        # магия, которая держит вебсокет открытым столько, сколько нам надо внутри nginx
                        location ~ ^/ws/?(.*)$ {
                             default_type 'plain/text';
                             # всё что надо здесь для веб сокета - это включить луа, который будет его хендлить
                             content_by_lua_file /home/username/www/wsexample.local/ws.lua;
                       }
                    
                       # а это магия, которая отдаёт ответы от php
                       # я шлю только POST запросы, чтобы нормально передать json payload
                       location ~ ^/lua_fastcgi_connection(/?.*)$ {
                           internal; # видно только подзапросам внутри nginx
                            fastcgi_pass_request_body       on;
                            fastcgi_pass_request_headers    off;
                    
                            # never never use it for lua handler
                            #include snippets/fastcgi-php.conf;
                    
                            fastcgi_param  QUERY_STRING       $query_string;
                            fastcgi_param  REQUEST_METHOD     "POST"; # $request_method;
                            fastcgi_param  CONTENT_TYPE       "application/x-www-form-urlencoded"; #вместо $content_type;
                            fastcgi_param  CONTENT_LENGTH     $content_length;
                    
                            fastcgi_param  DOCUMENT_URI       "$1"; # вместо $document_uri
                            fastcgi_param  DOCUMENT_ROOT      $document_root;
                            fastcgi_param  SERVER_PROTOCOL    $server_protocol;
                            fastcgi_param  REQUEST_SCHEME     $scheme;
                            fastcgi_param  HTTPS              $https if_not_empty;
                    
                            fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
                            fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
                    
                            fastcgi_param  REMOTE_ADDR        $remote_addr;
                            fastcgi_param  REMOTE_PORT        $remote_port;
                            fastcgi_param  SERVER_ADDR        $server_addr;
                            fastcgi_param  SERVER_PORT        $server_port;
                            fastcgi_param  SERVER_NAME        $server_name;
                    
                            fastcgi_param SCRIPT_FILENAME "$document_root/mywebsockethandler.php";
                            fastcgi_param SCRIPT_NAME "/mywebsockethandler.php";
                            fastcgi_param REQUEST_URI "$1"; # здесь вообще может быть что угодно. А можно передать параметр из lua чтобы сделать какой-нибудь роутинг внутри php обработчика.
                            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
                            fastcgi_keep_conn               on;
                           
                    }
                    


                    И код ws.lua:
                        local server = require "resty.websocket.server"
                    
                        local wb, err = server:new{
                            -- timeout = 5000,  -- in milliseconds -- не надо нам таймаут
                            max_payload_len = 65535,
                        }
                    
                        if not wb then
                            ngx.log(ngx.ERR, "failed to new websocket: ", err)
                            return ngx.exit(444)
                        end
                    
                        while true do
                            local data, typ, err = wb:recv_frame()
                    
                            if wb.fatal then return
                            elseif not data then
                                ngx.log(ngx.DEBUG, "Sending Websocket ping")
                                wb:send_ping()
                            elseif typ == "close" then
                                -- send a close frame back:
                                local bytes, err = wb:send_close(1000, "enough, enough!")
                                if not bytes then
                                    ngx.log(ngx.ERR, "failed to send the close frame: ", err)
                                    return
                                end
                                local code = err
                                ngx.log(ngx.INFO, "closing with status code ", code, " and message ", data)
                                break;
                            elseif typ == "ping" then
                                -- send a pong frame back:
                    
                                local bytes, err = wb:send_pong(data)
                                if not bytes then
                                    ngx.log(ngx.ERR, "failed to send frame: ", err)
                                    return
                                end
                            elseif typ == "pong" then
                                -- just discard the incoming pong frame
                    
                            elseif data then
                    
                                -- здесь в пути передаётся реальный uri, а json payload уходит в body
                                local res = ngx.location.capture("/lua-fastcgi-forward"..ngx.var.request_uri,{method=ngx.HTTP_POST,body=data})
                    
                                if wb == nil then
                                    ngx.log(ngx.ERR, "WebSocket instaince is NIL");
                                    return ngx.exit(444)
                                end
                    
                                wb:send_text(res.body)
                    
                            else
                                ngx.log(ngx.INFO, "received a frame of type ", typ, " and payload ", data)
                            end
                    end
                    


                    Что ещё можно с этим сделать? Замерить скорость и сравнить с nodejs :) А можно внутри lua делать запросы в Redis, MySQL, Postgres… проверять куки и прочие токены авторизации, обрабатывать сессии, кешировать ответы в memcached и потом быстро-быстро отдавать другим клиентам с одинаковыми запросами внутри websocket.

                    Известные мне недоработки: максимальный размер пакета данных по вебсокету 65Кб. При желании можно дописать разбитие на фреймы. Протокол не сложный.

                    Тестовый html (ws.html):
                    HTML тут
                    
                    
                    
                    	
                    
                    
                    
                    
                    
                    Message:




                    Тестовый php (mywebsockethandler.php):
                    PHP тут

                    https://habrahabr.ru/post/338614/


                    Метки:  

                    [recovery mode] Быстрый пул для php+websocket без прослойки nodejs на основе lua+nginx

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

                    Быстрый пул для php+websocket без прослойки nodejs на основе lua+nginx

                    nginx + lua

                    Кратко: nginx не умеет пулить websockets, а php работает per request. Нужна прослойка которая будет держать открытыми вебсокеты и при поступлении данных соединяться с php (через тот же fastcgi) и отправлять обратно ответ.

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


                    Вот где-то внутри чувствовал, знал, что есть. Мне настолько давно хотелось иметь этот Middleware внутри Nginx, чтобы не использовать разные довольно медленные php библиотеки (раз и два) и обойти стороной однопоточность nodejs. А вебсокетов хочется много (и как можно больше), и чтобы лишние затраты на прослойку были поменьше. Так вот, дабы не плодить кучу машин с nodejs (в будущем при высоких нагрузках так и поступают обычно), воспользуемся тем, что предоставляет Nginx с некоторыми пристройками в виде lua + resty. Nginx+lua можно установить из пакета nginx-extras или же собрать самому. От Resty нам понадобятся только websockets. Скачиваем и закидываем содержимое каталога lib куда-нибудь себе в пути (у меня это /home/username/lib/lua/lib, а по-хорошему надо бы в /usr/local/share/lua).

                    Стандартно nginx+websockets работает так:
                    1. Клиент соединяется с nginx
                    2. Nginx проксирует в upstream/открывает прокси поток с другим сервером (Middle Server на основе nodejs + sockets.io например), обслуживающим websockets.
                    3. Middle Server сервер кидает socket соединение в какой-нибудь слушатель событий типа epoll и ждёт данных.
                    4. При получении данных, Middle Server сервер, в свою очередь, открывает Fastcgi соединение с php, ожидает и забирает ответ. Отправляет его в socket. Возвращает socket снова в ожидание данных.
                    5. И так по кругу, пока не прийдёт специальный фрейм закрытия websocket.

                    Всё просто, кроме накладных расходов на ресурсы и однопоточность этого решения.

                    В предлагаемой схеме MiddleServer превращается в middleware внутри nginx. К тому же нет никакого ожидания Fastcgi, всю работу делает тот же epoll, к которому nginx доверяет открытый сокет, а тем временем поток nginx'a может заняться другими делами. Схема позволяет одновременно работать с кучей вебсокетов раскиданными по потокам.

                    Здесь приведу только упрощённый код, который относится к задаче без остальных настроек хостинга. Я не старался сделать правильными все заголовки за ненадобностью оных.
                    lua_package_path "/home/username/lib/lua/lib/?.lua;;";
                    
                    server {
                        # магия, которая держит вебсокет открытым столько, сколько нам надо внутри nginx
                        location ~ ^/ws/?(.*)$ {
                             default_type 'plain/text';
                             # всё что надо здесь для веб сокета - это включить луа, который будет его хендлить
                             content_by_lua_file /home/username/www/wsexample.local/ws.lua;
                       }
                    
                       # а это магия, которая отдаёт ответы от php
                       # я шлю только POST запросы, чтобы нормально передать json payload
                       location ~ ^/lua_fastcgi_connection(/?.*)$ {
                           internal; # видно только подзапросам внутри nginx
                            fastcgi_pass_request_body       on;
                            fastcgi_pass_request_headers    off;
                    
                            # never never use it for lua handler
                            #include snippets/fastcgi-php.conf;
                    
                            fastcgi_param  QUERY_STRING       $query_string;
                            fastcgi_param  REQUEST_METHOD     "POST"; # $request_method;
                            fastcgi_param  CONTENT_TYPE       "application/x-www-form-urlencoded"; #вместо $content_type;
                            fastcgi_param  CONTENT_LENGTH     $content_length;
                    
                            fastcgi_param  DOCUMENT_URI       "$1"; # вместо $document_uri
                            fastcgi_param  DOCUMENT_ROOT      $document_root;
                            fastcgi_param  SERVER_PROTOCOL    $server_protocol;
                            fastcgi_param  REQUEST_SCHEME     $scheme;
                            fastcgi_param  HTTPS              $https if_not_empty;
                    
                            fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
                            fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
                    
                            fastcgi_param  REMOTE_ADDR        $remote_addr;
                            fastcgi_param  REMOTE_PORT        $remote_port;
                            fastcgi_param  SERVER_ADDR        $server_addr;
                            fastcgi_param  SERVER_PORT        $server_port;
                            fastcgi_param  SERVER_NAME        $server_name;
                    
                            fastcgi_param SCRIPT_FILENAME "$document_root/mywebsockethandler.php";
                            fastcgi_param SCRIPT_NAME "/mywebsockethandler.php";
                            fastcgi_param REQUEST_URI "$1"; # здесь вообще может быть что угодно. А можно передать параметр из lua чтобы сделать какой-нибудь роутинг внутри php обработчика.
                            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
                            fastcgi_keep_conn               on;
                           
                    }
                    


                    И код ws.lua:
                        local server = require "resty.websocket.server"
                    
                        local wb, err = server:new{
                            -- timeout = 5000,  -- in milliseconds -- не надо нам таймаут
                            max_payload_len = 65535,
                        }
                    
                        if not wb then
                            ngx.log(ngx.ERR, "failed to new websocket: ", err)
                            return ngx.exit(444)
                        end
                    
                        while true do
                            local data, typ, err = wb:recv_frame()
                    
                            if wb.fatal then return
                            elseif not data then
                                ngx.log(ngx.DEBUG, "Sending Websocket ping")
                                wb:send_ping()
                            elseif typ == "close" then
                                -- send a close frame back:
                                local bytes, err = wb:send_close(1000, "enough, enough!")
                                if not bytes then
                                    ngx.log(ngx.ERR, "failed to send the close frame: ", err)
                                    return
                                end
                                local code = err
                                ngx.log(ngx.INFO, "closing with status code ", code, " and message ", data)
                                break;
                            elseif typ == "ping" then
                                -- send a pong frame back:
                    
                                local bytes, err = wb:send_pong(data)
                                if not bytes then
                                    ngx.log(ngx.ERR, "failed to send frame: ", err)
                                    return
                                end
                            elseif typ == "pong" then
                                -- just discard the incoming pong frame
                    
                            elseif data then
                    
                                -- здесь в пути передаётся реальный uri, а json payload уходит в body
                                local res = ngx.location.capture("/lua-fastcgi-forward"..ngx.var.request_uri,{method=ngx.HTTP_POST,body=data})
                    
                                if wb == nil then
                                    ngx.log(ngx.ERR, "WebSocket instaince is NIL");
                                    return ngx.exit(444)
                                end
                    
                                wb:send_text(res.body)
                    
                            else
                                ngx.log(ngx.INFO, "received a frame of type ", typ, " and payload ", data)
                            end
                    end
                    


                    Что ещё можно с этим сделать? Замерить скорость и сравнить с nodejs :) А можно внутри lua делать запросы в Redis, MySQL, Postgres… проверять куки и прочие токены авторизации, обрабатывать сессии, кешировать ответы в memcached и потом быстро-быстро отдавать другим клиентам с одинаковыми запросами внутри websocket.

                    Известные мне недоработки: максимальный размер пакета данных по вебсокету 65Кб. При желании можно дописать разбитие на фреймы. Протокол не сложный.

                    Тестовый html (ws.html):
                    HTML тут
                    
                    
                    
                    	
                    
                    
                    
                    
                    
                    Message:




                    Тестовый php (mywebsockethandler.php):
                    PHP тут

                    https://habrahabr.ru/post/338614/


                    Метки:  

                    Квантовый компьютер IBM научили моделировать сложные химические элементы

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

                    Квантовый компьютер IBM научили моделировать сложные химические элементы

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

                      По словам Дарио Гила (Dario Gil), вице-президента исследований в сфере ИИ и IBM Q в IBM Research, она заключается в повышении нашего уровня знаний о явлениях природы.


                      / Flickr / IBM Research / CC

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

                      В работе над проектом по моделированию исследовательская группа IBM использовала квантовый процессор с семью кубитами. Объектами выступили гидрид лития и гидрид бериллия. «Квантовый подход» хорошо подошел для этой задачи — алгоритмы для химического моделирования действительно исправно работают на квантовых процессорах, по словам Робина Блюм-Кохута (Robin Blume-Kohout) из Sandia National Laboratories, лаборатории министерства энергетики США.

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

                      В 1985 году Дэвидом Дойчем (David Deutsch) из Оксфордского университета были описаны первые попытки моделирования различных состояний с помощью квантовых вычислений. Однако первый жизнеспособный алгоритм был оформлен Питером Шором (Peter Shor) из Массачусетского технологического института почти 10 лет спустя.

                      Как отмечает научный журналист Филип Бол (Philip Ball) после этого идея сделать квантовый компьютер быстрее традиционного затмила изначальную цель, которая заключалась в изучении квантовой природы различных явлений.

                      Эксперимент IBM — это продолжение тех исследований, которые уже были проведены ранее. Например, летом 2016 года группа исследователей, возглавляемая профессорами Маркусом Рейером (Markus Reiher) и Маттиасом Троером (Matthias Troyer) из Швейцарской высшей технической школы Цюриха, прибегла к квантовым вычислениям в процессе изучения сложной химической реакции.

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

                      Разрешение основных вопросов химического моделирования, по словам журналиста Филипа Бола, возможно, лежит в адиабатических квантовых вычислениях (AQC). Этот подход является основой D-Wave One — первого коммерческого квантового компьютера. Хотя его достоинства в качестве эффективного инструмента для квантовых вычислений ставятся под сомнение, исследователи со всего мира стараются получить к нему доступ.


                      / Flickr / Steve Jurvetson / CC

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

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

                      P.S. Несколько материалов из нашего блога на Хабре:


                      P.P.S. Материалы из «Первого блога о корпоративном IaaS»:

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

                      https://habrahabr.ru/post/338616/


                      Метки:  

                      Квантовый компьютер IBM научили моделировать сложные химические элементы

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

                      Квантовый компьютер IBM научили моделировать сложные химические элементы

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

                        По словам Дарио Гила (Dario Gil), вице-президента исследований в сфере ИИ и IBM Q в IBM Research, она заключается в повышении нашего уровня знаний о явлениях природы.


                        / Flickr / IBM Research / CC

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

                        В работе над проектом по моделированию исследовательская группа IBM использовала квантовый процессор с семью кубитами. Объектами выступили гидрид лития и гидрид бериллия. «Квантовый подход» хорошо подошел для этой задачи — алгоритмы для химического моделирования действительно исправно работают на квантовых процессорах, по словам Робина Блюм-Кохута (Robin Blume-Kohout) из Sandia National Laboratories, лаборатории министерства энергетики США.

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

                        В 1985 году Дэвидом Дойчем (David Deutsch) из Оксфордского университета были описаны первые попытки моделирования различных состояний с помощью квантовых вычислений. Однако первый жизнеспособный алгоритм был оформлен Питером Шором (Peter Shor) из Массачусетского технологического института почти 10 лет спустя.

                        Как отмечает научный журналист Филип Бол (Philip Ball) после этого идея сделать квантовый компьютер быстрее традиционного затмила изначальную цель, которая заключалась в изучении квантовой природы различных явлений.

                        Эксперимент IBM — это продолжение тех исследований, которые уже были проведены ранее. Например, летом 2016 года группа исследователей, возглавляемая профессорами Маркусом Рейером (Markus Reiher) и Маттиасом Троером (Matthias Troyer) из Швейцарской высшей технической школы Цюриха, прибегла к квантовым вычислениям в процессе изучения сложной химической реакции.

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

                        Разрешение основных вопросов химического моделирования, по словам журналиста Филипа Бола, возможно, лежит в адиабатических квантовых вычислениях (AQC). Этот подход является основой D-Wave One — первого коммерческого квантового компьютера. Хотя его достоинства в качестве эффективного инструмента для квантовых вычислений ставятся под сомнение, исследователи со всего мира стараются получить к нему доступ.


                        / Flickr / Steve Jurvetson / CC

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

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

                        P.S. Несколько материалов из нашего блога на Хабре:


                        P.P.S. Материалы из «Первого блога о корпоративном IaaS»:

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

                        https://habrahabr.ru/post/338616/


                        Метки:  

                        iOS+Kotlin. Что можно сделать сейчас

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

                        iOS+Kotlin. Что можно сделать сейчас

                          В ветке master проекта Kotlin Native появился пример uikit. Это простое приложение под iOS, которое выводит на экран строку, введённую в поле ввода, и да, 100% кода написано на Kotlin. Выглядит оно так:



                          Стоит ли думать о порте своего приложения уже сейчас?


                          Да, но только если:
                          0). Вам действительно нужна общая кодовая база мобильных приложений.
                          1). Приложение мало завязано на платформу.
                          2). У Вас есть время на написание некоторого количества кода на Kotlin, который в будущем стоит переписать на Objective-C или Swift.

                          Причины пока не портировать


                          ViewController, AppDelegate и даже main-функция в примере написаны на Kotlin. Те файлы, которые написаны на Objective-C нужны только чтобы XCode не выдавал ошибку и не включаются в конечную сборку (я не нашёл способов исправить положение). Т.е. полноценный interop как с Java, видимо, пока что, недоступен. Это совсем не значит, что положение дел не изменится к релизу (сейчас проект на стадии alpha preview, а об этом примере даже поста в блоге не было). Но спектр доступных сейчас возможностей довольно ограничен.

                          Interop


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

                          @ExportObjCClass
                          class KotlinViewController : UIViewController {
                          
                              constructor(aDecoder: NSCoder) : super(aDecoder)
                              override fun initWithCoder(aDecoder: NSCoder) = initBy(KotlinViewController(aDecoder))
                          
                              @ObjCOutlet
                              lateinit var label: UILabel
                          
                              @ObjCOutlet
                              lateinit var textField: UITextField
                          
                              @ObjCOutlet
                              lateinit var button: UIButton
                          
                              @ObjCAction
                              fun buttonPressed() {
                                  label.text = "Konan says: 'Hello, ${textField.text}!'"
                              }
                          }

                          То есть вполне неплохо. К каждому внешнему классу добавляем аннотацию @ExportObjCClass, к каждому графическому элементу из storyboard — @ObjCOutlet и @ObjCAction для каждого action. Классы на Objective-C доступны по их оригинальным именам.

                          Если нужно вызвать Kotlin из Objective-C/Swift


                          В этой статье описано, как это можно сделать. Через некоторое количество прослоек, с ручным преобразованием типов 2 раза, но зато можно звать Swift из Kotlin и Kotlin из Swift.

                          Overhead


                          В теории, вес приложения должен увеличиться примерно на 100 кб (отсюда).
                          Вместо GC будет использоваться ARC, так что особой разницы в производительности со Swift быть не должно.

                          Обратная совместимость


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

                          inline


                          Для реализации сопрограмм, которые делают так, чтобы синхронный и асинхронный код выглядели почти одинаково в язык было введено всего одно новое ключевое слово suspend, чем разработчики заслуженно гордятся. Но для того чтобы методы-расширения (forEach, map...) работали так же быстро, как и обычный for (и для вывода общих типов во время исполнения программы), было введено целых 3 (inline, crossinline, noinline). Они явно не делают код читаемее. JIT теряет часть возможностей для оптимизации (подкаст об этом), а опыт C показывает, что разработчики не умеют правильно пользоваться такими возможностями языка. В целом, не понимаю, почему то же самое нельзя было сделать аннотацией. Для меня inline выглядит как плохое решение достойной проблемы.

                          Заключение


                          — На Kotlin скоро можно будет писать под все 3 основные платформы (Android, iOS, Web).
                          — Скорее всего, будет хорошая совместимость с Objective-C и Swift. Возможно лучше, чем та, что есть между этими языками. Учитывая опыт JetBrains в разработке компиляторов и IDE, в это можно поверить.
                          — У Kotlin легковесный Runtime языка под Android и Web. Под iOS, судя по всему, тоже будет не тяжёлым.
                          — Уже сейчас можно что-нибудь написать.
                          Original source: habrahabr.ru (comments, light).

                          https://habrahabr.ru/post/337958/


                          Метки:  

                          Поиск сообщений в rss_rss_hh_full
                          Страницы: 1824 ... 1546 1545 [1544] 1543 1542 ..
                          .. 1 Календарь