...

суббота, 3 марта 2018 г.

ITSM-чатботы: что это такое, и зачем они нужны

Согласно отчету Deloitte, AI-платформы позволят государственным организациям экономить 1,2 миллиарда часов и 41,1 миллиарда долларов в год на Service Desk и управлении услугами за счет автоматизации рутинных задач. При этом, аналитики отмечают, что чатботы помогут использовать возможности систем ИИ для автоматизации бизнес-процессов.

В этом материале говорим о пользе чатботов для предприятий и ITSM-процессов, а также о том, какие AI-решения предлагают в ServiceNow.


/ Flickr / Simon / CC

В ServiceNow провели опрос руководителей ИТ-компаний: 87% из них отмечают, что автоматизация бизнес-процессов экономит время, средства и человеческие ресурсы. Как заявляют респонденты, выгода проявляется в увеличении скорости принятия решений (по мнению 83% опрошенных). Еще 69% опрошенных находят выгоду автоматизации в росте доходов, а 64% — в повышении конкурентоспособности организации.

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

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

Чем полезны чатботы


В Gartner и ServiceNow отмечают, что использовать возможности систем ИИ на уровне бизнес-процессов и взаимодействия с аудиторией или клиентами помогут чатботы. В Gartner предполагают, что к 2020 году 25% служб поддержки и обслуживания клиентов интегрируют «виртуальных помощников». Эксперты утверждают, что чатботы снизят время ожидания загрузки страниц и уменьшат объем ресурсов, который нужен для выполнения базовых запросов.

Эксперт по ITSM и ITAM Марсель Шоу (Marcel Shaw) выделяет три области, в которых чатботы могут полностью изменить принципы работы управления ИТ-услугами.

Помощь в решении проблем работников

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

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

Вице-президент и генеральный менеджер HR-подразделения ServiceNow Дипак Бхарадвадж (Deepak R. Bharadwaj) считает, что «в скором времени виртуальные агенты будут помогать сотрудникам искать нужную информацию». Это подтверждается опросом руководителей и работников HR-отделов: 92% специалистов по управлению персоналом заявили, что виртуальные помощники способны упростить поиск нужных данных. При этом, две третьих опрошенных руководителей полагают, что их сотрудники не будут испытывать затруднений при работе с системами ИИ.

А Стивен Манн (Stephen Mann), главный аналитик компании ITSM.tools, полагает, что чатботы позволяют работникам тратить больше времени на решение интересных и сложных, а не рутинных задач. Сами чатботы Манн называет «малозатратными членами команды, которые никогда не спят и оказывают техподдержку в формате 24/7».

Автоматизация back-end

Если говорить о работе с back-end-процессами на основе ITSM, чатботы с модулями машинного обучения смогут распознавать паттерны неполадок и устранять сбои в работе на основе прошлого опыта. Поэтому сведения о предыдущих проблемах (например, выход серверов из строя, кибератаки) вкупе с интегрированными технологическими решениями (инструменты безопасности и мониторинга состояния систем) позволяют автоматизировать процессы устранения back-end-неполадок.

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

Кроме того, чатботы можно интегрировать с другими сервисами и приложениями компании. Раджеш Ганесан (Rajesh Ganesan), продакт-менеджер компании ManageEngine, заявляет, что благодаря чатботам «организация может объединять свои инструменты с такими приложениями как WhatsApp. Это позволяет ИТ-отделам оказывать клиентам более качественные услуги».

Управление базой знаний

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


/ Flickr / kuhnmi / CC

Какие есть решения у ServiceNow


Вместе с релизом Kingston (об особенностях которого можно почитать в нашем блоге) ServiceNow выпустили ITSM-чатбот, который объединяет сервисы ServiceNow Connect и IBM Watson Conversation.

Чатбот предварительно сконфигурирован под несколько ITSM-процессов: от создания инцидентов и проверки их статуса до поиска конфигурационных единиц по CMDB. С помощью веб-интерфейса ServiceNow можно создавать свои ITSM-юзкейсы для чатбота.

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

Технологию уже опробовали в Альбертском университете. Через 2 недели после интеграции чатбот правильно обрабатывал 30% полученных запросов. А спустя 2 месяца чатбот смог управлять 30 ИТ-услугами. ИТ-специалисты университета намерены раскрыть потенциал инструмента и довести точность обработки запросов до 80%.

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

Еще один продукт ServiceNow — Qlue — пока еще готовится к выходу. В мае 2017 года ServiceNow сообщили о приобретении компании Qlue, которая занимается системами ИИ. Покупка позволит клиентам ServiceNow использовать Intelligent Automation Engine для решения повседневных задач с помощью возможностей чатботов. Рахим Ясин (Rahim Yaseen), соучредитель и главный технический директор Qlue, поясняет: «Чатботы смогут выполнять простые, повторяющиеся задачи и предоставлять индивидуальный диалоговый сервис клиентам ServiceNow».

Qlue может «отвечать» на часто задаваемые вопросы (например, «Каков статус моего заказа?») или разрешать проблемы вроде медленной работы интернет-соединения. ServiceNow планируют адаптировать Qlue под задачи разных отделов: от ИТ до HR и клиентской службы.

О точной дате релиза Qlue пока не сообщается, однако создатели уже работают над внедрением решения в Now Platform.

Помимо этого, ServiceNow объявили о своих инвестициях в стартап BuildOnMe, который занимается разработкой приложений на базе ИИ для Now Platform. Как сообщают в Business Wire, BuildOnMe-чатбот Bob (BuildOn Bot) стал первым HR-помощником, интегрированным в Now Platform. Bob способен помогать сотрудникам HR-отдела работать с базой знаний. При этом к чатботу можно общаться на человеческом языке.

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

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



Другие материалы о работе с ServiceNow из корпоративного блога ИТ Гильдии:

Let's block ads! (Why?)

Подборка: 12 сервисов для защиты от DDoS-атак

image

По статистике, около 33% компаний попадают под DDoS-атаки. Предсказать атаку невозможно, а некоторые из них могут быть действительно мощными и достигать 300-500 Гб/с. Для того чтобы обезопасить себя от DDoS-атак можно воспользоваться услугами специализированных сервисов. Не все владельцы сайтов знают, куда бежать, если попал под атаку — так что я решил собрать несколько вариантов в одном топике.

Примечание: при подготовке к посту использовались англоязычные материалы и публикации на Хабре

Cloudflare


Один из самых известных защитных сервисов. При использовании тарифов FREE и PRO можно рассчитывать на базовую защиту от DDoS-атак. Для более надёжной защиты от атак уровней 3, 4 и 7 нужно подключить бизнес или корпоративный аккаунт.

В Cloudflare фиксированная оплата, то есть независимо от того сколько и каких уровней будут атаки, клиент платит одну и ту же сумму. Среди клиентов этого сервиса такие крупные компании, как Nasdaq, DigitalOcean, Cisco, Salesforce и Udacity.

Сеть Cloudflare представлена в 102 датацентрах с пропускной способностью более 10 Тбит/с и способна устранять любые атаки, а также отражать DNS и Smurf-атаки. У сервиса также есть круглосуточная служба экстренной помощи, куда можно обратиться во время атаки.

Incapsula


Этот сервис предлагает комплексную защиту от атак различных типов. Сервис может работать постоянно или по запросу и обнаруживать любые атаки. Сеть Incapsula состоит из 32 дата-центров с пропускной способностью в 3 Тбит/с. У Incapsula есть пробная версия для бизнеса c SSL протоколом, CDN и WAF, которая защитит от DDoS-атак.

На случай, если атака уже совершена и счёт идёт на минуты, можно воспользоваться сервисом экстренной помощи Under Attaсk.

