Презентация книг научно-популярных серий «New Science» и «Pop Science» на Non/fictio№ в Москве

В Москве 1 декабря в 17:00 на Ярмарке интеллектуальной литературы Non/fictio№ 18 состоится презентация новинок научно-популярных серий «New Science» и «Pop Science».

image

Тема презентации — «Научно-популярная литература. Эволюция или деградация?». Спикер — заведующая редакцией «Компьютерная и научно-популярная литература» издательства «Питер» Юлия Сергиенко.

Серии «New Science» и «Pop Science»:
• Актуальные темы, передовые научные теории
• Авторы — выдающиеся ученые
• Переводчики серии являются специалистами в области физики, химии, биологии и математики, что дает высокое качество перевода
• Издания публикуются впервые на русском языке

Ждем вас на презентации:
1 декабря в 17:00
Москва, Центральный дом художника, Крымский вал, дом 10, Литературное кафе

Также приглашаем посетить стенд издательства «Питер»:
image

Подробно ознакомиться и приобрести научные серии и другие книги издательства «Питер» вы можете на стенде К6 — 2 этаж.
ссылка на оригинал статьи https://geektimes.ru/post/283192/

Domain-Driven Design: стратегическое проектирование. Часть 1


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

Данный подход использовал Вон Вернон в своей книге «Реализация методов предметно-ориентированного проектирования». Цель написания этой книги: дать возможность разработчикам совершить полет на самолете DDD (в детстве автор зачастую путешествовал со своей семьей на небольших самолетах). Вид с высоты дает более широкое представление о проблемах моделирования, не давая застрять в различных технических деталях. Наблюдая ландшафт DDD таким способом, можно осознать преимущества как стратегического, так и технического проектирования. Подробнее – под катом!

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

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

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

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

Единый язык

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

  1. Создание диаграмм физической и концептуальной предметной областей и нанесение на них меток, обозначающих имена и действия. Такие диаграммы носят неформальный характер, поэтому нет смысла использовать формальное моделирование (как UML).
  2. Создание глоссария с простыми определениями, а также альтернативными терминами с оценкой их перспективности. Таким образом разрабатываются устойчивые словосочетания единого языка.
  3. Создание документации вместо глоссария. Эта документация будет содержать неформальные диаграммы или важные понятия, связанные с программным обеспечением.
  4. Обсуждение готовых фраз с остальными членами команды, которые не могут сразу освоить глоссарий или другие письменные документы.

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

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

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

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

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

Ограниченный контекст

Эта концептуальная граница называется ограниченный контекст (Bounded context). Это второе по значимости свойство DDD после единого языка. Оба эти понятия взаимосвязаны и не могут существовать друг без друга.

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

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

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

Литературный контекст
Сводка – это совокупность литературных выражений об одном или нескольких событиях, произошедших за определенный период времени —> На сайте amazon.com продается книга Into Thin Air: A Personal Account of the Mt. Everest Disaster

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

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

В некоторых издательствах книги проходят разные этапы жизненного цикла, то есть книга проходит различные контексты.

  • Разработка концепции и предложения к изданию
  • Контракт с автором
  • Управление редакционным процессом
  • Разработка макета книги, включая иллюстрации
  • Перевод книги на другие языки
  • Выпуск бумажных и/или электронных версий книги
  • Маркетинг
  • Продажа книги реализаторам и/или непосредственно покупателям
  • Поставка экземпляров книги реализаторам или покупателям

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

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

Предметная область, предметная подобласть, смысловое ядро

Предметная область (Domain) – это то, что делает организация, и среда, в которой она это делает. Разработчик программного обеспечения для организации обязательно работает в ее предметной области. Следует понимать, что при разработке модели предметной области необходимо сосредоточиться в определенной подобласти, так как практически невозможно создать единственную, всеобъемлющую модель бизнеса даже умеренно сложной организации. Очень важно разделять модели на логические разделенные предметные подобласти (Subdomain) всей предметной области, согласно их фактической функциональности. Подобласти позволяют быстрее определить разные части предметной области, необходимые для решения конкретной задачи.