Akamai


Этот сервис один из лидеров в сфере обеспечения безопасности и CDN. Akamai установил рекорд и справился с атакой в 620 Гб/с.

Этот сервис построен на интеллектуальной платформе Akamai и оказывает поддержку круглосуточно. Защитить сайты можно от всех известных атак, включая зашифрованный трафик. У Akamai 1300 сетевых адресов более чем в 100 странах.

Qrator


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

Кроме того, даже при необходимости отражения атаки на уровне приложений (7 уровень модели OSI) не требуется тонкой настройки продукта — при обнаружении атаки система перейдет в нужный режим автоматически.

Для подключения защиты Qrator нужно изменить A-запись сайта. К недостаткам можно отнести достаточно высокую стоимость использования продукта, но компания предоставляет SLA (если уровень услуги не обеспечен, платить не обязательно) и бесплатный тестовый период в семь суток.

AWS Shield Advanced


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

Все эти службы защиты от DDoS-атак предназначены для блоггеров, электронной коммерции, малого и среднего бизнеса. Для бизнеса более крупных масштабов существуют другие сервисы, с более высоким уровнем защиты и большим функционалом. Вот некоторые из них: Сети ARBOR, Neustar, Rackspace, Akamai, F5 Silverline и Radware.

King Servers Anti DDoS


Еще один российский проект со своим блогом на Хабре. Поскольку King Servers — это хостинг-провайдер, то и защитный инструмент компании «заточен» под нужды пользователей хостинга. Защита предоставляется в двух вариантах — при аренде оборудования в определенном дата-центре оно сразу попадает в зону фильтрации (защищенный хостинг). Если площадка в этой зоне по каким-то причинам не подходит, остается вариант удаленной защиты, при которой размещать оборудование в дата-центре компании не нужно.

Компания дает гарантию безопасности от SYN Flood, UDP/ICMP Flood, HTTP/HTTPS-атак, фильтрацию грязного трафика до 1 ТБит/с — чистый трафик выделяется и направляется на сайт пользователя. Пользователям не нужно самим заниматься настройками, эту задачу берет на себя круглосуточная служба поддержки, которая отрабатывает и заявки на кастомизацию сервиса.

BeeThink Anti-DDoS Guardian


Этот инструмент защищает серверы Windows от большинства DoS и DDoS-атак: SYN, IP flood, TCP flood, UDP flood, ICMP flood, HTTP-DDoS, атак 7 уровня и многих других.

Сервис BeeThink совместим с Windows 10, Windows 8, Windows 7, Windows 2016, Windows 2012, Windows 2008, Windows 2003, Windows 2000, Windows XP и Vista.

Помимо защиты от DDoS-атак сервис в режиме реального времени проводит мониторинг сетевых операций, поддерживает разные форматы IP-адресов, поддерживает black и white листы, ищет удалённые IP-адреса и информацию о их владельцах. Базовый тариф стоит $99,95.

Sucuri


Этот сервис предоставляет защиту для любых сайтов: WordPress, Joomla, Drupal, Magento, Microsoft.Net и других.

Sucuri предоставляет антивирус и межсетевой экран для сайтов, в которые включена защита от DDoS. Также сервис обнаруживает и удаляет вредоносные программы, повышает производительность сайтов, защищает от брутфорс-атак и защищает от ботов. Минимальная стоимость месячного тарифа — $19,88.

Cloudbric


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

Разработчики гарантируют защиту от всех кибератак. Среди клиентов сервиса такие крупные компании, как Samsung, ING и eBay.

Стоимость использования зависит от объёма трафика, так за 10 Гб придётся заплатить $29, а за 100 Гб $149. Если объём трафика не превышает 4 Гб, сервисом можно пользоваться бесплатно.

Alibaba Anti-DDoS


Сервис китайского гиганта интернет-коммерции поможет справиться с атаками до 2 Тбит/с и поддерживает все протоколы: TCP, UDP, HTTP, HTTPS.

Сервис можно использовать не только для защиты сайтов, расположенных на хостинге Alibaba, но и размещённых на AWS, Azure, Google Cloud и других.

Также Anti-DDos Pro работает круглосуточно и в случае проблем, можно обратиться в службу поддержки к экспертам по безопасности.

StormWall Pro


Этот инструмент защищает от любых уровней DDoS-атак и поддерживает сайты на платформах Drupal, Joomla, WordPress, Bitrix, Magento, PrestaShop и других CMS.

Датацентры StormWall расположены в США, России и Европе и работают с минимальной задержкой. Настройка системы займёт всего несколько минут, а в случае трудностей, это могут сделать менеджеры компании. Любая техническая проблема, которая может возникнуть в течение работы, будет решена в короткие сроки — ответа техподдержки придётся ждать не дольше 15 минут.

Стоимость использования сервиса зависит от количества посетителей сайта. Так, за $69 можно обеспечить защиту сайта с 5000 посетителей в месяц, а за $300 купить безлимит.

Myra


Сервис Myra DDoS полностью автоматизирован и предназначен для защиты сайта, DNS-серверов и веб-приложений. Система подходит для всех типов CMS и интернет-магазинов.

Штаб-квартира Myra расположена в Германии, поэтому все данные обрабатываются согласно законом о конфиденциальности этой страны.



Предлагаю собрать в комментариях более полный список полезных инструментов по защите от DDoS. Какие сервисы знаете вы?

Let's block ads! (Why?)

Тренинг FastTrack. «Сетевые основы». «Основы беспроводной локальной сети». Часть первая. Эдди Мартин. Декабрь, 2012

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

Мы продолжаем цикл из 18 статей на основе его лекций:

Тренинг FastTrack. «Сетевые основы». «Понимание модели OSI». Часть первая. Эдди Мартин. Декабрь, 2012

Тренинг FastTrack. «Сетевые основы». «Понимание модели OSI». Часть вторая. Эдди Мартин. Декабрь, 2012

Тренинг FastTrack. «Сетевые основы». «Понимание архитектуры Cisco». Эдди Мартин. Декабрь, 2012

Тренинг FastTrack. «Сетевые основы». «Основы коммутации или свитчей». Часть первая. Эдди Мартин. Декабрь, 2012

Тренинг FastTrack. «Сетевые основы». «Основы коммутации или свитчей». Часть вторая. Эдди Мартин. Декабрь, 2012

Тренинг FastTrack. «Сетевые основы». «Свитчи от Cisco». Эдди Мартин. Декабрь, 2012

Тренинг FastTrack. «Сетевые основы». «Область использования сетевых коммутаторов, ценность свитчей Cisco». Эдди Мартин. Декабрь, 2012

Тренинг FastTrack. «Сетевые основы». «Основы беспроводной локальной сети». Часть первая. Эдди Мартин. Декабрь, 2012

И вот восьмая из них.

Тренинг FastTrack. «Сетевые основы». «Основы беспроводной локальной сети». Часть первая. Эдди Мартин. Декабрь, 2012


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

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

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

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

Но давайте подумаем о беспроводной сети с точки зрения того, как она изменила наш мир. Беспроводные сети у нас на службе ужа давно, помните первые беспроводные телефоны? Они у нас дома у всех стояли. На какой частоте они работали, Вы помните? 900 мегагерц. У них был хороших охват, но что в них было не так? Что было не так с этими телефонами у нас дома с частотой в 900 мегагерц? Они не были защищены. Люди могли Вас слышать. Хорошо, если у Вас у первого появлялся такой телефон, но потом телефоны появлялись и у соседей и они могли попасть на Ваш канал связи и слышать Вас. У меня на заднем дворе до сих пор есть пара колонок на 900 мегагерц, которые я использую для всяких спортивных развлечений и прочего. А у моего соседа через дорогу до сих пор есть телефон, работающий на частоте 900 мегагерц. Это очень старый телефон и я могу настроиться на его канал и слушать, о чём он говорит.

900 мегагерц обеспечивают большой диапазон, но небольшую пропускную способность. Но знаете, у нас уже в то время были и беспроводные сети, работающие на частоте 900 мегагерц. У них был мегабит пропускной способности, и это уже была революция. Немногие знали об этом, потому эта функция была очень уникальной и специализированной. Частоты пересекались и люди говорили — нет, мне нужно что-то более защищенное. Я не хочу, чтобы меня слышали другие люди, так что я хочу частоту 2,4 гигагерца.

И мы перешли на свободную частоту спектра, 2,4 ГГц DSS (digital spread spectrum), цифровой расширенный спектр. Вы могли не переживать, что Вас услышат и выбирать себе канал для связи, используя настройки телефона. Но почему мы не остались в той сети? Почему мы не используем её до сих пор?

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

Не уверен на какой частоте он работал, возможно 1.9 ГГц, но его называли Dect 6.0. Он был вне рабочего диапазона всех остальных устройств и потому, пожалуй, считался наиболее безопасным. Эти диапазоны были заполнены. Я скажу Вам, что тогда, когда в конце 90-х мы разрабатывали стандарты, а это было очень важно, было много фирм и у всех они были свои. Были свои рабочие частоты, свои расширенные цифровые спектры. И они не работали друг с другом нормально. Многие думали — это не часть моего бизнеса, я не буду ничего делать. Потом появились эти стандарты.

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

Как Вы думаете, что происходит, когда Cisco покупают другую фирму? Первым делом, мы переводим всю продукцию на свою операционную систему. Когда мы купили Era Net, первым делом мы дали им своё оборудование, точки доступа 350 серии. И мы проапгрейдили их операционную систему до нашей. Мы конвертировали их программное обеспечение, их операционку и получили самую умную точку доступа в мире. Не было ничего, чего она бы не делала. Забегая на перёд скажу, что это было не самым лучшим решением на том этапе.

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

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

Сейчас объясню. Клиент ассоциируется с точкой доступа. Это выглядит так. Компьютер видит беспроводную сеть, и говорит: «Я хочу подключиться». Представим, что у нас есть три точки доступа и один клиент. Я говорю: «Вы все трое выглядите для меня одинаково, позвольте мне задать Вам несколько вопросов». — «Сколько у Вас пользователей в сети»? — «А сколько у Вас»? — «А у Вас»? — «Какая у Вас утилизация»? Я могу понять, какая из точек доступа больше подходит мне, где меньше всего пользователей, где связь будет качественней, базируясь на опросе множества точек доступа. Потом я выбираю, и говорю: «Я хочу подключиться к тебе». Как часто мы подключаемся к той сети, которая не была создана для нас? Часто. Почему бы не подключиться к сети соседа? Это же бесплатно. Так и есть, согласитесь. Здесь нет никакой защиты.

Переходим ко второй ступени — аутентификации.

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

Есть ли у Вас дома такие полномочия? У вас есть SSID (service set identifier), транслируемый в виде имени беспроводной сети роутером, которое можно скрыть и у Вас есть ключ, который может состоять из множества букв, цифр или быть фразой. Дома у нас есть ключ совместного использования сети для аутентификации. У меня есть множество девайсов и один ключ доступа для них. Почему в бизнесе это не подойдёт?

Просто представьте, что в Cisco работает 70 тысяч человек. Представим, что в Blizzard у нас были бы логин и пароль Blizzard. Вы никому не говорите. Это секрет. Вы берёте свой ноутбук, логинитесь, потом оставляете его где-то без присмотра и у Вас воруют данные для входа. Что произойдет? Мне придется сменить данные для входа и на остальных 60999 компьютерах. Что на самом деле идентифицирует Вас, как именно Вас — это Ваши логин и пароль.

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

Что это за сервер?

Это три буквы А, то есть аутентификация, авторизация и учёт. Мы продаём и эти серверы ААА. Когда Вас принимают на работу в нашу фирму, Вам сразу же присваивают Ваши данные для входа в сеть. Логин Ваш в виде электронной почты и Ваш первый пароль. Вы логинитесь и потом сразу же меняете пароль.Там сразу же указываются требования к паролю, например, не меньше 8 букв, с заглавными буквами, цифрами, или ещё чем-то. Но всё это нужно нам для того, чтобы понять, что это Вы.

Клиенты часто привыкли говорить, что беспроводная сеть это небезопасно. Но я объясняю, что беспроводная сеть может быть гораздо безопаснее, чем проводная. Я мог прийти к клиентам, подключить свой компьютер и сразу попадать к ним в сеть. Теперь для доступа в сеть Вам нужно пройти аутентификацию. Именно сервер ААА говорит нам о том, кто Вы, когда подключились и куда имеете доступ и когда Вы отключились. Именно этим и занимается сервер ААА. Когда Вам дали доступ, Ваш запрос отправляется на этот сервер и Вы получаете первый ключ шифрования (encrypted key), у каждого есть свой уникальный ключ шифрования. У Вас свой ключ, у Вас свой, и мы раздаём их случайно. Всё очень безопасно. Любая информация, поступающая от компьютера, зашифрована благодаря этому ключу и ключ постоянно меняется.

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

Что мы скажем клиенту, который усомнится в безопасности беспроводных сетей? Он скажет — мне не нужна беспроводная сеть, она небезопасна. Что Вы ему скажете? Не знаю, как Вы, но я сказал: «А Вы знаете, где есть беспроводные сети»? Если бы сейчас в этом кабинете не висела так явно точка доступа, как бы Вы могли это понять? Вы можете её понюхать, попробовать на вкус, услышать? Нет. Вы не сможете понять, есть ли здесь беспроводная сеть. Вам нужно будет устройство, чтобы это узнать.

Раньше были такие маленькие точки доступа, помните? Я как-то проводил тренинг в Южной Калифорнии на Лонг Бич в отеле Мариотт. Мы находились в удалённом уголке всего этого гостиничного комплекса, там было не очень с сигналом беспроводной сети. Я, будучи инструктором, купил проводное соединение. У меня со связью всё было отлично, но студенты были вне себя от ярости. Связь лагает, ну или как это сказать по-технически. И что я сделал? Я на следующий день установил Lynksys, вот Вам доступ, хватит ныть и давайте продолжим занятия. Я на самом деле установил не авторизованную связь с той сетью и никто так ничего мне и не сказал.

Вернемся к клиенту с выпрыгивающими из глазниц глазами. Я спросил его: «Откуда Вы знаете, что у Вас нет беспроводной сети»? Мой аккаунт менеджер, конечно, пнул меня потом за это своими острыми ботинками. Пнул прямо в голень и это было ободряюще. И угадайте, чем всё закончилось? Мы продали тому клиенту точки доступа, которые выполняли единственную функцию — защищали от вторжения в сеть. Он боялся, что кто-то за файерволом подключит беспроводную сеть и что мы сделали? Мы установили беспроводную сеть, чтобы предотвратить подключение по беспроводной сети.

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

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

Я беру свой компьютер и начинаю с ним бродить. Я иду отсюда сюда, от одной точки к другой и это называется роуминг. Это похоже на то, что Вы делаете со своими сотовыми телефонами. У точек есть свой радиус и так далее. В этой точке мой компьютер понимает, что ни эта точка доступа не дает мне нужного уровня сигнала, ни другая. Представим, что я показываю презентацию в PowerPoint, ведь я же всё-таки на собрании Cisco. То есть у меня происходит загрузка. Что же случится с этой загрузкой?

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

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