Также необходимо уметь определять смысловое ядро (Core domain). Это очень важный аспект подхода DDD. Смысловое ядро – это подобласть, имеющая первостепенное значение для организации. Со стратегической точки зрения бизнес должен выделяться своим смысловым ядром. Большинство DDD проектов сосредоточены именно на смысловом ядре. Лучшие разработчики и эксперты должны быть задействованы именно в этой подобласти. Большинство инвестиций должны быть направлены именно сюда для достижения преимущества для бизнеса и получения наибольшей прибыли.

Если моделируется определенный аспект бизнеса, который важен, но не является смысловым ядром, то он относится к служебной подобласти (Supporting subdomain). Бизнес создает служебную подобласть, потому что она имеет специализацию. Если она не имеет специального предназначения для бизнеса, а требуется для всего бизнеса в целом, то ее называют неспециализированной подобластью (Generic subdomain). Эти виды подобластей важны для успеха бизнеса, но не имеют первоочередного значения. Именно смысловое ядро должно быть реализовано идеально, поскольку оно обеспечивает преимущество для бизнеса.

Это и есть основа для стратегического проектирования при подходе DDD.

Пространство задач и пространство решений

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

  • Пространство задач – части предметной области, которые необходимы, чтобы создать смысловое ядро. Это комбинация смыслового ядра и подобластей, которое это ядро должно использовать.
  • Пространство решений – один или несколько ограниченных контекстов, набор конкретных моделей программного обеспечения. Разработанный ограниченный контекст – это конкретное решение, представление реализации.

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

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

Это только часть предметной области, а не вся предметная область, в которой работает организация. Пространство задач (смысловое ядро и подобласти) необходимо проанализировать. Модель закупок, изображенная на рисунке, представляет собой решение для смыслового ядро. Модель предметной области будет реализована в явном ограниченном контексте: контексте оптимальных закупок. Этот ограниченный контекст однозначно соответствует одной подобласти под названием смысловое ядро оптимальных закупок. Еще один ограниченный контекст под названием контекст закупок будет разработан для уточнения технических аспектов процесса закупок и будет играть вспомогательную роль по отношению к контексту оптимальных закупок. Они обеспечивают взаимодействие с открытым интерфейсом системы ERP. Контекст закупок и модуль закупок ERP объединяются в служебную подобласть закупок. Сам модуль ERP является неспециализированной подобластью, поскольку ее можно заменить на любую другую коммерческую систему закупок. Однако, она становится служебной подобластью, если ее рассмотреть в сочетании с контекстом закупок в подобласти закупок. В соответствие с рисунком, контекст оптимальных закупок должен также взаимодействовать с контекстом товарных запасов, который управляет единицами хранения. Он использует модуль товарных запасов ERP, который находится в пределах служебной подобласти товарных запасов. ERP-приложение состоит из различных модулей, которые мы рассматриваем как логические подобласти, – это подобласти товарных запасов и закупок. Эти модули и контексты запасов и закупок объединяются в служебные подобласти.

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

  • Определить, как выглядит стратегическое смысловое ядро
  • Какие концепции должны рассматриваться как часть смыслового ядра
  • Перечислить служебные и неспециализированные подобласти.

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

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

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

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

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