Всё было лучше некуда, но потом Cisco начали продавать другую продукцию. Мы выпустили телефоны, Spectral link — это были первые телефоны, которые мы сюда подключили. Мы смогли начать передавать голос по беспроводной связи. И тут начались проблемы.

Итак, поговорим о телефонах. Мы поместили сюда специальный VLAN, который назывался Voice Net. Представим, что я работаю на Blizzard здесь и хочу поместить все мои голосовые девайсы в Voice Net. Дать им больший приоритет, большую пропускную способность, возможность для того, чтобы передача голоса шла отлично. Я просто в восторге и подключаю эти девайсы. Голос подключен к Voice Net, я сам к Blizzard, всё отлично работает, я загружаю свой файл, начинаю передвигаться по комнате. И когда я начинаю ходить и оказываюсь примерно в этой точке, звонит моя жена. Привет, дорогая, как твои дела? Хочешь рассказать мне, что я сегодня сделал не так? Давай я отменю свою встречу, и ты продолжишь? Разговор происходит в этой точке.

Я начинаю идти и говорю со своей женой и что же случится, когда я окажусь на границе сетей? Мой разговор прервётся. Разговор прерывается, хотя сбой составляет всего 1 секунду. И я оказываюсь в зоне другой точки доступа. Жена мне перезванивает. Она говорит: «Ты что сбросил меня»? — «Нет, что ты, это всё технологии». — «Это всё беспроводная технология». — «Не надо винить технологии, Вы, гики, постоянно только о них и говорите». Потом я выхожу и из этой сети и уже не перезваниваю, пусть оставит мне голосовое сообщение. Мне уже конец, без шансов. Всего одна секунда остановки и перехода в другую сеть составляет 20 продолжительностей жизни для телефонного звонка.

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

И тут Cisco нашли выход из ситуации. Это потребовало Catalyst 6500, супервизора за 40 тысяч долларов, линейной карты за 45 тысяч долларов, 20 часов работы инженеров, которые организовали все эти туннели в сети. Не самое лучшее решение. У Cisco есть такие небольшие карточки, которые мы раздаём, и на одной из них написано — никакого поклонения технологии. И нам пришлось купить еще одну фирму, чтобы решить этот вопрос. Ведь иногда бывают ситуации, когда быть умным не так уж и умно.

Итак, Cisco купили фирму Airspace. Это было отличное приобретение для Cisco, так как в тот момент мы решили — давайте не будем делать точки доступа умными. Давайте делать их упрощёнными или, иначе говоря, тупыми. Некоторые начали называть их тупыми. Вместо того, чтобы устанавливать все фичи на все точки доступа, я установлю их в одном месте — в контроллере. Я помещу новый девайс в сеть. Этот контроллер будет мозговым центром всех точек доступа. У этой точки раньше был свой мозг, но теперь его там нет. Он в контроллере.

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

Когда мы ещё не купили эту фирму, мы думали, что упрощённые точки доступа — это ужасно, но потом поняли, что это отличная идея. Я даже не знаю, можно ли считать этот процесс перехода к упрощенным точкам апгрейдом, ведь сначала были умные точки доступа, а теперь есть не самые умные точки доступа, но с контроллером. Нам пришлось это сделать, так как изменились правила игры. Мы перешли от мира данных к миру голоса и видео. Людям это было очень нужно из соображений бизнеса. Беспроводные сети уже плотно вошли в их бизнес процессы. Именно поэтому в нашем случае, в случае этой технологии — чем проще, тем лучше. Мы используем упрощённые точки доступа с контроллерами, которые могут быть очень небольшими, например на 50 точек доступа, или просто огромными на 1000 точек доступа и больше, в зависимости от Ваших потребностей. Мы посмотрим на всю нашу продукцию в другой секции.

Теперь снова поговорим о BYOD (bring your own device), мы обсуждали эту концепцию ранее здесь. Я считаю, что BYOD — самый простой способ общаться с клиентом о чём угодно. Мне очень нравится проводить такие беседы с клиентами и приводить их к нужному мне решению. Что эта концепция означает для Вашего клиента? Возможность приносить свои устройства куда угодно и иметь доступ к информации.

Есть ли в связи с этим какая-то обеспокоенность, связанная с безопасностью? Да, безусловно. У нас в Cisco может быть до 16 VLAN на каждой точке доступа. Мы можем раздавать им приоритеты и раздавать трафик в соответствие с приоритетом. В этом случае беспроводную связь можно сравнить с хабами.

Представим, что я — точка доступа, а Вы все мои клиенты, которые могут быть и айфонами и айпадами, ругие могут быть компьютерами или ещё чем-то и я могу раздавать им всем приоритеты. Я выбираю, кто будет говорить. Беспроводная сеть напоминает рацию. Помните рации? Люди до сих пор ими пользуются и я тоже, когда выезжаю на охоту. Но как мы пользуемся рацией? Мы нажимаем на кнопку, чтобы что-то сказать, потом отпускаем её, но почему? Потому что, если оба человека будут одновременно говорить — ничего не получится.

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

Итак, у Вас может быть 16 VLAN и контроллер для работы, но теперь у нас появляются Ваши устройства и нужно благодаря приоритетам определить, каки устройства могут быть подключены и как. Для этого у нас на бэкенде есть ISE (Cisco Identity Services Engine) — сервис идентификации.

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

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

Это важно для клиентов сейчас? Конечно. Мы не можем запретить людям приносить свои гаджеты, но мы можем контролировать этот процесс и ограничивать свою уязвимость. Интеграция между контроллером и ISE очень гладкая. Это новейший сервис, разработанный исключительно для данной задачи и для этой новой волны мобильности.

Как насчёт выявления неполадок? Как Вы думаете, что думали айтишники, когда мы только представили им беспроводные технологии? Они ненавидели их. Почему они ненавидели беспроводные технологии? У меня был клиент, который говорил: «Мне не нужны беспроводные сети, я не хочу их у себя видеть». И это был менеджер поддержки дэсктопов. Он сказал: «Ты представляешь, сколько дополнительных звонков мне поступит»?

Это происходит и сейчас. Утро понедельника, без пяти девять, у кого-то собрание ровно в 9 утра. «Мой компьютер работал по беспроводной сети идеально ещё в пятницу, а теперь он не работает и это нужно срочно исправлять». Сотрудник поддержки спрашивает о том, что изменилось. И ему отвечают, что ничего. — «Я выключил компьютер и ушел домой». — «Правда»? -«Да». Им наконец-то удаётся залезть в компьютер и посмотреть, что там есть и они видят 6 разных сетей, запущённую игру и тут им говорят: «Ну, может мой сын немного с ним поиграл дома». Можно ли было это предотвратить? Нет, нельзя. У этого есть много преимуществ в сфере бизнеса и в культурной сфере.

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

Итак, как на счет выявления неполадок? Нам нужен способ выявлять неполадки. Какова история Cisco в менеджменте сетей? У нас было много продуктов по менеджменту, приложений. И какова наша репутация среди клиентов в данном вопросе? Не очень хорошая, не очень. У Cisco очень много инструментов управления сетевыми ресурсами и я скажу Вам, что все они отстой. Это технический термин.

Prime — это первый сетевой менеджер, который я бы посоветовал своим клиентам. Он на самом деле хорош. Но Prime — это не новшество от Cisco. Мы получили его от той самой фирмы Airspace, которую купили. Prime позволяет нам смотреть на точки доступа, свитчи или роутеры, к которым они подключены, контроллер и ISE. Так что, если кто-то звонит и говорит, что не может подключиться к сети, я могу сказать: «Погоди минутку, где именно ты находишься»? -«О, теперь я вижу, кажется, ты светишься в домашней сети, а не в нашей, я могу это увидеть отсюда». -«Окей, мне нужно использовать Blizzard». -«Так, всё-равно не работает». -«Кажется, что у тебя не проходит аутентификация, потому что не был распознан логин, неправильный пароль». Нам всегда будут нужны функции, вне SNMP и если Вы захотите загрузить MIBS, Вы сможете это сделать, но Cisco всегда будет лучше работать с Cisco, чем с чем-угодно другим.