Карта контекстов

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

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

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

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

  • партнерство (Partnership). Когда команды в двух контекстах достигают успеха и терпят неудачу вместе, возникает отношение сотрудничества. Они должны сотрудничать в процессе эволюции своих интерфейсов, чтобы учитывать потребности обеих систем.
  • общее ядро (Shared kernel). Общая часть модели и кода образует тесную взаимосвязь. Обозначается четкая граница подмножества модели предметной области, которую команды согласны считать общей. Ядро должно быть маленьким. Оно не может изменяться без консультации с другой командой. Необходимо согласовывать единый язык команд.
  • разработка заказчки-поставщик (Customer-supplier development). Когда две команды находятся в отношении «нижестоящий и вышестоящий», и команды вышестоящие учитывают приоритеты нижестоящих команд.
  • конформист (Conformist). Когда две команды находятся в отношении «вышестоящий и нижестоящий», причем вышестоящая команда не имеет причин учитывать потребности нижестоящей команды. Нижестоящая команда учитывает сложность трансляции между ограниченными контекстами, беспрекословно подчиняясь модели вышестоящей команды.
  • предохранительный уровень (Anticorruption layer). Если управление и коммуникация не соответствуют общему ядру, партнеру, или отношению «Заказчик-поставщик», то трансляция является сложной. Нижестоящий клиент должен создать изолирующий слой, чтобы обеспечить свою систему вышестоящей системы в терминах своей модели предметной области. Этот уровень общается с другой системой с помощью существующего интерфейса, не требуя или почти не требуя модификаций другой системы.
  • служба с открытым протоколом (Open host service). Определяется протокол, который предоставляет доступ к системе как к набору служб. Для учета новых требований интеграции этот протокол расширяется и уточняется.
  • общедоступный язык (Published language). Трансляция между моделями двух ограниченных контекстов требует общего языка. В качестве среды для коммуникации используется хорошо документированный общий язык, который может выразить необходимую информацию о предметной области, выполняя при необходимости перевод информации с другого языка на этот.
  • отдельное существование (Separate ways). Если между двумя наборами функциональных возможностей нет важного отношения, их можно полностью отсоединить друг от друга. Интеграция всегда дорого стоит, а выгоды бывают незначительны.
  • большой комок грязи (Big ball of mud). Существуют части системы, в которых модели перемешаны, а границы стерты. Необходимо нарисовать границу такой смеси и назвать ее большой комок грязи.

Пример разработки карты контекстов можно взять из статьи Альберто Брандолини Strategic Domain Driven Design with Context Mapping.

Сначала рисуется простая карта контекстов с границами и связью между ограниченными контекстами:

В этих двух контекстах есть различия в концепциях с одинаковым названием. Например, Account в Web User Profiling – это учетная запись пользователя (логин и пароль). В то же время, для PFM Application (персональное управление финансами) – это сводка, описывающая текущее состояние клиента с точки зрения банка. Иногда, как было указано выше, одна и та же концепция может использоваться в абсолютно разных контекстах, тем самым для них необходимо определить разные модели.

Например, PayeeAccount – это тот же BankingAccount, но с другим поведением (нельзя получить баланс). Таким образом будет создан отдельный контекст учета расходов (expense tracking). Также отдельно, в приведенном примере, создается контекст онлайн сервисов банка (on-line banking services) (такие сервисы, например, как распечатка выписок банка).

После первого шага создания карты, можно детализировать все отношения. У каждого отношения есть направление. Вышестоящие (upstream) влияют на нижестоящие (downstream), но не факт, что обратное верно.

Детализированная карта выглядит вот так:

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

Так как контекст профайлов веб-пользователей используется как готовый внешний модуль и он поставляется «как есть», здесь устанавливается отношение конформист (нижестоящий подчиняется вышестоящему).

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

Это простой пример карты контекстов, на деле они бывают намного сложней.

Вывод

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

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

Спасибо за внимание!

Статью подготовили: greebn9k(Сергей Грибняк), wa1one(Владимир Ковальчук), silmarilion(Андрей Хахарев)
ссылка на оригинал статьи https://habrahabr.ru/post/316438/

Глава InfoWatch Наталья Касперская: большие данные россиян должны принадлежать государству

Глава компании InfoWatch Наталья Касперская в своей беседе с ТАСС заявила, что по ее мнению большие данные россиян должны быть признаны собственностью государства.

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

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

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

При этом глава InfoWatch отмечает, что перехват информации о жителях страны ничего не даст, так как сейчас широко используется протокол HTTPS. По мнению Касперской, выходом из ситуации было бы «загнать» все большие данные о пользователях в Россию и утвердить этот процесс на законодательном уровне по аналогии с законом о «персональных данных». Однако в этом случае государство получит огромный поток данных от Google и Facebook.

«Я считаю, что, наверно, нужно законодательно заставлять такие компании передавать сертификаты, либо просто пытаться как-то акуратно „загонять“ их (данные) в Россию. Должны быть какие-то законодательные меры, а не перехватчики», — считает Касперская. Как пример она привела взаимодействие Facebook с властями Китая.

Наталья Касперская — глава InfoWatch и бывшая супруга Евгения Касперского, основателя одноименной компании. Считается одной из богатейших женщин РФ и наиболее известной, авторитетной и влиятельной персоной в российской ИТ-индустрии. Компания InfoWatch разрабатывает нишевые продукты, специализирующиеся на информационной безопасности в корпоративном секторе.
ссылка на оригинал статьи https://geektimes.ru/post/283188/

8 инструментов для создания личного или делового чат бота

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

  • WhatsApp
  • Facebook Messenger
  • WeChat
  • Skype
  • LINE
  • Slack
  • QQ Mobile
  • и множество других…

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

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

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

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

Возможности для автоматизации с помощью чат бота весьма обширны, например:

  • FAQ — c помощью чат бота можно настроить ответы на часто задаваемые вопросы;
  • отслеживание доставки заказа — чат бот сможет ответить на вопросы о статусе заказа;
  • электронная торговля — с помощью виртуального собеседника можно заинтересовать посетителя вашего сайта и превратить его в вашего клиента.

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

Платформы для создания ботов:

  1. Morph.ai
  2. Flow XO
  3. Botsify
  4. API.AI
  5. Motion.ai
  6. Chatfuel
  7. Manybot
  8. Recast

Morph.ai

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

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

  • Facebook Messenger
  • Twitter
  • Slack
  • Skype
  • LINE
  • SMS

Я создал бота для своей страницы на Facebook, и результат меня поразил.

Кроме всего прочего, Morph можно интегрировать в Shopify, Zendesk, Salesforce, Intercom, использовать с API, хуками, так что нет необходимости вручную экспортировать контакты или данные.

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

Flow XO

Flow XO позволяет вам создать и разместить чат бота для различных мессенджеров, в том числе Slack и Telegram. Для использования бота не требуются познания в программировании. Flow OX облегчает задачу интегрирования более чем с 90 сервисами:

Botsify

Botsify представляет возможность создания виртуального собеседника на 100 пользователей в месяц бесплатно. Если вас интересует только чат в Facebook, то стоит попробовать Botsify.

А как быть, если ваш сайт на WordPress? Для таких случаев на Botsify есть специальный плагин. Чтобы оценить пробный вариант, перейдите по ссылке.

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

API.AI

При помощи Api.ai создание умного собеседника для Facebook осуществляется за три простых шага.

  1. Разработка — создайте бота;
  2. Подключение — настройте интеграцию с любым серверным приложением;
  3. Запуск — начало работы.

API.AI — полноценное решение для создания обучаемого чат бота, поддерживающее разные платформы, например, Android, HTML, Node.js, iOS, Python, и т.д.

На сегодняшний день программа поддерживает 14 языков и может быть использована с:

  • Slack
  • Skype
  • Twitter
  • Cisco Spark
  • Kik
  • LINE
  • Amazone Alexa
  • Telegram
  • Twilio IP/SMS
  • Microsoft Cortana
  • Agent Demo

Motion.ai

На Motion.ai вы сможете создать 2 чат бота на 1000 сообщений в месяц совершенно бесплатно. И все это не только для Facebook, но и для SMS, различных веб-сервисов, Slack, Smooch и электронной почты.

Приступить к работе можно бесплатно, предоставляется подробная документация.

Chatfuel

Виртуальный собеседник для Facebook будет готов всего за 7 минут и без необходимости в написании кода. Chatfuel пользуются такие гиганты, как UBER, TechCrunch и т.д.

Возможна интеграция с вашими самыми любимыми сервисами, например, Twitter, YouTube, JSON, Instagram и т.д.