Мы в Cisco работаем с множеством беспроводных сетей у себя. Одна из них Blizzard, распространённая по всех наших офисах. Hurricane — это уже новая сеть, мы мигрируем постепенно людей в неё. Есть ещё и отдельная сеть для Jabber, для тех, кто использует Jabber для видео и голоса.

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

У меня есть знакомый из отдела продаж, Майк, и он говорит: «Я никогда не выполню свою квоту по продажи беспроводных сетей только за счёт беспроводных сетей, но я могу достигнуть плана, если буду продавать их во всех своих сделках». Раньше это было что-то вроде добавки, сейчас это уже идёт впереди. Сейчас беспроводные сети тянут за собой свитчи, управление сетями и всё остальное. Это как наконечник у копья, который служит для прокола, ведь не при помощи древка мы вонзаем копье, а при помощи острого конца. Благодаря протоколу SNMP я могу управлять устройствами любого производства, так как это стандартный протокол. Я могу потом загрузить дополнительные MIB-ы, чтобы разблокировать нужные специальные возможности. Вам придётся заплатить за MIB-ы, чтобы получить доступ.

И снова напомню, что мы здесь говорим о системе защиты, но это тоже сервер ААА. Было два продукта контроля доступа — NAG (Network Admissions Control) и ACS от Cisco. И мы соединили эти два продукта вместе. Теперь Prime сможет следить за всем, что происходит здесь и здесь и где угодно в сети.

А теперь вернёмся к тому, что будут делать наши клиенты на этих устройствах. Раньше у меня было 2 устройства, а что у меня есть сейчас? У меня есть айпад, что я могу на нём делать? Что я могу делать на айпаде, если возьму его с собой? Я захочу пользоваться почтой, то есть использовать приложения данных. Что ещё? Видео. Могу ли я смотреть видео высокого разрешения? Да. Все эти мои задачи заставят сеть выполнять больше работы?

Сейчас мы говорим не о Medianet, свитчах и роутерах, а о WLAN. Что же изменилось для WLAN, для беспроводных сетей? Начнём с того, сколько у меня есть вариантов? Могу ли я использовать для айпада проводную и беспроводную сеть? Нет. И что это для меня означает? Что беспроводная сеть должна быть надёжной. Ведь это единственная возможная связь для меня. Я не могу сказать, что беспроводная связь не работает, дайте мне кабель. Это не сработает, так что доступность сети должна возрасти. Поэтому одной из главных функций будет доступность этих точек доступа, и их возможность устранять помехи. Вы думаете в сети будет больше или меньше беспроводных устройств? Конечно, больше. Что может мешать беспроводной сети? Не только другие беспроводные устройства, но и микроволновые печи. Знаете, как работают микроволновые печи? Они используют частоты, чтоб заставить молекулы тереться друг о друга. Так появляется тепло и так еда нагревается. Эта частота — 2,4 гигагерца. Та же частота, что и используемая нами. Но мы при этом используем 100 милливатт, а микроволновки 1500 Ватт. То есть мы медленно готовим Вас при помощи беспроводных сетей. Это шутка, я не серьезно это сказал.

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

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

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

В беспроводных сетях есть спектры в 2,4 и в 5 гигагерц. Между ними есть разница. Какой из них самый старый? Каким мы дольше пользуемся? Первым, 2,4 ГГц, он старше. Сколько на нём каналов? 13. Можем ли мы использовать их все сразу? Нет. Но если мы напишем все каналы и представим, что я нахожусь на 1, а кто-то другой на 3, будем ли мы мешать друг другу? Да. В этом спектре есть всего 3 канала, которые не накладываются друг на друга.

Это каналы 1, 6 и 11 для США. То есть получается, что я могу поместить здесь лишь три точки доступа в этой комнате. А что на счет 5 гигагерц? Здесь больше каналов, которые не накладываются друг на друга? Сколько здесь всего каналов? 23 на данный момент. Раньше было 18, сейчас 23. И как много из них не накладываются друг на друга? 20 примерно. То есть у Вас есть 20 независимых каналов. Хорошие возможности для их бондинга (объединения) с целью получения большей пропускной способности. Какой из этих спектральных диапазонов имеет лучшие прогнозы на будущее?

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

Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас оформив заказ или порекомендовав знакомым, 30% скидка для пользователей Хабра на уникальный аналог entry-level серверов, который был придуман нами для Вас:Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от $20 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле? Только у нас 2 х Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 ТВ от $249 в Нидерландах и США! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?

Let's block ads! (Why?)

[Перевод] Rust: состояния типов

Webpack 4 и code splitting

25 февраля 2018 года вышел релиз webpack 4.0.0 (и на сегодняшний день 4.0.1). Одна из полезных и сравнительно новых фич webpack — code splitting, перенесена в новой версии из плагинов в основную конфигурацию. При практически полном отсутствии документации, как теперь нужно конфигурировать code splitting в версии 4 — я немного испытал шок, но все же попытался собрать информацию, чтобы по минимуму начать работать с новой версией. Я надеюсь, что через некоторое время появятся и обстоятельные tutorials, и статьи. Пока же спешу сделать заметки по найденной информации, чтобы не потерять ее на просторах интернета.
В webpack версии 3 code splitting конфигурировался в параметрах плагина:
new CommonsChunkPlugin({
      name: 'common',
      minChunks: 2,
}),

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

optimization: {
    minimize: false,
    runtimeChunk: { name: 'common' },
    splitChunks: {
      cacheGroups: {
        default: false,
        commons: {
          test: /\.jsx?$/,
          chunks: 'all',
          minChunks: 2,
          name: 'common',
          enforce: true,
        },
      },
    },
  },

К сожалению не все параметры в настоящее время документированы и многое остается неясным.

Let's block ads! (Why?)

agile gestalt

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

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

А еще психотерапия бывает не медицинской. Мысли о том, что в их жизни твориться что-то не то, а что именно, не понятно, приходят и здоровым людям. Бытовые советы, типа: “Да, ладно, не парься, — или, — Мне бы твои проблемы” — только подливают масла в огонь.

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

Само слово гештальт обозначает: “фигура на фоне”. Увидеть фигуру без фона нельзя. В этом посте, например, психотерапия последовательно рассматривалась на фоне психиатрии, бытовых разговоров и тренингов. Agile методологии видны только на фоне waterfall’а. Если его убрать, объяснить, что вообще значит be agile станет невозможно.

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

Гештальт подход питает особое уважение к текущему состоянию. Scrum standup с ответами на вопросы “Что сделано, что будет сделано, какие есть препятствия” в точности соответствует гешталисткому шерингу. Работа группы обычно начинается с фраз типа: “Расскажите про свое состояние, как вы себя чувствуете, какие есть запросы”. Смысл этих действий не в том, чтобы перед кем-то отчитаться. Это обнаружения себя. Обозначаемые чувства находят или не находят отклик в других участниках, завязывается групповая динамика. Во время шеринга возникающие диалоги гасятся. Их развитие осуществляется во время основной работы.

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

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

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

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

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

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

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

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

Вот примерно этим и занимаются гештальт терапевты. Уж больно это похоже на то, что делает scrum master, не правда ли?

Let's block ads! (Why?)