Больше всего поражает подход к ценообразованию.

Платформа для создания чат бота совершенно бесплатная!
Здорово, не правда ли?

Manybot

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

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

Recast

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

Чат бот сможет работать на Facebook, Slack, Skype, Kik, и т.д.

Дополнительные варианты:

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

Подобрать виртуальный сервер или виртуальный хостинг можно на HOSTING.cafe.
ссылка на оригинал статьи https://habrahabr.ru/post/316422/

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

За последнее десятилетие R прошёл большой путь: от нишевого (как правило, академического) инструмента до мейнстримной «большой десятки» самых популярных языков программирования. Такой интерес вызван многими причинами, среди которых и принадлежность к open source, и деятельное коммьюнити, и активно растущий сегмент применения методов machine learning / data mining в разнообразных бизнес-задачах. Приятно видеть, когда один из твоих любимых языков уверенно завоёвывает новые позиции, и когда даже далёкие от профессиональной разработки пользователи начинают интересоваться R. Но здесь есть, однако, одна большая проблема: язык R написан, по выражению создателей, «статистиками для статистиков». Поэтому он высокоуровневый, гибкий, с огромным и надёжным функционалом «из коробки», не говоря уже о тысячах дополнительных пакетов; и одновременно с этим – весьма фривольный по части семантики, соединящий в себе принципиально разные парадигмы и обладающий широкими возможностями для написания чудовищно неэффективного кода. А если учесть тот факт, что для многих в последнее время это первый «настоящий» язык программирования, то ситуация становится ещё более угрожающей.

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

Как не увязнуть в матрице

Опуская все нерелевантные подробности, мы можем сформулировать нашу тестовую задачу следующим образом. Для произвольного натурального n необходимо быстро генерировать матрицы размером n \times n вот такого вида (приведён пример для n=5):

1    2    3    4    5 2    3    4    5    4 3    4    5    4    3 4    5    4    3    2 5    4    3    2    1 

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

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

Простейший подсчёт показывает, что нужная нам матрица определяется поэлементно при помощи условия M_{i, j} = \min(i + j - 1, 2n - i - j + 1). Если бы мы писали на одном из классических императивных языков (таких, как C или C++), то решение на этом было бы закончено, поскольку оно сводится к элементарному двойному циклу. На R это «наивное решение» выглядит так:

build_naive <- function(n) {   m <- matrix(0, n, n)   for (i in 1:n)     for (j in 1:n)        m[i, j] <- min(i + j - 1,                      2*n - i - j + 1)   m } 

Даже несмотря на то, что мы заранее инициализируем матрицу нужного размера (отсутствие первой строки – преаллокации памяти – частая ошибка новичков), такое решение работает весьма медленно. Для знатоков языка такой результат вполне предсказуем: поскольку R – интерпретируемый язык, каждая итерация цикла влечёт множество накладных расходов на исполнение. Примеры с неоптимальным использованием циклов встречаются, пожалуй, в каждом учебнике по R. И вывод всегда один: по возможности использовать так называемые векторизированные функции. Они обычно реализованы на низком уровне (на C) и предельно оптимизированы.

Так, в нашем случае, когда элемент матрицы есть функция от двух индексов i и j, хорошо подойдёт сочетание функций outer и pmin:

build_outer_pmin <- function(n) {   outer(1:n, 1:n, function(i, j)           pmin(i + j - 1, 2*n - i - j + 1)) } 

Функция pmin отличается от min тем, что она оперирует векторами и на входе, и на выходе. Сравните: min(3:0, 1:4) ищет общий минимум (ноль в данном случае), а pmin(3:0, 1:4) вернёт вектор из попарных минимумов: (1, 2, 1, 0). Понятие векторизированной функции непросто сформулировать формально, но общая идея, надеюсь, понятна. Именно такую функцию ожидает в качестве аргумента функция outer. Именно поэтому передать в неё min, как в наивном решении, не получится – попробуйте это сделать и убедитесь, что возникнет ошибка. К слову, если мы всё-таки хотим использовать сочетание outer и min, мы можем выполнить принудительную векторизацию функции min, обернув её в функцию Vectorize:

build_outer_min <- function(n) {   outer(1:n, 1:n,          Vectorize(function(i, j)           min(i + j - 1, 2*n - i - j + 1))) } 

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

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

build_recursive <- function(n) {   if (n == 0) return(0)   m <- matrix(0, n, n)   m[-1, -n] <- build4(n - 1) + 1   m[1, ] <- 1:n   m[, n] <- n:1   m } 

В этом случае эффективность достигается за счёт того, что количество высокоуровневых итераций не n^2, как в наивном решении, а только n (роль цикла на себя берёт стек вызовов).

Наконец, в том случае, когда оптимизация на уровне базовых функций R не приводит к желаемому результату, всегда есть ещё один вариант: реализовать медленную часть на максимально низком уровне. То есть написать кусочек кода на чистом C или С++, скомпилировать его и вызывать из R. Такой подход популярен среди разработчиков пакетов в силу своей чрезвычайной эффективности и простоты, а также потому, что для работы с C++ существует замечательный пакет Rcpp.

library(Rcpp) cppFunction("NumericMatrix build_cpp(const int n) {             NumericMatrix x(n, n);             for (int i=0; i<n; i++)             for (int j=0; j<n; j++)             x(i, j) = std::min(i + j + 1, 2*n - i - j - 1);             return x;}") 

Когда мы подобным образом вызываем cppFunction, произойдёт компиляция кода на C++, и по её завершении мы получим функцию build_cpp в глобальном окружении, которую можно вызывать как любую другую определённую нами функцию. Из очевидных минусов такого подхода можно отметить необходимость компиляции (это тоже занимает время), не говоря уже о том, что необходимо владеть языком C++. Разумеется, использование Rcpp не является «серебряной пулей», и написать медленный код на C/C++ тоже довольно просто.

Пакет microbenchmark

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

Есть несколько типичных способов измерения скорости исполнения кода на R. Один из наиболее распространённых – это функция system.time. Когда используют эту функцию, обычно делают что-то вроде system.time(replicate(expr, 100)). Это неплохой вариант, но есть несколько пакетов, которые занимаются тем же самым, но в гораздо более удобном и настраиваемом исполнении. Фактически стандартом является пакет под названием microbenchmark, его мы и будем использовать. Всю работу будет выполнять одноимённая функция, которой можно передать произвольное количество выражений (см. unevaluated expression) для измерения. По умолчанию каждое выражение будет выполнено сто раз, и мы увидим собранную статистику по времени исполнения.

library(microbenchmark) measure <- function(n) {   microbenchmark(build_naive(n), build_outer_min(n), build_outer_pmin(n),                  build_recursive(n), build_cpp(n)) } m <- measure(100) m  Unit: microseconds                 expr       min         lq       mean     median        uq       max neval       build_naive(n) 20603.310 21825.7975 24380.0332 22884.3255 24215.368 66753.031   100   build_outer_min(n) 22624.873 25430.4985 28164.4496 26662.8955 29028.744 84972.926   100  build_outer_pmin(n)   159.755   187.8325   295.3822   204.1985   225.069  3710.103   100   build_recursive(n)  1741.992  2822.2910  5990.9897  3241.1980  3918.055 55059.974   100         build_cpp(n)    21.321    23.4230    33.6600    34.2335    38.588    91.289   100 

В полученном выводе результаты замера представлены в виде таблицы с набором описательных статистик. Кроме того, полученный объект можно рисовать: plot(m) или ggplot2::autoplot(m).

Пакет benchr

В настоящее время в разработке находится ещё один пакет, предназначенный для замера времени исполнения выражений – пакет benchr. Функционал и синтаксис практически идентичен пакету microbenchmark, но с некоторыми ключевыми отличиями. Кратко эти отличия можно описать так:

  1. Мы используем единый кроссплатформенный механизм измерения, основанный на таймере из С++11;
  2. Пользователю предоставляется больше опций для конфигурирования процесса измерения;
  3. Вывод текстовых и графических результатов становится более подробным и наглядным.