[Перевод] Системный крафтинг в «Проклятых землях»


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

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

Но на самом деле ЕСТЬ игра, в которой 18 лет назад реализован системный крафтинг. «Про́клятые земли» (Evil Islands) — это российская тактическая RPG, выпущенная в 2000 году. Я играл в неё, когда мне было девять лет, и именно благодаря «Проклятым землям» я захотел стать гейм-дизайнером. Я могу рассказывать об этой игре весь день. В ней можно найти интересное смешение механик, захватывающий сюжет, отличных персонажей, удивительную музыку и одну из лучших озвучек, которые я встречал за всю свою жизнь. Во всяком случае, если вы играете в оригинальную русскую версию, а не в английский перевод. Да, а так звучит голос главного героя в переводе. Мои глубочайшие сожаления.
Множество аспектов игры для того времени были очень инновационными. Сегодня они выглядят довольно стандартными, но системе крафтинга «Проклятых земель» до сих пор нет аналогов. По крайней мере, насколько я знаю — если вы знаете игру, которая изучала способы крафтинга похожим на Evil Islands способом, то дайте мне знать, я буду очень рад убедиться в этом.


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

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

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


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

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

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

Например, у каждого материала есть своя слабая сторона. Металл слаб против молний, поэтому если вы находитесь в области, где многие враги используют заклинания молний, то, возможно, стоит скрафтить меховую броню из меха синего тролля. Всего в игре 33 материала, 35 чертежа оружия и 124 чертежей брони. Кажется, что по стандартам RPG это НЕ ОЧЕНЬ много, пока не осознаешь, что на самом деле в игре 686 возможных предметов для крафта, которые благодаря модульной природе системы игроку освоить очень легко.


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

Как и в случае предметов, каждое заклинание имеет базовые характеристики, которые можно модифицировать при помощи рун. Для примера возьмём это заклинание разряда молнии. Мы можем использовать руны, увеличивающие расстояние действия, урон или даже позволяющие атаковать нескольких целей одновременно! Но тут нужно быть аккуратными, чтобы не нанести урон своим друзьям, можно вставить руну, которая нацеливается только на врагов. Этот тип руны также полезен для заклинаний, имеющих область действия (area of effect). Однако когда вы вставляете руны, заклинание становится сложнее и требует больше стойкости (а также очков навыков, вкладываемых в магию), так что можно попробовать вставить руну, уменьшающую потребление маны. В конце концов можно настроить заклинание точно под свои нужды, и это просто замечательно. В игре всего 30 заклинаний: атакующие, защитные и изменяющие характеристики, и их можно использовать множеством различных способов.

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

Но в «Проклятых землях» есть и по-настоящему классные вещи. У персонажа есть стойкость (stamina), которая используется для заклинаний. У предметов есть энергия, которая зависит от базового предмета и использованного материала. Почему я говорю об этом? Потому что предметы тоже могут создавать заклинания — их можно комбинировать.


Хотите сделать фрагмент брони, который будет лечить вас при каждом наносимом вами ударе? Это можно устроить. Как насчёт шлема, который увеличивает дальность обзора? Есть такое. Стоит ли скомбинировать с мечом заклинание ослабления, чтобы оно помогало в бою с врагами? Почему нет, это удобно. Автоматический пулемёт заклинаний, наносящий урон всем врагам, когда вы пробегаете мимо? Возможно и это. Существует также особый тип объекта — жезл, который можно использовать для активируемых или автоматизированных способностей, сам по себе не требующий затрат маны. Игрок может придумывать множество интересных комбинаций и стратегий.

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

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

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

Let's block ads! (Why?)

Быстрая интерактивная схема зала на canvas


Разрабатываем библиотеку для отображения больших интерактивных схем залов на canvas без фреймворков и заставляем хорошо работать в ie и мобильных устройствах. Попутно разбираемся с особенностями работы canvas.


Почему TypeScript?

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


Постановка задачи

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


  • Производительность: 5-10 тысяч объектов не должны смущать нашу библиотеку даже в ie
  • На каждый объект можно навести курсор/кликнуть, и объект должен иметь возможность это обработать
  • Схема должна масштабироваться и двигаться
  • Адаптивность под размеры контейнера
  • Поддержка touch устройств

Введение

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

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

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

Кроме оптимизации поиска, постараемся следовать следующим правилам работы с canvas:


requestAnimationFrame

У браузера есть свой таймер отрисовки, и с помощью метода requestAnimationFrame можно попросить браузер отрисовать наш кадр вместе с остальными анимациями, — это позволит избежать двойной работы браузера. Для отмены анимации есть cancelAnimationFrame. Полифил.


Кеширование сложных объектов

Не обязательно постоянно перерисовывать сложные объекты, если они не изменяются. Можно отрисовать их заранее на скрытом canvas, а потом брать оттуда.


Отрисовывать только видимые объекты

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


Перерисовывать только изменившиеся объекты

Нет смысла перерисовывать всю сцену, если изменился один элемент.


Меньше текста

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

Архитектура


Scheme — основной класс.
View — класс знает canvas, на котором нужно рисовать, и его параметры (у нас их будет два).
SchemeObject — класс объекта схемы знает свое местоположение, как себя отрисовать и как обрабатывать события. Может содержать дополнительные параметры, например, цену.
EventManager — класс обработки и создания событий. При получении события передает его нужному классу.
ScrollManager — класс, отвечающий за скролл схемы.
ZoomManager — класс, отвечающий за зум схемы.
StorageManager — класс, отвечающий за хранение объектов схемы, создание дерева поиска и поиск объектов по координатам.
Polyfill — класс с набором поллифилов для кроссбраузерности.
Tools — класс с различными функциями, типа определения пересечения квадратов.
ImageStorage — класс создания канвасов для хранения изображений

Конфигурация

Очень хочется, чтобы у схемы были гибкие настройки. Для этого создадим такой нехитрый метод конфигурации объекта:

         /**
         * Object configurator
         * @param obj
         * @param params
         */
        public static configure(obj: any, params: any)
        {
                for (let paramName in params) {
                    let value = params[paramName];
                    let setter = 'set' + Tools.capitalizeFirstLetter(paramName);
                    if (typeof obj[setter] === 'function') {
                        obj[setter].apply(obj, [value]);
                    }
                }
        }

Теперь можно конфигурировать объекты так:

                Tools.configure(this, params.options);
                Tools.configure(this.scrollManager, params.scroll);
                Tools.configure(this.zoomManager, params.zoom);

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

Хранение и отображение объектов

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

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


Код

TreeNode — класс узла дерева знает своего родителя, своих детей и координаты квадрата содержащихся в нем объектов:


TreeNode
    /**
     * Tree node
     */
    export class TreeNode {

        /**
         * Parent node
         */
        protected parent: TreeNode;

        /**
         * Children nodes
         */
        protected children: TreeNode[] = [];

        /**
         * Bounding rect of node
         */
        protected boundingRect: BoundingRect;

        /**
         * Objects in node
         */
        protected objects: SchemeObject[] = [];

        /**
         * Depth
         */
        protected depth: number;

        /**
         * Constructor
         * @param parent
         * @param boundingRect
         * @param objects
         * @param depth
         */
        constructor(parent: null | TreeNode, boundingRect: BoundingRect, objects: SchemeObject[], depth: number)
        {
            this.parent = parent;
            this.boundingRect = boundingRect;
            this.objects = objects;
            this.depth = depth;
        }

        /**
         * Add child
         * @param child
         */
        public addChild(child: TreeNode): void
        {
            this.children.push(child);
        }

        /**
         * Get objects
         * @returns {SchemeObject[]}
         */
        public getObjects(): SchemeObject[]
        {
            return this.objects;
        }

        /**
         * Get children
         * @returns {TreeNode[]}
         */
        public getChildren(): TreeNode[]
        {
            return this.children;
        }

        /**
         * Is last node
         * @returns {boolean}
         */
        public isLastNode(): boolean
        {
            return this.objects.length > 0;
        }

        /**
         * Get last children
         * @returns {TreeNode[]}
         */
        public getLastChildren(): TreeNode[]
        {
            let result: TreeNode[] = [];
            for (let childNode of this.children) {
                if (childNode.isLastNode()) {
                    result.push(childNode);
                } else {
                    let lastChildNodeChildren = childNode.getLastChildren();
                    for (let lastChildNodeChild of lastChildNodeChildren) {
                        result.push(lastChildNodeChild);
                    }
                }
            }

            return result;
        }

        /**
         * Get child by coordinates
         * @param coordinates
         * @returns {TreeNode|null}
         */
        public getChildByCoordinates(coordinates: Coordinates): TreeNode | null
        {
            for (let childNode of this.children) {
                if (Tools.pointInRect(coordinates, childNode.getBoundingRect())) {
                    return childNode;
                }
            }

            return null;
        }

        /**
         * Get child by bounding rect
         * @param boundingRect
         * @returns {TreeNode[]}
         */
        public getChildrenByBoundingRect(boundingRect: BoundingRect): TreeNode[]
        {
            let result: TreeNode[] = [];

            for (let childNode of this.children) {
                if (Tools.rectIntersectRect(childNode.getBoundingRect(), boundingRect)) {
                    result.push(childNode);
                }
            }

            return result;
        }

        /**
         * Remove objects
         */
        public removeObjects(): void
        {
            this.objects = [];
        }

        /**
         * Get bounding rect
         * @returns {BoundingRect}
         */
        public getBoundingRect(): BoundingRect
        {
            return this.boundingRect;
        }

        /**
         * Get  depth
         * @returns {number}
         */
        public getDepth(): number
        {
            return this.depth;
        }


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


Два метода, которые этим занимаются
        /**
         * Recursive explode node
         * @param node
         * @param depth
         */
        protected explodeTreeNodes(node: TreeNode, depth: number): void
        {
            this.explodeTreeNode(node);
            depth--;
            if (depth > 0) {
                for (let childNode of node.getChildren()) {
                    this.explodeTreeNodes(childNode, depth);
                }
            }
        }

        /**
         * Explode node to children
         * @param node
         */
        protected explodeTreeNode(node: TreeNode): void
        {
            let nodeBoundingRect = node.getBoundingRect();
            let newDepth = node.getDepth() + 1;

            let leftBoundingRect = Tools.clone(nodeBoundingRect) as BoundingRect;
            let rightBoundingRect = Tools.clone(nodeBoundingRect) as BoundingRect;

            /**
             * Width or height explode
             */
            if (newDepth % 2 == 1) {
                let width = nodeBoundingRect.right - nodeBoundingRect.left;
                let delta = width / 2;
                leftBoundingRect.right = leftBoundingRect.right - delta;
                rightBoundingRect.left = rightBoundingRect.left + delta;
            } else {
                let height = nodeBoundingRect.bottom - nodeBoundingRect.top;
                let delta = height / 2;
                leftBoundingRect.bottom = leftBoundingRect.bottom - delta;
                rightBoundingRect.top = rightBoundingRect.top + delta;
            }

            let leftNodeObjects = Tools.filterObjectsByBoundingRect(leftBoundingRect, node.getObjects());
            let rightNodeObjects = Tools.filterObjectsByBoundingRect(rightBoundingRect, node.getObjects());

            let leftNode = new TreeNode(node, leftBoundingRect, leftNodeObjects, newDepth);
            let rightNode = new TreeNode(node, rightBoundingRect, rightNodeObjects, newDepth);

            node.addChild(leftNode);
            node.addChild(rightNode);

            node.removeObjects();
        }


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

По координатам
        /**
         * Find node by coordinates
         * @param node
         * @param coordinates
         * @returns {TreeNode|null}
         */
        public findNodeByCoordinates(node: TreeNode, coordinates: Coordinates): TreeNode | null
        {
            let childNode = node.getChildByCoordinates(coordinates);

            if (!childNode) {
                return null;
            }

            if (childNode.isLastNode()) {
                return childNode;
            } else {
                return this.findNodeByCoordinates(childNode, coordinates);
            }
        }

         /**
         * find objects by coordinates in tree
         * @param coordinates Coordinates
         * @returns {SchemeObject[]}
         */
        public findObjectsByCoordinates(coordinates: Coordinates): SchemeObject[]
        {
            let result: SchemeObject[] = [];

            // scale
            let x = coordinates.x;
            let y = coordinates.y;

            x = x / this.scheme.getZoomManager().getScale();
            y = y / this.scheme.getZoomManager().getScale();

            // scroll
            x = x - this.scheme.getScrollManager().getScrollLeft();
            y = y - this.scheme.getScrollManager().getScrollTop();


            // search node
            let rootNode = this.getTree();
            let node = this.findNodeByCoordinates(rootNode, {x: x, y: y});

            let nodeObjects: SchemeObject[] = [];

            if (node) {
                nodeObjects = node.getObjects();
            }

            // search object in node
            for (let schemeObject of nodeObjects) {
                let boundingRect = schemeObject.getBoundingRect();

                if (Tools.pointInRect({x: x, y: y}, boundingRect)) {
                    result.push(schemeObject)
                }
            }

            return result;
        }


Про линии в 1px
При попытке нарисовать линию в 1px Вы можете получить неожиданный результат: она будет толщиной в два и полупрозрачная. Чтобы этого избежать, нужно сместить координаты на 0.5px.
Подробное описание проблемы.

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


Код
        /**
         * Render visible objects
         */
        protected renderAll(): void
        {
            if (this.renderingRequestId) {
                this.cancelAnimationFrameApply(this.renderingRequestId);
                this.renderingRequestId = 0;
            }

            this.eventManager.sendEvent('beforeRenderAll');

            this.clearContext();

            let scrollLeft = this.scrollManager.getScrollLeft();
            let scrollTop = this.scrollManager.getScrollTop();

            this.view.setScrollLeft(scrollLeft);
            this.view.setScrollTop(scrollTop);

            let width = this.getWidth() / this.zoomManager.getScale();
            let height = this.getHeight() / this.zoomManager.getScale();
            let leftOffset = -scrollLeft;
            let topOffset = -scrollTop;

            let nodes = this.storageManager.findNodesByBoundingRect(null, {
                left: leftOffset,
                top: topOffset,
                right: leftOffset + width,
                bottom: topOffset + height
            });

            for (let node of nodes) {
                for (let schemeObject of node.getObjects()) {
                    schemeObject.render(this, this.view);
                }
            }

            this.eventManager.sendEvent('afterRenderAll');
        }



Класс хранения и поиска объектов: src/managers/StorageManager.ts

Масштабирование

Зум — это просто. У canvas есть метод scale, который трансформирует сетку координат. Но нам нужно не просто зумить, нам нужно зумить в точку, в которой находится курсор или центр.

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


Метод
         /**
         * Zoom to point
         * @param point
         * @param delta
         */
        public zoomToPoint(point: Coordinates, delta: number): void
        {
            let prevScale = this.scheme.getZoomManager().getScale();
            let zoomed = this.scheme.getZoomManager().zoom(delta);

            if (zoomed) {
                let newScale = this.scheme.getZoomManager().getScale();

                let prevCenter: Coordinates = {
                    x: point.x / prevScale,
                    y: point.y / prevScale,
                };

                let newCenter: Coordinates = {
                    x: point.x / newScale,
                    y: point.y / newScale,
                };

                let leftOffsetDelta = newCenter.x - prevCenter.x;
                let topOffsetDelta = newCenter.y - prevCenter.y;

                this.scheme.getScrollManager().scroll(
                    this.scheme.getScrollManager().getScrollLeft() + leftOffsetDelta,
                    this.scheme.getScrollManager().getScrollTop() + topOffsetDelta
                );
            }
        }


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


Код
            this.scheme.getCanvas().addEventListener('touchstart', (e: TouchEvent) => {
                this.touchDistance = 0;
                this.onMouseDown(e);
            });

            this.scheme.getCanvas().addEventListener('touchmove', (e: TouchEvent) => {
                if (e.targetTouches.length == 1) {
                    // one finger - dragging
                    this.onMouseMove(e);
                } else if (e.targetTouches.length == 2) {
                    // two finger - zoom
                    const p1 = e.targetTouches[0];
                    const p2 = e.targetTouches[1];

                    let distance = Math.sqrt(Math.pow(p2.pageX - p1.pageX, 2) + Math.pow(p2.pageY - p1.pageY, 2));

                    let delta = 0;
                    if(this.touchDistance) {
                        delta = distance - this.touchDistance;
                    }

                    this.touchDistance = distance;

                    if (delta) {
                        this.scheme.getZoomManager().zoomToPointer(e, delta / 5);
                    }
                }
                e.preventDefault();
            });


В айфонах 6 и старше была найдена неприятная особенность: при быстром двойном касании возникал нативный зум с фокусом на канвасе, причем в таком режиме канвас начинал жутко тормозить. На viewport никакой реакции. Лечится так:

           this.scheme.getCanvas().addEventListener('touchend', (e: TouchEvent) => {
                // prevent double tap zoom
                let now = (new Date()).getTime();
                if (this.lastTouchEndTime && now - this.lastTouchEndTime <= 300) {
                    e.preventDefault();
                } else {
                    this.onMouseUp(e);
                }
                this.lastTouchEndTime = now;
            });

Класс, отвечающий за масштабирование: src/managers/ZoomManager.ts

Перемещение схемы

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

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


Код
        /**
         * Mouse down
         * @param e
         */
        protected onMouseDown(e: MouseEvent | TouchEvent): void
        {
            this.leftButtonDown = true;
            this.setLastClientPositionFromEvent(e);
        }
        
        /**
         * Mouse up
         * @param e
         */
        protected onMouseUp(e: MouseEvent | TouchEvent): void
        {
            this.leftButtonDown = false;
            this.setLastClientPositionFromEvent(e);

            if (this.isDragging) {
                this.scheme.setCursorStyle(this.scheme.getDefaultCursorStyle());

                this.scheme.requestRenderAll();
            }

            // defer for prevent trigger click on mouseUp
            setTimeout(() => {this.isDragging = false; }, 10);
        }

        /**
         * On mouse move
         * @param e
         */
        protected onMouseMove(e: MouseEvent | TouchEvent): void
        {
            if (this.leftButtonDown) {
                let newCoordinates = this.getCoordinatesFromEvent(e);
                let deltaX = Math.abs(newCoordinates.x - this.getLastClientX());
                let deltaY = Math.abs(newCoordinates.y - this.getLastClientY());

                // 1 - is click with offset
                if (deltaX > 1 || deltaY > 1) {
                    this.isDragging = true;
                    this.scheme.setCursorStyle('move');
                }
            }

            if (!this.isDragging) {
                this.handleHover(e);
            } else {
                this.scheme.getScrollManager().handleDragging(e);
            }
        }

        /**
         * Handle dragging
         * @param e
         */
        public handleDragging(e: MouseEvent | TouchEvent): void
        {
            let lastClientX = this.scheme.getEventManager().getLastClientX();
            let lastClientY = this.scheme.getEventManager().getLastClientY();

            this.scheme.getEventManager().setLastClientPositionFromEvent(e);

            let leftCenterOffset =  this.scheme.getEventManager().getLastClientX() - lastClientX;
            let topCenterOffset =  this.scheme.getEventManager().getLastClientY() - lastClientY;

            // scale
            leftCenterOffset = leftCenterOffset / this.scheme.getZoomManager().getScale();
            topCenterOffset = topCenterOffset / this.scheme.getZoomManager().getScale();

            let scrollLeft = leftCenterOffset + this.getScrollLeft();
            let scrollTop = topCenterOffset + this.getScrollTop();

            this.scroll(scrollLeft, scrollTop);
        }


Класс, отвечающий за скролл: src/managers/ScrollManager.ts

Оптимизация

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

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

Потом я вспомнил правило, которое написано на каждом заборе (и в начале этой статьи) при работе с canvas: не перерисовывать неизменяющиеся части. Действительно, при перемещении и зуме сама схема не изменяется, поэтому нам нужно просто иметь «снимок» схемы в n раз больше начального масштаба и, при перемещении/зуме не рендерить объекты, а просто подставлять нашу картинку, пока разрешение карты не превысило разрешение снимка. А потом уже и оставшиеся реальные объекты будут быстро рисоваться в виду своего количества.

Но эта картинка тоже должна иногда меняться. Например, при выборе места оно меняет вид и мы не хотим, чтобы выбранные места исчезали на время перемещения схемы. Перерисовывать весь снимок (в n раз больше начального размера карты) при клике дорого,
но в тоже время мы можем позволить себе на снимке не сильно заботиться о пересечении объектов и обновлять только квадрат, в котором находиться измененный объект.

Код
/**
         * Update scheme cache
         * @param onlyChanged
         */
        public updateCache(onlyChanged: boolean): void
        {
            if (!this.cacheView) {
                let storage = this.storageManager.getImageStorage('scheme-cache');
                this.cacheView = new View(storage.getCanvas());
            }


            if (onlyChanged) {
                for (let schemeObject of this.changedObjects) {
                    schemeObject.clear(this, this.cacheView);
                    schemeObject.render(this, this.cacheView);
                }
            } else {
                let boundingRect = this.storageManager.getObjectsBoundingRect();

                let scale = (1 / this.zoomManager.getScaleWithAllObjects()) * this.cacheSchemeRatio;
                let rectWidth = boundingRect.right * scale;
                let rectHeight = boundingRect.bottom * scale;

                this.cacheView.setDimensions({
                    width: rectWidth,
                    height: rectHeight
                });

                this.cacheView.getContext().scale(scale, scale);

                for (let schemeObject of this.getObjects()) {
                    schemeObject.render(this, this.cacheView);
                }
            }

            this.changedObjects = [];
        }


         /**
         * Draw from cache
         */
        public drawFromCache()
        {
            if (!this.cacheView) {
                return false;
            }

            if (this.renderingRequestId) {
                this.cancelAnimationFrameApply(this.renderingRequestId);
                this.renderingRequestId = 0;
            }

            this.clearContext();

            let boundingRect = this.storageManager.getObjectsBoundingRect();
            let rectWidth = boundingRect.right;
            let rectHeight = boundingRect.bottom;

            this.view.getContext().drawImage(
                this.cacheView.getCanvas(),
                this.getScrollManager().getScrollLeft(),
                this.getScrollManager().getScrollTop(),
                rectWidth,
                rectHeight
            );
        }

        /**
         * Request draw from cache
         * @returns {Scheme}
         */
        public requestDrawFromCache(): this
        {
            if (!this.renderingRequestId) {
                this.renderingRequestId = this.requestFrameAnimationApply(() => { this.drawFromCache(); });
            }

            return this;
        }


Таким вроде бы нехитрым способом мы очень сильно повысили скорость работы схемы.

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

Let's block ads! (Why?)