Пакет benhcr находится в CRAN (для версии R старше 3.3.2), а development-версия доступна на gitlab, там же есть инструкции по установке. Использование benchr в нашем примере будет выглядеть так (всё, что нужно – заменить функцию microbenchmark на функцию benchmark):

install.packages("benchr") library(benchr) measure2 <- function(n) {   benchmark(build_naive(n), build_outer_min(n), build_outer_pmin(n),             build_recursive(n), build_cpp(n)) } m2 <- measure2(100) m2   Benchmark summary: Time units : microseconds        expr n.eval   min lw.qu  median    mean   up.qu     max   total relative   build(n)    100 21800 24300 25600.0 27400.0 28100.0 79300.0 2740000   906.00  build2(n)    100 24400 28800 30100.0 31600.0 33700.0 44000.0 3160000  1070.00  build3(n)    100   157   189   198.0   738.0   217.0 43400.0   73800     7.02  build4(n)    100  1820  1980  3380.0  4910.0  4050.0 50000.0  491000   120.00  build5(n)    100    21    27    28.2    29.4    30.5    50.1    2940     1.00 

Помимо удобного текстового вывода (столбец relative позволяет быстро оценить преимущество самого быстрого решения), мы можем воспользоваться различными визуализациями. Кстати, если у вас установлен пакет ggplot2, он будет использован для отрисовки графиков. Если вы по каким-то причинам не хотите использовать ggplot2, такое поведение может быть изменено при помощи опций пакета benchr. Сейчас поддерживаются три типичных визуализации результатов замера: dotplot, boxplot и violin plot.

plot(m2) boxplot(m2) boxplot(m2, violin = TRUE) 

dotplot
boxplot
violin plot

Итоги

Итак, по результатам замеров можно сформулировать следующие выводы.

  1. Опорное (наивное) решение работает медленно, поскольку двойной цикл for производит n^2 высокоуровневых итераций, что не соответствует векторизированной направленности языка R;
  2. Прямой перенос цикла в функцию outer с принудительной векторизацией через Vectorize не решает проблему, потому что решение семантически идентично наивному;
  3. Рекурсивное решение быстрее на порядок, потому что высокоуровневых итераций становится n, а операции с подматрицами в R достаточно быстрые;
  4. Использование outer в сочетании с естественной векторизацией функции pmin на два порядка быстрее за счёт низкоуровневой реализации (скомпилированный C);
  5. Прямое обращение к Rcpp на три порядка быстрее (без учёта времени на компиляцию С++), поскольку пакет Rcpp дополнительно оптимизирован при помощи современных возможностей языка C++.

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

Небольшой disclaimer: пакет benchr задуман и реализован Артёмом Клевцовым (@artemklevtsov) с добавлениями и улучшениями от меня (Антон Антонов, @tonytonov) и Филиппа Управителева (@konhis). Мы будем рады баг репортам и предложениям по функциональности.

Задачи, подобные этой, легли в основу курса «Основы программирования на R» на платформе stepik. Курс открыт без дедлайнов (его можно проходить в свободном темпе) и включен в программу профессиональной переподготовки «Анализ данных» (СПбАУ РАН, Институт биоинформатики).

Если вы находитесь в Санкт-Петербурге, то будем рады видеть вас на одной из регулярных встреч SPb R user group (VK, meetup).

Материалы и дополнительное чтение по теме:

  1. Norman Matloff, The Art of R Programming: A Tour of Statistical Software Design
  2. Patrick Burns, The R Inferno
  3. Hadley Wickham, Advanced R
  4. Dirk Eddelbuettel, Seamless R and C++ Integration with Rcpp
  5. А. Б. Шипунов, Е. М. Балдин и др. Наглядная статистика. Используем R!

ссылка на оригинал статьи https://habrahabr.ru/post/316516/