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

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

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

 

 -Статистика

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

Habrahabr/New








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

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

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

«Я не могу просто ходить с флагом «Postgres – наше всё». Нужно руками доказывать, что это работает» – Алексей Лустин

Четверг, 22 Июня 2017 г. 16:48 + в цитатник
Наш сегодняшний собеседник – Алексей Лустин, IT-евангелист в мире 1С, инженер по инфраструктуре в концепциях DevOps и NoOps для 1С.

Алексей и его коллеги занимаются профессиональным обслуживанием бизнесов, работающих с платформой 1С. Они обучают клиентов, как эффективно использовать 1C на связке PostgreSQL + Linux. Оказывается, что очень часто проблема заключается не в самой платформе, а в неумелой эксплуатации. На PG Day'17 Russia Алексей проведет мастер-класс по переходу на PostgreSQL для 1С под кодовым названием Борьба со страхами.

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


image altPG Day: Алексей, расскажите о себе. Кто вы, чем занимаетесь, как пришли к своей специализации?

Алексей: Я называю себя евангелистом Automation Driven Development. Это такая концепция “от автоматизации деятельности айтишников”, чтобы разработчики и инфраструктурщики избавлялись от рутины и освобождали время для интересной работы. Последние четыре года стараюсь подружить два мира с помощью концепции CICD (Continuous Integration и Continuous Delivery): разработчиков и инфраструктурщиков. Ради этого и была организована наша команда. Причем основной приоритет именно на “мир 1С”, как наименее автоматизированный с точки зрения процесса.

Как мы к этому пришли? В больших компаниях очень много регламентов. Чтобы их соблюдать, требуется ручной процесс. Для этого выделяют «ручных» людей. Когда мы приходим на крупные предприятия с аудитом, обнаруживаем, что 80-90% времени сотрудников тратится вот на эту рутину: обновить базу, измерить производительность, помониторить, сделать выводы, тесты ручные провести. 80% времени совершенно неэффективной работы. Она обоснована с точки зрения рисков предприятия, с этим соглашусь. Мы же понимаем, что в большой компании такое количество регламентов родилось как ответ на какие-то аварии и всё остальное. Только вот эти 80% – явный кандидат на автоматизацию.

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

От этого “отпрыгивает всё”, что мы делаем руками.

Для бизнеса, еще с 2000-х годов наиболее эффективной считается платформа 1С, которая, начиная со старой версии 7.7, работает на контуре Microsoft и на СУБД MS SQL. У меня есть некое свое видение, почему так происходит. Изначально Microsoft был достаточно прорывной технологией в мире СУБД. Postgres тогда был уделом Linux (8 редакция и так далее), и, наверно, самой компании 1С был не очень интересен. Тогда главное было получить быстрый результат. Это MS SQL делал. Принято считать, что MS SQL стабилен для 1С. В целом, это, наверное, так. Его оптимизатор запросов начинает справляться, и не показывает ошибки в проектировании таблиц и связей между ними. Логически ошибочный проект на 1С в связке с MS SQL, запускаемый на каком-то минимальном объеме данных, начинает сбоить только после определенных порогов. А в Postgres эти ошибки выявляются еще на начальном этапе старта информационной системы – логические ошибки в структуре СУБД сразу вылетают, ты тут же видишь непонятки, все работает медленно. Поэтому обычно все начинают ругать Postgres, никто никогда не ругает разработчиков.

Я говорю так: 1С и Postgres работают хорошо! Проблема не в них, проблема в компетентности владельцев контура. Даже на больших объемах баз данных есть прецеденты. Например, когда общий объем баз данных со сжатием – терабайт и более (есть и такие инсталляции). Но, как показывает практика, они прямо пропорциональны уровню компетентности владельцев этого контура – разработчиков и devops. Уровень компетенции их намного выше, чем тех, кто владеет такой же инсталляцией с таким же объемом данных и транзакций в секунду на MS SQL. Там можно посадить непонятных товарищей, и они будут что-то кодить, низкий уровень их компетентности компенсирует сам MS SQL. Разница не в Postgres и MS SQL – разница только в компетентности.

Отсюда вся история с курсами, github-аккаунтами и различными публикациями скриптов. Лично моя социальная цель такова – чтобы эксперты по производительности в 1С-мире (на самом деле, системные администраторы, которые администрируют весь контур – и сервер приложения 1С, и СУБД) повышали свой уровень компетентности.

Как я к этому пришел? Представьте, что у вас двести 1С-ников в обучении, и задача – запустить хотя бы 100 информационных систем на linux. Последние пять лет назад у меня был такой волшебный опыт: надо было сместить стратегический фокус с MS SQL контура на Postgres. В 2006 году в рамках «Инфостарта» мы организовали сообщество 1C+Postgres (рассчитанное больше на гиков). Нам поставили задачу смигрировать хотя бы часть систем на Postgres. Выяснилось, что проблема вообще не в Postgres и не в 1С. Проблема именно в уровне компетентности администраторов, которые ответственны за СУБД, и 1С-ников, и разработчиков, и так далее. Они просто не умеют проверять свои гипотезы, когда в качестве СУБД используется PostgreSQL. Им кажется, что развернут быстренько на продуктиве – и все само заработает. Потом только останется что-нибудь подкрутить. С Postgres так нельзя.

Ну и про себя могу сказать. Раз я евангелист инженерных практик DevOps, мне приходится руками доказывать, что это работает. Я не могу просто ходить с флагом «Postgres – наше всё». Мне говорят: «Докажи». Сажусь совместно с командой (нас не очень много, кстати), и мы через вагранты, докеры, всякие автоматизированные скрипты доказываем, что правы. Убеждаем, что мы не просто популисты.

PG Day: Вы затронули интересную тему – проблематику перехода с платформы Windows MsSQL на Linux с Postgres. Какие советы, исходя из вашей практики, вы даете для устранения этих проблем, когда вас просят помочь с осуществлением такого перехода?

Алексей: У нас выстроен некий чек-лист, называется «борьба с возражениями при переходе». 1С производят типовые информационные системы. Сейчас же обычно как: если хочешь развернуть комплексную автоматизацию предприятия (начиная с зарплаты и заканчивая финансовым учетом). Инсталлируй 1С – получишь полную ERP и вперед, занимайся бизнесом, не заморачивайся автоматизацией. В таком случае ты выигрываешь.

Но когда «бизнесменишь», то вынужден дорабатывать под себя, «подрихтовывать». Приходится нанимать разработчиков и инфраструктурщиков разного уровня. И они тебе «допиливают». За последние пятнадцать лет 95% инсталляций 1С – нетиповые. Есть статистика, что в России существует около полумиллиона различных нетиповых инсталляций. Их «допиливали» какие-то товарищи под конкретного бизнесмена, с разным уровнем качества. Если «материнская» компания выпускает информационную систему, в которой структура таблиц более-менее отлажена (потому что внутри компании 1С отладка моделей все-таки идет: и IDEF-диаграммы, и ERwin, наверное – там всё нормально работает). Когда оно приходит к конкретному бизнесмену, разработчики «допиливают», и могут ничего не знать ни про модель данных, ни про теорию множеств. Могут накатать схему данных просто невозможную.

Поэтому первое возражение, с которым мы боремся, – запустится ли система вообще. Приходится сначала просто показать. Можно всю информационную систему выгрузить и загрузить в другой контур СУБД, это у них такая классная фишка в мире 1С: можно сделать перенос не с помощью pg_dump или бекапов MS SQL, а собственным внутренним инструментом. Так вот, берешь и переносишь на контур Postgres.

Однако там есть одна особенность – 1С-сервер лучше ставить все-таки не на Linux, а на Windows – из-за проблем с active directory и kerberos-библиотекой. Это связано не с Postgres, а с особенностью статической линковки библиотеки kerberos под CentOS, под Ubuntu и не только. Вообщем, есть такая рекомендация, что на Linux ставишь только Postgres. При этом очень сильно сопротивляешься, чтобы не запустить его на Windows. Windows-сервер оставляешь под управлением 1С и переносишь базу. Замеряешь сколько времени будет переноситься база – развертываться из бэкапа и переходить в продуктивное состояние. Если база у тебя – терабайт, то наш волшебный замер – 36 часов. Сторонними средствами, когда из MS SQL в Postgres, – конечно, получилось бы быстрее. Но, все-таки, мы выбираем штатный инструмент, он хоть и дольше, но наименее рискованный.

Разворачиваешь и запускаешь тупые вещи – какой-нибудь отчет, например. Это самое показательное. Отчеты начинают работать быстрее на 15-20%. Это доказуемо. Ты берешь на одном контуре и на втором, запускаешь, и у тебя на 20% отчеты формируются быстрее. Это первый такой wow-эффект. Кстати, известна даже причина, почему так происходит. В итоге – это доказывает, что “оно” работает.

Все обычно боятся Linux, от слова «совсем». Ты им развернул Postgres, доказал, что он работает быстрее на некоторых операциях, но они все равно продолжают боятся Linux. Приходится убеждать, что здесь нет Linux, здесь есть Postgres. Есть установленный пакет и несколько команд – apt-get install или yum. Ты обучаешь администратора базовым командам – что тут есть блочные устройства, они немножко по-другому выглядят, чем в Windows, и это скриптуешь в виде vagrant-файла. Показываешь ему, как это работает, чтобы он мог виртуальную машину с Linux для игр развернуть в виде vagrant, который примерно повторяет его настройки Postgres в продуктиве. И он начинает с ним играться: запускает различные команды Linux, смотрит, как вообще апдейты работают, как работать с бэкапами, с консольным pg_dump и еще с чем-то.

Обычно администраторы – выходцы из Windows-мира, которые раньше “админили” MS SQL. Они говорят: «А как бэкапить?» (ведь у него есть некий Maintenance Plan, который принят в MS SQL). Готовишь ему табличку, которая показывает, как он это делал на MS SQL, и как это делается на Postgres: как пересчитывать статистику (и как она вообще в PostgreSQL называется), как посмотреть план запроса косячного длинного и так далее. Она обычно состоит из 15 – 20 основных пунктов. В итоге, ему перестает быть страшно – всё, что он делал раньше, в той или иной степени присутствует и в контуре PostgreSQL.

А потом начинаешь веселиться с Postgres-контуром. Это тоже основная беда, когда ты объясняешь, что, на самом деле, нет принятого в Microsoft «мышководства». У тебя есть либо nano, либо vim, и ты меняешь параметры. Причем, если есть возможность запустить более новую версию, то уже показываешь ему конструкцию alter system. Для большинства DBA это понятная конструкция – что можешь поменять системные переменные, почти что но, конечно, не совсем) аналог trace flag MS SQL. Показываешь, как память рассчитывать, учишь, как рассчитывать в Excel объем коннектов, считаешь транзакции в секунду, вообщем, учишь работать с Postgres-контуром, что это не магия никакая. Естественно, тут же даешь ссылки на видео Бартунова или каких-то открытых тренингов Postgres Pro. Достаточно быстро группируешь список из небольших 5-6 вебинаров – и они проникаются тем, как это всё работает. Ссылки, опять же, на Github даешь.

А эксперименты, я напомню, проводятся на vagrant. Один из примеров: тормозит СУБД (1С и СУБД расположены на нескольких инфраструктурных серверах), все привыкли, что это якобы 1С, и никто ничего не делает. А когда ты на Postgres запускаешь – сразу видно, что есть проблемы по сетевой инфраструктуре. Тебе надо померять ее iperf’ом и еще какими-то инструментариями Linux. Так часто выявляется наличие странных сетевых маршрутов между выделенной инфраструктурой. Получается проблема не в 1С и не в MS SQL, а проблема – в сети между ними, но MS SQL как-то жил, а на PG уже так нельзя. Странные прыжки, переходы между непонятными узлами – это тоже достаточно быстро выявляется. Почему-то средства мониторинга Postgres настолько веселые и низкоуровневые, что показывают эти цифры достаточно быстро. Такую магию начинаешь ребятам рассказывать про инфраструктуру, они быстро проникаются. Вот и всё.

Основная цель же – перевести базу и научиться ею владеть в продуктиве. Продуктивный контур они настраивают сами, повторяют скрипты, которые сделали на vagrant. В продуктив мы не лезем – такова наша методика. Фактически это получается их продуктив. Если они не уверены в том, что мы им показали, значит, продолжаем обучение, доказательства и так далее.

А поддержкой продуктива мы не занимаемся, кстати. Есть люди, которые делают это более профессионально – мы лучше порекомендуем их. Они прям админы. В мире Postgres всем известно, кто и на чем специализируется – мы специализируемся на общем контуре и на vagrant, то есть на приемочных контурах Postgres и 1С. Но как только идет передача в продуктив, я говорю: «Ребята, вот список людей кто специализируется на PG в продуктиве – туда все вопросы. Не верите российским – пожалуйста, обращайтесь к 2ndQuadrant». Там есть люди, которые сразу родились с бородой и с клавиатурой, заточенной под vim, в одной руке. При этом ночью они мысленно пересобирают ядра Linux. Поэтому в продуктив я с командой не лезу, хотя мониторинг оттуда забираю, чтобы выявить проблемы разработчиков тем же pgBadger, который, кстати, я всем рекомендую.

Это киллер-фича из мира Postgres для инфраструктурщиков: покажет, как живет твоя БД с репликами. В этот отчет можно “погрузиться на месяц” и исследовать. Да, в MS SQL есть такие штуки, но они стоят очень дорого. А здесь прямо с коробки github docker, почти как инсталлятор: запустил и забыл.

Если подытожить – берешь и пошагово борешься “со стандартными возражениями”. Показываешь, что на Postgres – работает, а в некоторых сценариях работает быстрее, и показываешь сам сценарий.

Борьба с возражениями против Linux происходит так: 1С сервер оставляешь на привычной им винде, а Postgres делаешь на Linux. Так закрываешь первое возражение – типа, не-не-не, не всё на Linux, только Postgres! Чуть-чуть Linux.

Запустил, немножко добавил Linux, продемонстрировал, что это всё работает и выделил – на каких сценариях быстрее. Сначала показал экосистему, где почерпнуть бесплатную информацию, если понадобится, затем подключенные расширения, которые позволяют более комфортно всем этим делом управлять. Далее последовательно – показал как работает оптимизатор, восстановил план обслуживания, чтобы это было понятно. Все делаешь последовательно, чтобы убедить, что Postgres – это не страшно, это легко.

Задача – погрузить в принципы, которые приняты при владении контуром Postgres, чтобы было понятно, где брать информацию и как ее отлаживать. Работаем в парадигме – на продуктиве ничего не меняем, сначала смотрим, потом применяем.

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

PG Day: Расскажите подробнее про cвой workshop на конференции. Как будет строиться работа? Предубеждения касательно эксплуатации 1С на платформе будут решаться по такому вот чек-листу, про который вы рассказывали?

Алексей: Да, идеология будет такая: разверните контур Postgres – появится несколько боксов в режиме «стоковый». У нас есть специнструмент, который показывает результаты – он, например, показывает, как ведет себя 1С на стоковом Postgres Pro, без ничего, без базовых настроек, в режиме “микроволновки”.

Потом разделяем работу на 4 раздела: данные, логи PostgreSQL, WAL и pg_dump. И смотрим результаты на тех же сценариях, которые были перед этим. После этого третий бокс настраивается уже в postgres.conf, именно под типовых пользователей в тестовом контуре, с их обычной нагрузкой. Они рассчитывают регистры, отчетики запускают, справочники пишут, читают их активно и так далее. Отчет покажет, по каким принципам живет наш проверочный контур, чтобы каждый потом сам мог повторить. После этого покажем результаты правильной настройки базовой инфраструктуры postgres.conf.

Затем следующий раздел – как увидеть основные «грабли» в 1С, основные ошибки? Это про то, какими экстеншенами вы можете увидеть типовые ошибки программистов 1С (причем на типовых конфигурациях ЗУП, УТ и так далее). Они известны, – это веселая работа с temp каталогом, с временными таблицами во вложенных запросах (1С-ники любят так ошибаться), непонятные составные джойны, когда у тебя неявный джойн 1С преобразовывает и идет классическое непопадание в индекс (это прямо беда 1С, 1С-программисты «терпеть ненавидят» ставить индексы и в них попадать). Как это выявить быстро, как увидеть, где ошибся разработчик – это мы показываем во втором разделе.

То есть у нас есть сценарий, как ведет себя 1С, и как посмотреть, как выявить, найти место. В 1С есть штатный инструмент, но он платный. Поэтому рекламировать его не будем, все 1С-ники и так знают, что это Центр управления производительностью, он парсит планы запросов. Но есть бесплатный, он называется «инструмент разработчика». Запускаешь и смотришь план запроса с Postgres и участок кода в 1С, который его вызвал. Если знаешь критерии запроса, который тебя волнует, то можешь найти проблемное место бесплатно. Тебе не нужно покупать за 300 тысяч корпоративный инструментальный пакет. Соответственно, выдать рекомендации. Либо, если ты сам разраб… Бывает такое, что ты эксперт по производительности, имеешь доступ к Postgres и сам же эту конфу пилишь (в мире 1С такое очень часто случается), то можешь сам поправить. Становится понятно, где ошибся.

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

Кстати, по модели нагрузки, “1С” очень много пишет и тут же очень много читает. Он дает гибридную нагрузку. Там нет нагрузки OLAP или OLTP. Они могут писать сразу массово по 2,5 тысячи записей за транзакцию – и тут же их читать в следующей транзакции. Причем транзакция в данном контексте подразумевается как “бизнес-транзакция”.

Это надо просто посмотреть. Проведение одного документа в 1С вырождается в огромное количество последовательных запросов. Пользователь нажал одну кнопку, а сервер приложений сформировал много служебных вызовов на уровне СУБД. Это важно понимать, потому что там могут неожиданно создаваться временные таблицы, хотя ты их не создавал кодом. Может произойти массовая вставка, тут же распухание. То есть при записи одного документа сразу сработает bloat. Вакуум не отработает – не успеет. Он тут же запишет, следующую итерацию начнет читать. Прямо видно, как происходит фактически версионирование записей на 1С. Будет расти распухание таблиц. Автовакуум нужен, но он не всегда отрабатывает под высокой нагрузкой 1С. Это воспроизводимо визуально.

Вот такие разделы.

Последнее, что я бы хотел донести до людей, которые придут на мастер-класс. Postgres – охрененная штука. Но, чтобы нормально им владеть, нужно еще кучу всего дополнительно изучить. Поставить, как MS SQL, и забыть – не получится. С Postgres ты живешь в комьюнити, с экстеншенами, расширениями, дополнительным инструментарием (в основном, открытым, в исходниках). Это прямо комьюнити с микроинструментами для каждой мелкой задачи. Хочется донести, что MS SQL можно повторить полнофункционально и добиться охрененных результатов. Но ты должен понимать, что не будет одного инсталлятора. Не будет от слова «совсем».

Я по программе пробежался примерно. Будем идти вот так.

PG Day: На самом деле, очень подробное и отличное описание. Наверное, лучшее, которое я получил от ведущего мастер-класса за весь прошедший опыт, за последние два месяца. Спасибо, Алексей!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331448/


Метки:  

Ставим Selenium Grid на колеса Apache Mesos

Четверг, 22 Июня 2017 г. 16:44 + в цитатник
Привет, Хабр! Меня зовут Настя, и я не люблю очереди. Поэтому я расскажу вам, на примере Альфа-Лаборатории и наших исследований, каким образом можно организовать инфраструктуру и архитектуру для прогона тестов, чтобы получать результат в разы быстрее. Например, нам удалось добиться такой цифры, как 5 минут суммарного времени прохождения тестов на приложение. Для этого нам пришлось поменять подход к запуску Selenium Grid.



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

В прошлом году мы внедряли DevOps как процесс. И в один момент, автоматизируя все и вся, мы поняли, что time to market для каждого артефакта на этапе тестирования не должен превышать 30 минут. Концептуально мы хотели, чтобы некоторые релизы проходили автоверификацию, если приемочное тестирование им не нужно. Для тех артефактов, которые нужно проверять руками, 30 минут — это время, за которое тестировщик получает результаты прогона автотестов, анализирует их, а также делает приемочное тестирование. При этом автотесты должны автоматически запускаться в рамках нашего pipeline.

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

Чаще всего задача ускорения прогона автотестов решается двумя способами:

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

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

Итак, цель ясна: ускорить и устранить очереди на запуск автотестов без привлечения дополнительного финансирования.

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

  • Средняя конфигурация машинки была следующая: 4RAM/2 core/50 HDD
  • И в один момент времени на одной машинке без потерь в скорости мы могли выполнять не более 2-х потоков тестов. Т.е. запускать не более 2-х сессий с браузерами. В противном случае — скорость выполнения тестов проседала.
  • Все машинки были виндовые, что тоже накладывало на нас определенные ограничения (например, кроссбраузерность мы вообще не тестировали)
  • И машинки находились в разных подсетях Банка (разные дата-центры). Поэтому управлять их конфигурациями было крайне сложно, так как пересоздание и управление происходило на стороне сисадминов.

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

Наши команды:

  • хотят релизиться от 3-х до 5-ти раз в день
  • выпускают релизы не чаще раза в 1-2 недели

И у всех команд фокус на быструю доставку ценности до клиента. Само собой, никто не хочет “висеть” в очереди на запуск автотестов.

Ресурсов катастрофически не хватало. Почему? Давайте рассмотрим на конкретном примере:

  1. У нас есть проект, в котором порядка 30 тестов (это средняя цифра)
  2. Если мы запускаем тесты в один поток — то это как минимум 30 минут.
  3. Наша цель уложиться в 10 минут — значит, надо параллелить прогон тестов на несколько браузеров, а соответственно — на несколько машин.
  4. Значит, запускаем эти тесты в параллели как минимум в 3 потока. На практике же выходит, что каждый проект генерирует от 5 до 10 потоков.
  5. А теперь вспомним о наших 20 проектах. Если у нас возникает ситуация, когда все одновременно хотят запустить автотесты, чтобы избежать очереди, нужно минимум поднять 60 сессий с тестами.
  6. 40 еще поднимутся, с учетом того, что по 2 сессии на виртуалку.
  7. А остальные попадут в очередь — минимум на 10 минут.

Заметьте, мы рассмотрели очень положительный случай, когда тестов в проекте немного, и всего-то 3 потока. Железа не хватает, нужно думать о том, как облегчить нагрузку на виртуалки. Что если мы переедем с виртуальных машин в докер-контейнеры?

Посчитали:

  • Возьмем наши 15 машин и построим из них единое пространство, где будем создавать докер-контейнеры, в которых будут прогоняться наши тесты.
  • 15 виртуальных машин = это 60 RAM, 30 core и 750 HDD, причем это все находится в трех дата центрах, т.е. мы можем создать отказоустойчивое пространство.

Давайте рассмотрим конфигурацию одного докер-контейнера, который позволит прогнать тесты в 1 поток, и сравним с тем, что у нас было при использовании виртуальных машин:
500 RAM, 0,01% core, и HDD 400 мб.



Получается, что в один момент времени мы можем создать 120 контейнеров!

Это не только перекрывает наши запросы в 60 сессий, но и страхует на будущее. Ведь количество команд растет, а значит — количество запускаемых проектов тоже постоянно растет. Итак, стало достаточно очевидно, что нам нужно взять имеющиеся ресурсы и объединить их в единое пространство вычислительных мощностей, это еще называют песочницей. Объединяя, мы при этом не хотим думать о нем именно в парадигме каких-то хостов/виртуальных машин. Мы хотим иметь просто пространство, к которому мы сможем подключаться с помощью какого-нибудь api, и создавать в нем свои докер-контейнеры, на которых потом будем запускать тесты.

Динамическая песочница


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

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



Таким образом мы получаем общее пространство с вычислительными ресурсами, у которого есть свое api. API нам предоставляет Marathon, а Apache Mesos как раз таки и объединяет хосты.

Оркестратор тестов: Selenium grid спешит на помощь


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

И тут на помощь нам должна прийти параллелизация запуска тестов.

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

  • Jenkins
  • нативный оркестратор Selenium

Хоть мой рассказ и про то, как мы запускали selenium grid в докер-контейнерах — сначала рассмотрим, как вообще работает грид на виртуальных машинах.



Фактически вся процедура представляет из себя 3 действия:

1. Мы копируем Selenium Standalone Server (нужной нам версии) в какую-нибудь директорию.
2. Затем выполняем команду, которая запускает этот сервер в нужном нам режиме: хаба, либо режим ноды. Обратите внимание, что за эти две функции отвечает один и тот же физический jar-ник, который вы продублировали на разные хосты.

$ java 
    -jar selenium-server-standalone.jar
    -role hub

3. Конфигурируем ноду. Либо через командную строку, либо в json-файле указываем набор браузеров и их параметры.

$ java \
    -jar selenium-server-standalone.jar \
    -role node \
    -hub http://host1:4444/grid/register

Что делает хаб после старта грида


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

Что делает нода


  • После того как мы запустили сервер в режиме ноды на виртуалке и указали в параметрах команды адрес хаба, задача ноды — зарегистрировать на хабе. То есть сообщить ему, что она находится в его гриде, и о том, какие браузеры с драйверами у нее есть.
  • Сама регистрация выглядит как посыл http-запроса с отправкой json-массива, в котором содержится вся информация по ноде.
  • Следующая задача ноды — это исполнение тех запросов, которые она принимает через хаб после того, как тот создал сессию с этой нодой.
  • Под запросами я подразумеваю те команды, которые шлет наш jar-ник с автотестами. Как пример, командой будет какой-нибудь шаг типа “Найди мне кнопку на данной странице со следующим id”. Соответственно, хабу чтобы выполнить такой шаг теста, нужно знать, к какому вообще тесту относится данный шаг. Ведь в один момент он может выполнять несколько тестов. И этот шаг подразумевает, что тот, кто будет выполнять эту команду, уже выполнил какую-то предысторию из других команд, например, перешел как раз таки на соответствующую страницу. Вот именно для этого и нужен уникальный идентификатор сессии с браузером в ноде, который создает хаб и затем по этому ИД понимает, на какую ноду ему распределять запросы.
  • Нода же просто ждет команды от хаба, и при получении http-запросов, которые он перенаправляет на нее — она их выполняет.

Чем же отличается старт грида в докер-контейнерах?


1. Нода на момент старта уже сконфигурирована.

Давайте посмотрим на содержимое ноды. Файл с json-конфигом для ноды находится в контейнере с ней, затем мы его переименовываем, и наш сервер узнает о своих параметрах из этого файла:

/opt/selenium/generate_config > /opt/selenium/config.json	

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

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

$ /opt/selenium$ ls
chromedriver-2.29
selenium-server-standalone.jar
config.json
 

3. Также у нас есть скрипт sh, который выполняется после старта контейнера. И в этом скрипте мы видим, что после того, как у нас поднялся контейнер — у нас сразу же стартует наш java сервер.

$ java ${JAVA_OPTS} -jar /opt/selenium/selenium-server-standalone.jar \
    -role node \
    -hub http://$HUB_HOST:$HUB_PORT/grid/register \
    -nodeConfig /opt/selenium/config.json \
    ${SE_OPTS} &
 

Аналогично все по отношению к хабу.

В итоге запуск selenium grid в контейнере сводится к одной команде — старт докер-контейнера.

Проблема статического грида


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

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

Selenium Grid On-Demand


Поэтому мы захотели поднимать selenium grid по запросу: объясню на примере

  • Допустим, мы хотим запустить тесты для проекта с 30-ю тестами, которые разложены в 3 тест-сьюита.
  • Значит, мы запускаем джоб, который сначала нам создает selenium grid в кластере для этого прогона, и в качестве значения параметра о количестве нод в гриде он передает количество наших тест-сьюитов. То есть, для каждого проекта — конфигурация грида своя.
  • После того как отработала команда поднятия selenium grid-а, происходит запуск тестов.
  • После прогона тестов — грид удаляется.

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

Автоматизация создания Selenium Grid On-Demand


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

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

Мы не можем хардкодить, потому что мы априори не знаем, на каком хосте и порту поднимутся компоненты Selenium Grid, так как за нас это решает Apache Mesos.

Мы, конечно, можем извернуться и вручную следить за открытыми портами и хостами, на которых поднимаем Selenium Grid, но тогда зачем нам вообще Apache Mesos и Marathon, если все будем делать вручную?

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

  • количество нод, которые мы поднимаем
  • определение адреса хаба (его хост и порт, на котором он поднялся), чтобы передавать это значение ноде, иначе она не сможет зарегистрироваться.

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

Deploy Selenium Grid
$ ansible-playbook -i inventory play-site.yml \
  -e test_id=mytest \
  -e nodes_type=chrome \
  -e nodes_count=4

test_id: уникальный идентификатор проекта с тестами
nodes_count: количество нод
nodes_type: тип браузера [chrome|firefox]

Delete Selenium Grid
$ ansible-playbook -i inventory play-site.yml \
  -e test_id=mytest \
  -e clean=true 

Shell-скрипты, исполняемые на Jenkins, перед запуском ansible playbook рассчитываются автоматически и передают значение переменной. Прогон тестов встроен в pipeline с помощью job dsl.

export grid_name=testproject
export nodes_count=$(find tests -name "*feature" \
  | grep -v build | grep -v classes | grep features | wc -l)
 
cd ansible
ansible-playbook -i inventory play-site.yml \
  -e test_id=$grid_name \
  -e nodes_type=chrome \ 
  -e nodes_count=$nodes_count 
 
export hub_url=$(cat hub.url)
currentdir=$(pwd) 
cd ../tests 
./gradlew clean generateCucumberReport \
  -i -Pbrowser=$browser -PremoteHub=$hub_url

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

Проблема поднятия Selenium Grid On-Demand в распределенном кластере


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

Еще раз взглянем, как бы выглядела команда, если бы мы запускали каждый раз ноды в Docker-контейнере для selenium grid вручную:

$ docker run -d -p 6666:5555 selenium/node-chrome

Вы видите два порта? Наверное, некоторым из вас интересно, откуда появился второй порт. Так вот, у докера есть внутренний порт и внешний порт. Внешний порт слушает сам контейнер. А внутренний порт прослушивается самим процессом selenium server standalone, который запускается в режиме -node.

В этом примере все запросы на порт 6666 контейнера будут пересылаться на порт 5555 ноды внутри него.

Запуск ноды в Marathon


При настройке Apache Mesos-кластера мы для каждого хоста указываем диапазон портов. Этот диапазон используется для контейнеров, которые поднимаются Marathon’ом.

К примеру, если мы ставим диапазон 20000-21000, то наши контейнеры будут получать случайный порт из этого диапазона.

Marathon-агент запускает примерно такую команду.

$ docker run -d -p 

https://habrahabr.ru/post/331434/


Метки:  

Как написать максимально хреновый бэкенд для мобильного приложения

Четверг, 22 Июня 2017 г. 16:19 + в цитатник


Известно, что практически ни одно мобильное приложение не обходится без бэкенда.


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


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


Приятного чтения.



Итак, если вы серверный разработчик:


  • Не обращайте внимания на строение приложения, вам абсолютно не должно быть дело до того, как будет выглядеть продукт для пользователя. Ведь вы не хипстер, чтобы задумываться о таких вещах. Если данные для одного экрана надо получать через 10 разных запросов, это проблемы дизайнера, который рисовал интерфейс, не согласовывая его с вашим API. В следующий раз пусть не думает об удобстве пользователя, все-таки в проекте есть вещи поважнее.
  • Ни в коем случае не пишите документацию. Простого вордовского файла на дропбоксе будет достаточно. В конце концов ваша работа — это струящиеся потоки данных, элегантные и высокопроизводительные. Пусть беспомощные мобильные разработчики почаще обращаются к вам за разъяснениями. Простого списка запросов без малейших примеров и описания им будет вполне достаточно. Ведь всегда можно заглянуть в ваш код и посмотреть все параметры и аргументы.
  • Не заморачивайтесь с названиями полей. Это нормально, что одна и та же сущность в разных местах называется по-разному, пусть поле, обозначающее количество объектов, в одном месте будет count, а в другом koli4estvo_kek. И так понятно, неужели не распарсят?
    И в смысле приходит разный тип данных? Ну да, в одном случае число, а в другом строка. Что не так?
  • Меняйте логику без предупреждения. Если вас озарило, то не медлите — срочно внедряйте. Не задумывайтесь о совместимости, не торопитесь обсуждать, просто делайте. И обязательно выкатывайте в релиз, дальше сами разберутся. Документацию тоже обновлять не обязательно, это все суррогат.
  • Ни в коем случае не пишите тесты и не проверяйте собственное API. Помните, вы не допускаете ошибок, это в приложениях вечно едут экранчики и что-то вылетает. Да и потом, понять, что найденная проблема находится все-таки на бэкенде — дело пары минут.
  • Не присылайте пояснения к ошибкам. Во-первых, они случаются крайне редко. Все должно идти идеально. Во-вторых, всем и так понятно почему что-то пошло не так. Простого http 400 или 500 (вишенка на торте) должно быть достаточно.
  • Отдавайте ответы в разных форматах. Пусть где-то будет json, а в другом месте xml. В конце концов, природа любит разнообразие.
    Цитата замечательных людей: 'А тут тоже в json ответ нужен что ли?'
  • Для авторизации используйте только cookie. Вас так вас в институте учили, когда вы делали свой первый интернет магазин. Ведь Android и iOS — это просто еще один браузер, не нужно преувеличивать их сложность.
  • Запомните: никаких тестовых данных, пусть разработчики руками генерируют весь контент. И не забывайте при этом каждый день очищать базу, это только добавляет азарта в работу.
  • Будьте бунтарем: принимайте параметры в POST через URL, ведь это тот же GET, только другой. Дайте волю воображению. И игнорируйте любые мольбы коллег привести все к стандартному виду, они просто не могут мыслить нестандартно.
  • Выносите максимальное количество логики на клиент. Сервер должен быть настолько легковесным, насколько возможно. Надо сделать рассылку по расписанию? На клиент, пусть крутит у себя таймер. Агрегация данных из трех разных источников? Туда же. У вас тут вообще-то нет фонового потока, который можно безнаказанно нагружать.

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


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

    (Может быть, им просто одиноко и не с кем поговорить?)
  • Прося коллегу что-то переделать в API, не объясняйте причину. Если для него это не очевидно, то и объяснять бессмысленно, все равно не поймет.

Полезные рекомендации


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


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


Документация


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


Самый простой и удобный вариант — это использовать Swagger.
Хоть его изначальный внешний вид и оставляет желать лучшего:

Но его можно без проблем облагородить с помощью форматтера:


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


Единообразие


В мобильной разработке есть сложность — многие решения и фреймворки крайне неповоротливы. Нельзя просто взять и поменять формат для какого-то одного конкретного запроса, либо это предельно сложно. Как и нельзя изменить название определенного поля только для определенного случая: бедный девелопер будет орать в голосину, пытаясь воткнуть под это костыль.
Все должно быть целостно: везде одинаковые названия, один формат взаимодействия (предпочтительно JSON), и тп.


Особенно хорошо, если названия параметров в запросе и ответе идеально совпадают с полями соответствующих классов в мобильном приложении. Звучит странно, но это настолько упрощает жизнь разработчикам, что они будут вам за это шоколадки таскать из магазина.
В некоторых местах упрощение доходит до абсурда: например, сохранение в Realm (мобильная база данных) может быть произведено практически сразу из json. Если будет интересно, то отдельно расскажу о том, как мы избавлялись от middleware в мобильном приложении.


Пример кода по сохранению любых пришедших объектов на iOS:

Один generic метод на любую запись в базу с сервера. Классно, правда?


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


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


Достаточность


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


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


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


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


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


Стабильность


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


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

Или такое:


Разница, мне кажется, на лицо.
Главное, не забудьте отключить Pretty Print на боевом сервере, поскольку ресурсов он жрет как не в себя.


Заключение


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

Что бы вы улучшили на своем бэкенде?

Проголосовало 52 человека. Воздержался 21 человек.

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

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

https://habrahabr.ru/post/331120/


Метки:  

[Из песочницы] Ненормальный GraphQL в Electron или как я писал десктопный клиент для Tinder

Четверг, 22 Июня 2017 г. 15:38 + в цитатник

Предыстория


фрустрация и решение


Привет, Хабр. В начале зимы 2016 года я снова стал одинок. Спустя какое-то время я решил завести себе профиль в Tinder. Всё бы ничего, но постепенно стала накапливаться усталость из-за невозможности нормально печатать на физической клавиатуре. Мне виделось несколько решений этой проблемы:


  • Смириться и продолжать использовать официальное приложение для смартфона
  • Использовать BlueStacks с официальным приложением на Android
  • Использовать существующие клиенты для десктопа (Tinder++)
  • Написать свой

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


Старт


человек завален терминами


Прежде всего стоит отметить, что у Tinder нет открытого API, однако оно было вскрыто в 2014 году при помощи MITM. Этого оказалось вполне достаточно для написания клиента.


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


Мне не терпелось поиграться с React, поэтому была выбрана стандартная связка react + redux + redux-saga + immutable. К маю была написана первая версия, но возникли проблемы с моими кривыми руками архитектурой. Выяснилось, что для того, чтобы сделать redux быстрым требуется много ручной работы: мемоизация, shouldComponentUpdate, фабрики селекторов и тому подобное.


Оглядываясь назад, скорее всего дело было не совсем в этом

Также, пожалуй, не стоило каждый раз запрашивать всю историю и сливать её с существующим store при помощи Immutable.Map.mergeDeep


В любом случае, многословность redux и redux-saga стала утомлять меня. Моим постоянным впечатлением было, что библиотека борется со мной вместо того, чтобы помогать.


О Redux

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


Итак, стиль redux не устраивал меня, а в лагах я винил его и react. Мне оставалось только одно.


Перестать писать


боль и печаль


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


Переписать всё №1


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


Где хранить историю?


изначальный путь данных


Первым очевидным решением было использования localStorage. Для этого я использовал замечательную библиотеку localForage. Однако JSON.stringify и JSON.parse при каждом сохранении и извлечении истории (а история сохранялась каждый раз заново целиком при каждом обновлении) не добавлял радости. Даже то, что теперь я запрашивал лишь обновления с сервера и сливал их с историей, не позволяло добиться желаемой производительности.


путь данных с IndexedDB в WebWorker


Следующим решением было использование IndexedDB, а для максимальной производительности была выбрана библиотека Dexie.js. Быстро выяснилось, что обновление лишь изменившихся данных существенно добавляет скорости, но лаги интерфейса всё ещё были заметны. Тогда я вынес всю работу с IndexedDB в WebWorker и вроде бы всё наладилось.


Как синхронизировать данные?


полный путь данных с IndexedDB в WebWorker + MobX


Для запроса к API Tinder необходимо устанавливать специальные заголовки для мимикрии под их Android-клиент. Из соображений безопасности браузерный JS не поддерживает такие трюки, так что все запросы выполнялись из main процесса Electron.


Таким образом, данные проходили следующий путь:


  1. Получение с сервера в main процессе и отправление в WebWorker
  2. Обработка, запись в IndexedDB, и отправление в renderer
  3. Запись в хранилища MobX, что обеспечивало обновление интерфейса

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


Сырая инфраструктура Inferno


разработчик против мамонта


Inferno побеждает конкурентов по скорости почти во всех бенчмарках, но производительность разработчика не менее важна. Несмотря на существование inferno-compat, многие React-библиотеки всё равно не работали. С трудом получалось запустить material-ui, не подгружалась react-vistualized.


Решение о переходе


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


Переписать всё №2


путь данных с GraphQL


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


Если вы прочитали заголовок статьи, то что-то ещё будет для вас очевидным. Разумеется, это GraphQL. В качестве клиента используется Apollo. Сперва решение покажется необычным, но призадумавшись, вы обнаружите много плюсов:


  • Данные передаются не по сети, а через IPC, значит задержка практически отсутствует
  • Apollo автоматически сливает данные в своём redux хранилище
  • Декларативная подача данных к компонентам
  • Готовые решения для сложных вещей вроде optimistic updates

Разумеется, в Apollo по умолчанию нет поддержки IPC, однако есть возможность создать свой сетевой интерфейс. Это очень просто:


import { ipcRenderer } from 'electron'
import { GRAPHQL } from 'shared/constants'
import uuid from 'uuid'
import { print } from 'graphql/language/printer'

export class ElectronInterface {
    ipc
    listeners = new Map()

    constructor(ipc = ipcRenderer) {
        this.ipc = ipc
        this.ipc.on(GRAPHQL, this.listener)
    }

    listener = (event, args) => {
        const { id, payload } = args
        if (!id) {
            throw new Error('Listener ID is not present!')
        }
        const resolve = this.listeners.get(id)
        if (!resolve) {
            throw new Error(`Listener with id ${id} does not exist!`)
        }
        resolve(payload)
        this.listeners.delete(id)
    }

    printRequest(request) {
        return {
            ...request,
            query: print(request.query)
        }
    }

    generateMessage(id, request) {
        return {
            id,
            payload: this.printRequest(request)
        }
    }

    setListener(request, resolve) {
        const id = uuid.v1()
        this.listeners.set(id, resolve)
        const message = this.generateMessage(id, request)
        this.ipc.send(GRAPHQL, message)
    }

    query = request => {
        return new Promise(this.setListener.bind(this, request))
    }
}

Далее приведён код обработки запросов в main процессе. Все фабрики создают методы класса ServerAPI.


Код для выполнения GraphQL запроса:


// @flow
import { ServerAPI } from './ServerAPI'
import { graphql } from 'graphql'

export default function callGraphQLFactory(instance: ServerAPI) {
    return function callGraphQL(payload: any) {
        const { query, variables, operationName } = payload
        return graphql(
            instance.schema,
            query,
            null,
            instance,
            variables,
            operationName
        )
    }
}

Код для создания ответного сообщения:


// @flow
export default function generateMessage(id: string, res: any) {
    return {
        id,
        payload: res
    }
}

Код, обрабатывающий запрос и возвращающий данные:


// @flow
import { ServerAPI } from './ServerAPI'
import { GRAPHQL } from 'shared/constants'

type RequestArguments = {
    id: string,
    payload: any
}

export default function processRequestFactory(instance: ServerAPI) {
    return async function processRequest(event: Event, args: RequestArguments) {
        const { id, payload } = args
        const res = await instance.callGraphQL(payload)
        const message = instance.generateMessage(id, res)

        if (instance.app.window !== null) {
            instance.app.window.webContents.send(GRAPHQL, message)
        }
    }
}

И, наконец, в конструкторе создаём подписчик на сообщение:


import { ipcMain } from 'electron'

ipcMain.on(GRAPHQL, instance.processRequest)

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


Дополнения



Я очень долго не хотел использовать react-router. Дело в том, что я застал их масштабное переписывание API и не горел желанием наступать на те же грабли в очередной раз. Поэтому сперва я подключил router5 + самописное middleware, синхронизирующее состояние в MobX. Внутри Electron де-факто нет URL в привычном смысле, так что идея хранить состояние навигации в реактивном хранилище была отличной. Однако несмотря на то, что такая связка даёт вам полный контроль над навигацией, порой она требует слишком много лишнего кода.


Переход на react-router@v4 я совместил с частичным переходом с Flexbox на CSS Grid. Эти вещи будто созданы друг для друга. Похоже, что в этот раз у команды react-router действительно получилось!


Система сборки


Сперва я использовал webpack и electron-packager, но во время последнего крупного изменения перешёл на electron-forge. Насколько я понимаю, в будущем этот пакет станет стандартным решением для сборки и распространения приложений на Electron. Он включает в себя electron-packager для сборки и electron-compile, позволяющий транспилировать JS/TS, компилировать другие форматы (Less, Stylus, SCSS), и многое другое практически без конфигурации.


Результаты


выводы в GraphQL


При помощи GraphQL я избавился от большого количества моего кода (значит и от моих багов). Добавлять новые возможности в код стало гораздо проще. Я и приложение стали работать быстрее.


Я надеюсь, что этот подход поможет кому-нибудь в создании его приложений на Electron. Я планирую выделить реализацию GraphQL-over-IPC в отдельный npm пакет, чтобы её можно было удобно использовать.


Планы развития


К версии 2.0 мне хотелось бы


  • Переписать на TypeScript хотя бы main процесс
  • Добавить поиск по сообщениям и контактам
  • Добавить возможность блокировки пользователя и редактирования своего профиля

Для интересующихся


-> GitHub
-> Сайт


Скриншот

скриншот


Выводы
  • Декларативное лучше императивного
  • Если вы уверены, что хотите переписать всё на X, то сперва подумайте:
    • Стоит ли переписывать?
    • Является ли X лучшим выбором?
    • Потратьте неделю на поиск альтернатив и взвесьте все плюсы и минусы

Спасибо Юле Курди за замечательные иллюстрации!

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

https://habrahabr.ru/post/331446/


Метки:  

Динамическое создание кластера Apache NiFi

Четверг, 22 Июня 2017 г. 15:25 + в цитатник
Apache NiFi — удобная платформа для работы с различными данными в режиме реального времени, с возможностью визуального построения данных процессов.
Целью данной статьи является описание возможностей создания кластера Apache NiFi.

image Рис. 1. GUI Apache NiFi.

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

Подробнее тут: nifi.apache.org/docs/nifi-docs/html/overview.html

Настройка кластера Apache NiFi


Для запуска кластера Apache NiFi может использоваться встроенный или внешний Apache Zookeeper, можно задать в настройках conf/nifi.properties. Мы будем использовать встроенный.
image Рис. 2. Схема кластера Apache NiFi

Для настройки кластера Apache NiFi нам нужно как минимум 3 узла, для того чтобы обеспечить кворум. Как правило, рекомендуется запускать ZooKeeper на 3 или 5 узлах. Работа на менее чем 3 узлах обеспечивает меньшую долговечность перед сбоем. Запуск на более чем 5 узлах обычно приводит к большему сетевому трафику, чем это необходимо. Для всех трех экземпляров общие свойства кластера можно оставить с настройками по умолчанию. Однако обратите внимание, что при изменении этих параметров они должны быть одинаковыми для каждого будущего узла кластера.
Для минимальной настройки кластера Apache NiFi необходимо выполнить следующее операции на каждом узле будущего кластера:
  1. задать в nifi.properties необходимые параметры
  2. указать сервера кластера в zookeeper.properties
  3. задать id для Zookeeper у локального узла
  4. указать строку подключения к Zookeeper кластеру в state-management.xml


Опишем каждый шаг более детально
1. Задать в nifi.properties:
nifi.cluster.is.node=true
nifi.cluster.node.address=
nifi.cluster.node.protocol.port=3030
nifi.state.management.embedded.zookeeper.start=true
nifi.remote.input.host=
nifi.web.http.host=
nifi.zookeeper.connect.string=

connect-string список серверов с zk через запятую.
Например: nifi01:2181,nifi02:21818,nifi03:2181

2. В zookeeper.properties прописать сервера кластера:
server.1=:2888:3888
server.2=:2888:3888
server.3=:2888:3888
initLimit=5
syncLimit=2


3. Задать id в файле ./state/zookeeper/myid, если локальный узел является частью Zookeeper кластера.
4. Прописать в файле state-management.xml строку подключения к кластеру

Для запуска Apache NiFi на каждом узле достаточно запустить команду:

bin/nifi.sh start

При этом не важно в какой последовательности будет запущен Apache NiFi на каждом из узлов. Отслеживать процесс запуска кластера можно по файлу logs/nifi-app.log

Запуск локального кластера в виртуальной среде


Для изучение работы с кластером нам необходима возможность локального запуска кластера Apache NiFi в виртуальной среде. Для запуска в виртуальной среде были использованы Hashicorp Vagrant и Oracle VM VirtualBox. Необходимо установить плагины vagrant-vbguest и vagrant-hostmanager. Для ускорения и облегчения процесса запуска были написаны специальные скрипты vagrant provision, которые позволяют запустить кластер Apache NiFi в виртуальной среде одной командой:
vagrant up
После запуска, в течении пяти-семи минут, в браузере будет доступен пользовательский интерфейс по адресу localhost:8080/. Так же, можно проверить, открыв VirtualBox, должны быть видны три виртуальных машины под управлением nifi01, nifi02 и nifi03.

Исходники скриптов провизии vagrant для запуска кластера NiFi доступны на github.

Динамическое формирование кластера


В некоторых ситуациях, необходимо, чтобы подключаемое устройство само находило кластер в сети и подключалось к нему. Для этих целей была написана программа «агент», которая выполняет поиск устройств в сети, и при нахождении кластера (проверяет через Apache NiFi REST API) подключается к нему. Исходники данной программы доступны на github.

Пример запуска агента:
java -cp cluster-joiner-0.0.1-jar-with-dependencies.jar ru.itis.suc.NodeAgent /home/user/nifi/nifi-1.2.0 8085
где аргументы путь к Nifi и порт, который агент будет слушать при необходимости создания нового кластера.
После запуска, будет произведен поиск кластера в локальной сети и подключение к нему.
В случае если кластер не найден, будет попытка создания кластера, если найдутся еще 2 устройства готовые стать частью нового кластера.


Рис. 3. GUI Apache Nifi запущенного в кластере.


Рис. 4. Список узлов кластера.

Заключение


Данная работа была проделана в целях эксперимента и проверки возможности автоматического создания кластера Apache NiFi в локальной сети.
Конечно, были использованы примитивные алгоритмы для поиска и подключения, однако целью работы была только проверка подобной возможности.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331444/


Метки:  

[Из песочницы] Эффект Медичи или можно ли скрестить персик и дыню или Windows и iOs

Четверг, 22 Июня 2017 г. 14:52 + в цитатник
Во Флоренции XV века семья Медичи собрала самых образованных и талантливых людей своего времени. Скульпторы и поэты, художники и учёные, воины и философы учились друг у друга, разрушая границы между дисциплинами и культурами, создавая на их стыке истинные шедевры. Феномен креативного сочетания несочетаемого Франс Йоханссон назвал «эффектом Медичи». Суть в том, чтобы создавать новое на пересечении разных идей, разрушая ассоциативные барьеры и выявляя неожиданные на первый взгляд связи.

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

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

Области пересечений плодятся как бесконечная геометрическая прогрессия.

image

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

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

Вот несколько групп этого «нельзя».

1. «Впихнуть невпихуемое»


На днях участвовал в сессии по вопросам Энтерпрайз Архитектуры нашей уже не молодой компании. Попытки хаотичного скрещивания разных подходов в погоне за быстрым результатам приводят в Enterprise Architecture вот к такому результату.
image

Думаю, не стоит объяснять, чем такой подход грозит на практике.

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

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

2. Бессмыслица


Нет смысла скрещивать идентичные сущности. Да простят меня сексуальные меньшинства, но от скрещивания мужика с мужиком ничего не получится. В этом попросту нет смысла. Точно также и в других сферах. Смысла в пересечении Windows и iOs, Mailchimp и MailGun, Ubera и Gett попросту нет. У них одинаковые потребительские характеристики. Ничего принципиально нового от такого соития мы не получим. В лучшем случае что-то точно такое же.

3. Опасность


Давайте поговорим об опасном виде пересечений. Простейший пример этого явления – скрещивание сандаликов и носочков.

image

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

В дискуссии под упомянутым в начале статьи роликом, несколько уважаемых господ привели два отличных примера из области химии и физики.
«Нельзя скрещивать концентрированные (или горячие) растворы кислот и щелочей. Это важное правило техники безопасности, нарушение которого грозит химику, ну или просто криворукому экспериментатору серьезными неприятностями»
(с) Alex Sol. Также, как и
«нельзя скрещивать атомные ядра одних частиц с другими ядрами или элементарными частицами. Последствием взаимодействия может стать деление ядра и испускание новых элементарных частиц. Кинетическая энергия вновь образованных частиц может быть гораздо выше первоначальной»
(с) Andrey Alekseev.

Что это значит для девелопера? Все как и с элементарными частицами и ядерным оружием, которое сначала увлеченно создавали, а теперь пишут тома документов, регламентирующих всеобщее разоружение. Американские АНБ и ЦРУ разрабатывают передовое ПО для слежки за всем миром в целях общей безопасности и мира во всем мире, а на деле, минимальная утечка кода, приводит к созданию вирусов типа нашумевшего недавно Wannaсry. Как сказал один мудрый человек, нельзя соединять добро со злом. Вывод, перед созданием чего то нового путем скрещивания старого – посмотрите, не убьет ли это вас. Стоит только учитывать, что подобные опасения не должны тормозить технический прогресс и автоматизацию, замещающую рутинный человеческий труд.

Итак, если:

  1. Впихивание невпихуемого в область пересечения не сломает итоговых потребительских характеристик и продуктом можно будет пользоваться,
  2. Мы не пытаемся «поженить» одинаковые сущности,
  3. Мы трезво отдаем себе отчет в том, что плод скрещивания не взорвется и не погубит всех вокруг;

Вперёд! Составляем списки возможных «родителей» и двигаем мир вперед. Вполне возможно, что приложение для заказа такси, которое параллельно будет измерять твое артериальное давление и делать тебе МРТ пока ты стоишь на обочине, станет очередным проектом-единорогом.

Источники:


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

https://habrahabr.ru/post/331440/


Метки:  

Финал конкурса SAP Кодер 2017 пройдёт в прямом эфире

Четверг, 22 Июня 2017 г. 14:44 + в цитатник
В начале апреля мы анонсировали конкурс «SAP Кодер». Участники должны были предложить свои проекты по заданным направлениям, сделанные на базе SAP Cloud Platform. Всё это время участники готовили свои решения — и вот настало время их презентовать. Решения получились интересные, поэтому мы предлагаем вам присоединиться к просмотру. Кроме презентации участников, вы услышите два доклада о SAP, которые обозначат передовые тренды в разработке. Узнайте подробности под катом и не забудьте присоединиться!

image

 
Прямая трансляция финала конкурса SAP Кодер 2017 состоится 28 июня с 10:00 до 14:00 (по московскому времени).
Чтобы не пропустить прямую трансляцию, добавьте мероприятие в свой календарь.

SAP Кодер 2017 – это конкурс для всех, кто стремится осваивать самые современные подходы к разработке. В этом году САП СНГ проводит этот конкурс первый раз. В рамках конкурса участники разрабатывают собственные приложения для решения реальных бизнес-задач, предоставленных российскими клиентами SAP. Разработка ведется на SAP Cloud Platform – инновационной открытой облачной платформе SAP, предлагающей цифровые сервисы для Интернета вещей, машинного обучения, прогнозной аналитики и других передовых бизнес-сценариев. Подробнее о конкурсе читайте на сайте.
В ходе трансляции Вы услышите о технологических трендах, ознакомитесь со стратегией SAP в области платформенных технологий, узнаете о примерах развития бизнеса с помощью облачной платформы SAP.
 

Расписание:


10:00 — На что SAP потратит 2,2 млрд. долларов в ближайшие 5 лет? Куда направить взгляд, Рольф Шуманн, вице-президент по платформе и инновациям SAP SE

11:00 — Взгляд клиента: промышленная разработка приложений на платформе SAP Cloud Platform, Сорен Лоингер, директор по продажам и инновациям в сфере обслуживания, Aesculap/B. Braun, Germany

11:30 — Перерыв

11:45 — Выступление финалистов конкурса

13:30 — Награждение победителей конкурса

SAP Cloud Platform – это открытая облачная платформа SAP, которая предоставляет возможности для хранения и обработки данных в SAP HANA и ASE, а также в open source-системах PostgreSQL, MongoDB и Hadoop. SAP Cloud Platform прекрасно подходит для разработки мобильных и HTML-приложений, которые могут быть легко интегрированы с любыми облачными или локальными системами благодаря встроенному в SAP Cloud Platform сервису интеграции. В настоящее время SAP Cloud Platform предоставляет порядка 40 различных сервисов, включая IoT, алгоритмы прогнозирования, машинный перевод и другие методы машинного обучения, имеет собственную веб-среду разработки WebIDE и инструмент для быстрого прототипирования Build, поддерживает разработку приложений на Java, XSJS, C++, Python, Ruby, Node.js, Go, PHP, .Net.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331428/


Метки:  

[Перевод] SIP: этот рост не остановить

Четверг, 22 Июня 2017 г. 14:36 + в цитатник
image

«Сонь, на «прогнившем западе» уже через 3 года умрет TDM, а у нас только лет через 50», — утирая слезы зависти, говорит мне SvyatoslavVasiliev. Мы с ним обсуждаем статью коллег из GetVoIP о мировых трендах развития VoIP, вытесняющего традиционные технологии из ТфОП/PSTN (телефонные сети общего пользования). Под катом — ее перевод. Слово автору, Matt Grech.



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


Ожидается, что SIP-технологии продолжат стремительно расти в течение ближайших нескольких лет и уже к концу этого года корпоративный IP-трафик обгонит по своим объемам бизнес-коммуникации, проходящие через ТфОП с использованием традиционных для этой сети технологий. Возможно, это случится даже быстрее с учетом того, что крупные провайдеры вообще собираются отключить старую схему работы ТфОП. Eastern Management Group провела исследование участия IT-специалистов компаний в формировании глобальных SIP-технологий в период до 2020 года и пришла к интересным результатам.


Как дела у SIP?


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


Исследование Eastern Management Group показывает, что в настоящий момент более 60% компаний уже используют технологии SIP в коммуникациях, хотя уровень ее проникновения в бизнес разнится в зависимости от его масштабов. Благодаря большому размеру выборки, исследователям удалось учесть данные по IT-подразделениям компаний всего рыночного спектра.


«Исследование Eastern Management Group было проведено среди 3 500 IT-специалистов в январе 2017. Оно показывает, что мировой рынок SIP (включая SIP-транки, SIP-телефонию, SBC, аудио- и видеоприложения) растет. И в течение следующих 5 лет статья расходов на SIP будет расти быстрее темпов роста IT-бюджетов в целом».


Данные по компаниям с разным размером бизнеса:


image

Такой быстрый рост


Мы можем видеть, что как в маленьких компаниях, так и в больших корпорациях ожидается стремительный рост проникновения SIP. Только в SMB-сегменте мы видим скачок по приросту трафика c 55% (а это уже большая его доля) до 59% всего за один год. Но что более интересно — к 2020 году SIP-трафик в SMB сравняется с объемами аналогичного трафика в крупном бизнесе (его доля в обоих сегментах составит 71%).


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


Хотя уже даже в 2017 году мы увидим, как крупный бизнес достигнет отметки в 51% по объемам использования SIP-коммуникаций, что является весьма существенным скачком по сравнению с 44% в предыдущем году. Это логично: корпорации видят, что IP-решения начинают все больше затачиваться под их структуру, при этом осознавая, что преимущества SIP — это нечто гораздо большее, чем способ сэкономить ресурсы на связь.


Увеличение продуктивности бизнеса


Существует целый ряд преимуществ SIP по сравнению с традиционными технологиями проводной телефонии. Я разговаривал с Джоном Малоуном, президентом и CEO Eastern Management Group, и он был решительно убежден в том, насколько SIP-технологии лучше — особенно для малого бизнеса.


«Если у вас малый бизнес, то вы просто спятили, если еще не сделали все возможное для того, чтобы использовать SIP».


Я и сам не очень понимаю, зачем малому бизнесу хотеть тратить лишние деньги на традиционные технологии — одна только экономия ресурсов за счет внедрения виртуальной АТС покроет все, не говоря уже о внедрении системы Unified Communications в целом. Как мы знаем, ТфОП, основанная на традиционной технологии, умеет только это — совершать телефонные звонки. На основе же SIP в рамках ТфОП могут быть выстроены решения по организации командного общения и взаимодействия, автоматическому определению статуса сотрудников в телефонии, видеоконференциям. Тот же SIP лежит в основе концепции BYoD (прим.: bring your own device — концепция, предусматривающая возможность использования сотрудниками собственных мобильных устройств для решения рабочих задач) и вообще мобильности бизнеса, на которой выстраивается сегодня командная работа.


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


image

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


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


Самое время для SIP


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


«Согласно отчету Eastern Management Group, быстрое развитие SIP и его принятие директорами по IT по всему миру приближает конец традиционных технологий ТфОП и прекращение их поддержки операторами связи в США, Великобритании, Германии, Японии и других странах. Это вдохновляющие новости для SIP-провайдеров, виртуальных АТС, решений SBC и других сервисов в этой области».


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


  • AT&T в 2020
  • Verizon в 2020
  • British Telecom в 2025
  • Northcentral Telecom в 2025
  • Deutsche Telekom в 2018
  • Swiss Com в 2017
  • Telstra в 2021

Подготовка к прекращению поддержки традиционных каналов ТфОП в США, как мы помним, началась в 2014 году, когда FCC (Federal Communications Commission) разрешила AT&T приступить к процессу конвертирования традиционных сетей в широкополосную IP-инфраструктуру, придерживаясь при этом существующих нормативов функционирования ТфОП. Вот как AT&T прокомментировал решение FCC в своем пресс-релизе:


«Рабочая группа, работающая над Национальной стратегией по переходу на широкополосную сеть, и TAC (Technical Advisory Committee) единодушно признали, что создание возможностей для операторов по прекращению поддержки устаревших технологий ТфОП было необходимым шагом для обеспечения единой широкополосной сети связи на территории США. В частности, все понимают, что расходы на обслуживание традиционной инфраструктуры с ее быстро уменьшающейся абонентской базой становятся неокупаемыми и отнимают значительную часть инвестиций, выделяемых на создание широкополосной сети».


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


IP-коммуникации движутся вперед


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


Как объясняет исследование, развитие SIP и ответственно за возникновение сервисов виртуальных АТС, и одновременно подстегивается ростом их популярности. Поскольку «за прошедшие несколько лет рынок виртуальных АТС вырос на 500%, SIP-телефония и SIP-транкинг также существенно прирастали по объемам продаж».


Делая SIP технологической основой в своих штаб-квартирах, компании распространяют их на свои региональные или даже международные представительства посредством сервисов виртуальных АТС. Собственно, виртуальные АТС тоже переживают устойчивый рост в последние пять или около того лет. И сейчас доля облачных АТС на рынке решений в сфере телефонии почти достигла 20%.


Вы можете запросить подробный отчет по исследованию в Eastern Management Group.

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

https://habrahabr.ru/post/331432/


Метки:  

«Гоночки» на SVG

Четверг, 22 Июня 2017 г. 14:36 + в цитатник
image

Вводная часть


Аркадная js игра. Прототипом послужили так называемые «Гоночки в клетку»(в каком-то детском журнале видел). Смысл в том, что на тетрадном листе рисуется трасса и игроки ходят по клеткам. За один ход можно увеличить скорость на один или уменьшить. Если «врезаешься» в стену, то продолжаешь от этого места с единичной скоростью.

image

-> Код игры

Игра сделана с помощью raphael.js и playground.js, с отрисовкой графики в SVG. На моем средненьком ноутбуке (CPU 4 x 2.1 GHz) под chromium игра выдает 50 fps для маленьких трасс и 40fps для больших.

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

Физика реализована на двумерном массиве. Райсер ездит (летает?) по ходам. Каждый ход игрок может изменить скорость (на 3 единицы больше или на 10 единиц меньше) и так же, направление (влево или вправо). Исходя из этих данных и текущего положения, игра смотрит где закончится текущий ход и проверят массив на наличие стен или финиша. В зависимости от того, что в этой конечной точке, дальше следует реализация соответствующих алгоритмов. Создание трассеров тоже реализовано на этом массиве(в бд хранятся индексы массивов, а не реальные размеры смещений).

Ширины трасс варьируются от 500 единиц до 2000. Фактического ограничения на размеры нет, но чем больше, тем меньший fps выдает браузер.

Для графики используется SVG c 11 дочерними элементами. 5 (path) — для отрисовки райсеров, 4 (path) — для отрисовки трассы, 1 (circle) — для анимации столкновений со стенами и 1 (path) — для огней выхлопов.

image

База данных представлена одним json-файлом с трассерами. Ее обслуживают три php скрипта. Карты хранятся в переменной js. Можно было бы и для карт создать json, но они статичны и у них маленький размер.

В аркаде присутствуют звуки столкновений, звуки райсеров (как того, что под управлением игрока, так и чужих, при приближении к ним), а так же есть звук свиста стен. Мне этот эффект очень нравился в серии NFS, и я тут его постарался повторить. Все звуки скачены с сайта opengameart.org. На фоне играет Let the Games Begin(Section 31 — Tech), либо alien swamp(к сожеленью, автор неизвестен).

Отрисовка трассы


image

Сначала я читаю массив объектов.

{i: size_i, j: size_j, size: indent_in_cell}

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

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

image

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

В самом конце я отрисовываю все прямоугольники одним элементом «path».

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

Значения для «коробок» берутся из массива элементов типа

{i: size_i, j: size_j, width: width_in_cels}

i и j указываются для левого верхнего угла, а width это общий размер для квадрата. Затем на основе этих параметров изменяется главный массив. Элементам, которые попадают в «коробки», присваиваются значения 3. Далее по массиву я обрисовываю все коробки. Они рисуются, конечно же, все одним элементом «path».

Создание и чтение трассера.


Трассер представляет собой массив объектов типа:

{
  s: racer.speed,
  r: racer.root,
  i: racer.coord.i,
  j: racer.coord.j,
  wait: 0,
}

где s — скорость райсера, root — направление, i, j — координаты, в которые надо поставить райсер в текущем ходе, wait — это время ожидания. В последний элемент массива я добавляю информацию трассера:

    time: this.timer,
    human_time: racer.human_time,
    start_i: racer.start.i,
    start_j: racer.start.j,   
    road: settings.road,
    name: racer.name,
    color: racer.fill,

где, time — это общие количество фреймов, за которое этот райсер пришел к финишу, human_time — это время в формате hh:ss, start_i, start_j — координаты для стартовой позиции, road — индекс трассы, на которой получен этот трассер, name — название трассера, color — цвет райсера.

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

При старте райсера создается объект хода и начинается инкрементирование wait (так как скорость сначала равна нулю) Далее, при каждом ходе, когда счетчик фреймов равняется нулю, происходит или запись объекта хода в массив, или инкреминтирование wait.

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

Заключение


В итоге у меня получилась довольно шустрая аркада с элементами сетевого взаимодействия игроков. Кроссбраузерность не проверял… точнее сказать firefox выдавал ужасный fps, при изменении масштаба, и я не знаю, с чем это связано. Если у кого не работает, то сhromium или, на крайний случай, chrom.

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

Игра примерно вышла на 3000 строк кода и 4 мегабайта.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331430/


Метки:  

Стагнация неизбежна. CRM принимает бой

Четверг, 22 Июня 2017 г. 14:28 + в цитатник
Разруха в головах — эта короткая булгаковская цитата не устаревает и вряд ли когда-то устареет. Стоит немного покачнуться экономической ситуации, вырасти ценам или упасть продажам, владельцы компаний и частные лица впадают в панику. Единственно верное, на их взгляд, действие — это перестать покупать, собрать все деньги и затаиться «до лучших времён». Тем самым они провоцируют более глубокую стагнацию, парализуют бизнес и личные финансы.

Помните притчу о двух лягушках, угодивших в крынку со сливками? Одна смирилась, решила сохранить силы и пошла на дно, а вторая била лапками, взбила сметану и вылезла, уставшая, но живая. Мораль: кризис — время бить лапками. Желательно автоматизируя этот процесс, ведь с помощью блендера обычно сметана взбивается быстрее :).

Стагнация неизбежна. Стоп паника


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

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

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


    На витрине: «Боб&Джо подушки с наполнителем-стеклом».
    — Не знаю, Джо, может, мы используем какой-то фиговый сорт стекла?...


  • Мало потенциальных клиентов, узкий или насыщенный рынок. Компания может работать в узком сегменте и в какой-то момент осознать, что рынок перенасыщен. Компания может работать в самом широком сегменте и осознать, что «все всё купили». Такая история настигла операторов сотовой связи в крупных регионах примерно в 2010 году — проникновение сотовой связи в России превысило единицу, а в 2016 уже 164% в регионах и 233% в столицах. Кстати, все мы могли заметить, как операторы выкрутились — сперва за счёт VAS (контент, гудки и прочие АнтиАОНы), а затем за счёт мобильного интернета. Собственно, это и есть секрет преодоления стагнации этого типа.

    Рецепт — отстройка, диверсификация и освоение новых сегментов рынка.

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

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

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

  • Сильные конкуренты, демпинг на рынке. К компаниям в XXI веке конкуренция приходит откуда и не ждали. Например, на том же рынке CRM среди игроков есть оператор IP-телефонии (и не один) и федеральный оператор сотовой связи. Конечно, их программы далеки от CRM, но кто из пользователей пойдёт разбираться — конторам просто оказалось выгодно открыть такую комплементарную услугу чисто в маркетинговых целях. Но, кстати, история не из мощных, эти ребята даже со своей огромной клиентской базой не смогут тягаться с классическими CRM в любом сегменте рынка.

    История поярче. Как вы думаете, Nokia или Blackberry видели конкурента в лице Google? А он появился, разработал операционную систему Android и фактически перекроил рынок в сторону других производителей — уже опытных, но более доступных и гибких. Опять же, показательно, как прекрасно в этих условиях выжил Apple и как сел в лужу Microsoft с винфонами. Но это, конечно, отдельная дискуссия около технологий, маркетинга и роли личности в истории.

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

  • Форс-мажор — стагнация вызвана временными или системными обстоятельствами непреодолимой силы. Например, продавцам мороженого и воды в средней полосе России этим летом не так вольготно, как прошлым или горячим летом 2010-го.

    Рецепт тот же, что и при системном спаде.

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

CRM спешит на помощь


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

В системе координат «компания — клиент»


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


… этот прибор работает удалённо и помогает мне убедить вас купить наш новый продукт!
Мы рассмотрим, естественно, на примере RegionSoft CRM — что получает бизнес от системы для улучшения сервиса:

  • полную картину работы с клиентом — одним кликом можно поднять всю историю взаимодействий и просмотреть профиль клиента;

  • персонализацию любых предложений — имея пул информации о клиенте, вы можете предложить именно индивидуальный офер, основанный на его потребностях, а не на потребностях группы или сегмента;

  • сегментацию клиентов для рассылок и иных активностей (кстати, рассылки можно делать прямо из интерфейса CRM-системы);

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

  • CRM записывает все разговоры с клиентами — а это значит, вы сможете проконтролировать качество работы и обучить менеджеров на лучших примерах;

  • три планировщика (обычный планировщик-календарь, групповой и трёхнедельный) вкупе с напоминаниями гарантируют, что все встречи, транзакции и звонки состоятся в условленное время;

  • всю систему лояльности — с дисконтными картами, скидками, наценками и т.д;

  • и даже систему тикетов для сервисной службы или технической поддержки.

Кстати, мы рассуждаем не только на основе своего опыта: мировые исследования показывают тот же самый тренд роста внимания потребителей к сервису.
 
Клиентский сервис в графиках — несколько исследований
Мы выбрали несколько свежих графиков из разных исследований, посвящённых сервису, перевели и перерисовали их. Так, Tech News World опросил 500 организаций, которые внедряют CRM-системы и выяснил, что предприниматели ожидают получить от автоматизации взаимоотношений с клиентами. 74% опрошенных рассчитывают прежде всего улучшить клиентский сервис, а 66% — увеличить удовлетворенность клиентов. Кстати, другие цели также совпали с нашим видением того, как и для чего можно использовать CRM-систему.


Компания ClickFox выяснила, как компании могут удержать клиентов у самих клиентов. Так, 33% предпочитают получить исключительный сервис 24/7. Для нас, если честно, удивительно, что 12% добровольно согласились на эксклюзивные предложения и 11% — на персонализированные продукты. Кстати, исследование Inside CRM показало, что более 75% эффекта от улучшения сервиса приходится на увеличение продаж и рост количества клиентов.


Но в том же опросе выяснилось, что с клиентами шутки плохи — новости о вашем негодном сервисе активно распространятся. У социальных сетей в опросе всего 16%, но нам думается, что в России эта цифра явно выше.


Исследование The Rockefeller Corporation показало, что основной причиной ухода клиентов является невнимание к ним.


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

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

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

  • сегментировать клиентскую базу — и предлагать узким сегментам и отдельным клиентам то, что подходит именно им, проводить рассылки;


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

  • проводить анкетирование — все анкеты прикрепляются к карточке клиента и сохраняются в CRM-системе;

  • обрабатывать клиентов, которые не прошли воронку продаж и отложили отношения с вами «на подумать», «всех посмотреть», «сравнить цены», «дороговато» и т.д. Для них стоит подготовить предложения отличные от тех, с которыми они уже знакомы. Маленькое примечание: допродажи должны быть действительно нужными и полезными для клиента. Не стоит к мужским кроссовкам за 17 000 предлагать шнурки с розовым котёнком, а к ПО для мониторинга сети игру Minecraft.


Идеальное предложение: Если честно, эта машина здорово переоценена, имеет ужасно огромный пробег и пахнет точно как брокколи на пару… НО она имеет двухзонный климат-контроль!

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

Вообще, аналитика в CRM-системе выручает не только в период кризиса, но и в мирное время: нужно анализировать данные и глубоко погружаться в информацию, чтобы обнаружить неприятности на ранней стадии и принять меры.Отдельные CRM-щики предлагают навороченные дашборды (мы видели даже с виджетом погоды и лунным календарём), сложные OLAP-кубы (точнее, кучу сложных таблиц, которые на самом деле не OLAP и в которых без поллитры не разберёшься). Наш подход такой: ИТ-инструменты должны быть надёжны, просты в эксплуатации и экономичны. Кстати, опять же по данным зарубежных исследований 55% покупателей CRM ждут простоты использования, 27% — управления по расписанию (кстати, мы это реализовали с помощью RegionSoft Application Server). Компании малого и среднего бизнеса в Европе любят CRM-системы: только 21% считают их болевой точкой среди ПО (для сравнения, системы бизнес-аналитики лидируют с 66%, а на почту приходится 13% головной боли). При этом крайне удовлетворены CRM-системой 61%, отчасти — 36% и всего 3% не удовлетворены совсем.

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

В системе координат «компания — сотрудники»


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

CRM-система позволяет освободить время сотрудников за счёт автоматизации рутины и стандартных цепочек действий. Это не повод сокращать штат и экономить на спичках — это возможность сотрудникам уделить больше времени сервису и общению с клиентом. Во многих компаниях сохранились, например, регламенты на длину разговора с заказчиком — если, допустим, прописаны нормативные 5 минут 30 секунд, то за 10 минут или за 17 можно лишиться части премии, не выполнив норматив KPI. Это явление само по себе пережиток старины, но в кризисное время просто губительно — вы обязаны уделять клиенту столько времени, сколько ему необходимо. Инвестируйте в отношения временной ресурс, отдача не заставит себя ждать. Кстати, CRM-система с настроенной телефонией и маршрутизацией звонков гарантирует ещё один инструмент классного сервиса — доступность менеджеров.

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

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

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

И о рисках — даже без стагнации


Вне зависимости от фазы стагнации или роста, любая компания всегда сталкивается с потенциальными рисками, часть которых от неё даже не зависит. В принципе, набор рисков отличается в зависимости от сферы деятельности, структуры активов, модели управления и т.д. — как правило, они прописаны в стратегии управления рисками или просто подразумеваются руководством. Однако есть четыре группы рисков, которым подвержены все.
 
Стратегические риски — вызваны отраслевыми спадами, изменениями рынка и модели покупательского поведения. Например, мода на сенсорные телефоны, которые достаточно быстро захватили все ценовые сегменты, почти убила кнопочные аппараты — это был стратегический риск для производителей телефонов, им нужно было перестраиваться.
 
Но бывают мнимые риски, слепое решение о минимизации или исключении которых может обанкротить компанию.
Например, появились облачные технологии и модель поставки SaaS — многие вендоры CRM прекратили развитие десктопных версий и направили все силы на web-приложения. Однако уже к 2014 году стало выясняться, что средний и крупный бизнес, а также уважающий свои данные малый бизнес не готов вступить в трехсторонние отношения и перенести свои данные в облако. Чуть позже компании посчитали и поняли, что SaaS это ещё и дороже. Посмотрите сайты CRM — почти у всех есть серверные версии, а некоторые вендоры активно развивают и поставляют «коробку». Кстати, были и те, кто смог визионерски просчитать все минусы облака и продолжил большее (или всё) внимание уделять десктопу — RegionSoft Developer Studio был одним из них.
 
Финансовые риски — связаны с наличием отклонений в движении потоков денежных средств. Это может быть дебиторская задолженность, кризис неплатежей, непонимание структуры доходности клиентов (какая часть базы приносит большую часть дохода — помните принцип Парето?).
 
Операционные риски — связаны с проблемами внутри компании: бардак в бизнес-процессах, саботаж сотрудников, массовые увольнения в период стагнации и кризиса, сбои в контроле показателей, некорректное планирование и невыполнение KPI. Такие ситуации могут складываться стихийно на стыке нескольких мелких проблем или сознательно исходить от сотрудников и даже самого руководства, которое решает без того трудный период стагнации «скрасить» завинчиванием гаек.
 
Репутационные риски — вызваны проблемами с клиентским сервисом. Как уже неоднократно оценивали компании и аналитики, недовольный обслуживанием клиент быстро распространяет негативные отзывы на 2-4 своих знакомых. Социальные сети только усугубляют ситуацию.
 
Эти риски необходимо мониторить и управлять ими — тогда вы сможете предвидеть период стагнации и минимизировать возможные потери. Грамотная автоматизация в этом — умный и безотказный помощник. Обратите внимание, как растёт рынок CRM-систем (факт+прогноз) — даже в кризисные годы у него не было спада, поскольку автоматизация давно считается одним из главных инструментов кризис-менеджмента.


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

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



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

Проголосовало 3 человека. Воздержалось 2 человека.

Как вы считаете, что поможет в преодолении кризиса?

Проголосовало 3 человека. Воздержалось 2 человека.

Если компания вас обидела (продуктом или сервисом) вы:

Проголосовало 3 человека. Воздержалось 2 человека.

У вас в компании есть CRM-система?

Проголосовало 3 человека. Воздержалось 2 человека.

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

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

https://habrahabr.ru/post/331416/


[Перевод] Создаем нормальные push-уведомления

Четверг, 22 Июня 2017 г. 13:55 + в цитатник
Мы, команда busuu, считаем, что наш продукт — не просто приложение для изучения языков, но также и часть более широкой категории инструментов для самоактуализации. На наш взгляд, мы состоим с близком родстве с тренажерами для мозга, например, или фитнес-приложениями. Не имеет значения, что именно делает приложение — преподает языки, развивает память и мышление или учит качать пресс — конечная цель одна: мы стремимся помочь нашим пользователям в саморазвитии.



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

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

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

Проблема состоит в том, что большинство push-кампаний по реактивации пользователя никуда не годятся. И это мы еще мягко выразились, на самом деле. Большая часть из них просто напоминает о существовании приложения и не приносит никакой другой пользы. Это просто навязчивые, отчаянные попытки обратить на себя внимание («Пора сделать то-то», «Возвращайтесь?»). Хуже того, они не обнаруживают никакой связи с самим продуктом. Если на них кликнуть, вас просто перекинет на главный экран или панель навигации, никакого действия при этом произведено не будет. Поневоле задашься вопросом: «И зачем тогда было вообще меня звать?». Неудивительно, что 60% пользователей отключают push-уведомления.

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

Никудышные уведомления для реактивации


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

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



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



Memrise тоже не слишком радует. Шаблонное сообщение, которое, опять же, приводит на экран навигации по курсу.



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

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

Не поймите меня неправильно: я ценю фреймворки для автоматизации мобильного маркетинга, ведь они дают куда больше гибкости и скорости, чем жесткий код. Маркетологи могут создавать уведомления, проводить A/B тестирование, запускать новые итерации кампаний без участия инженеров. И ждать модерации на маркете им не приходится. Это очень круто!



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

Уведомления — это часть продукта


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

Сначала мы допускали те же ошибки, что и Duolingo с Memrise, но потом сделали push-уведомления по-умному: персонализированными, релевантными и полезными. И у нас есть статистика, которая это подтверждает.

  • Процент открытых push-уведомлений увеличился в три раза
  • При неизменном количестве разосланных уведомлений прибыль на Android возросла более чем в десять раз, а на iOS — в три раза.


Подключайте персональные данные

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

Мы выбираем слово из числа тех, которые пользователь выучил недавно, и устраиваем проверку — непосредственно в push-уведомлении.



Как говорит Andrew Chen:

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


Задавайте вопросы

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

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

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

Timehop, к примеру, рассылает нахальные уведомления с текстом: «С ума сойти, это правда ты?», тем самым подталкивая людей зайти в приложение. Чтобы увидеть фото, о котором идет речь, достаточно просто провести по экрану. Здесь помогает и то, что сообщения Timehop написаны в легком, забавном стиле, что выделяет их на общем фоне».

Также мы никогда не повторяемся, высылая слова — это создает непредсказуемость и вариабельность. «Вариабельность пробуждает любопытство и вызывает желание открыть уведомление», — продолжает Nir Eyal.



Устанавливайте связь со значимым действием

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

Вместо этого приложение отправит вас в Словарный Тренажер — красивое название для теста на знание выученных слов.

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



Вот как это выглядит в движении:



Включите награду и вклад

Те, кто знаком с работами Nir Eyal, наверняка заметили здесь «зацепку».

Сначала мы привлекаем пользователя персонализированным push-уведомлением (внешний триггер), которое вызывает интерес (внутренний триггер).

Кликнув на уведомление, они отвечают на вопрос теста (действие).

По завершению теста появляется заставка с поздравлением и количеством набранных баллов (награда).

И наконец, поработав с накопленным словарным запасом, они улучшили свою долгосрочную память (вклад).



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

Заключение


Любая стратегия по реализации push-уведомлений выигрывает от продуктового мышления. Маркетологи и люди, задействованные в разработке, могут объединить свои силы, чтобы обеспечить пользователю позитивный опыт. Настолько позитивный, что он воспринимается не как кампания по реактивации пользователя, а как по-настоящему полезная функция.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331408/


Метки:  

Запускаем GSM сеть у себя дома

Четверг, 22 Июня 2017 г. 13:37 + в цитатник


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

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

В результате мы запустим экспериментальную 2G сотовую сеть в пределах комнаты с поддержкой СМС и голосовых вызовов, без GPRS. Ее можно будет использовать для изучения работы и взаимодействия устройств и компонентов GSM сети, не вмешиваясь в коммерческие сотовые сети.


Внимание!

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

Железо и Софт



Железо

  • Компьютер с установленной 32-х битной Ubuntu 14.04 (Не виртуалка)
  • 2 телефона на чипсете TI Calypso (Motorola c113, c118, c123, ...)
  • 2 USB-TTL конвертера
  • 2 провода (джек 2.5 мм + джемперы)


Софт

  • Трансиверы на основе OsmocomBB
  • Базовая станция на основе OsmoBTS
  • Контроллер базовых станций на основе OsmoBSC
  • MSC,HLR, СМС-центр на основе OsmoNTIB


Закупаемся





Телефоны на чипсете TI Calypso проще всего будет поискать на сайтах бесплатных объявлений в Вашем городе. Цена варьируется от 300 до 700 рублей в зависимости от состояния и наличия зарядного устройства. Вероятность купить в России телефон, предназначенный для западных GSM диапазонов очень мала, но если Вы решите покупать его за границей, то рекомендую обратить внимание на рабочие GSM диапазоны. Вам нужны телефоны, работающие с 900 Мгц и 1800 Мгц, если Вы проживаете в России.
Список поддерживаемых моделей можете посмотреть по ссылке:
osmocom.org/projects/baseband/wiki/Phones

Возможно есть и другие совместимые телефоны, в частности, Motorola c113 и c113a полностью совместимы с OsmocomBB, хоть и не представлены на официальном сайте.

SIM-карты не нужны.



USB-TTL конвертеры могут работать на чипах CP2102, FT232 или PL2303.
Я рекомендую использовать CP2102 так как при помощи специализированной утилиты можно заставить работать этот конвертер на нестандартных скоростях, что требуется для некоторых веток OsmocomBB.
Приобрести его можно от 100 рублей на ebay или aliexpress, либо в 2-3 раза дороже в более-менее крупных магазинах радиоэлектроники. Второй вариант предпочтительнее, если Вы не хотите ждать.

Провод, соединяющий компьютер с телефоном может выглядеть по-разному, но я рекомендую купить 2.5 мм джек в магазине радиодеталей



и провода с джемперами, вроде тех, что часто используют для Arduino или Raspberry Pi.



При отсутствии вторых, можно придумать что-то свое. Ваша задача соединить выводы Tx, Rx, GND конвертера с контактами джека следующим образом:

TxD подключить к наконечнику джека
RxD подключить к среднему контакту джека
GND подключить к нижнему контакту джека.

Можно взять связку из 3-х проводов, откусить джемперы с одного конца и припаять оставшиеся провода с джемперами на одном конце к выводам джека.

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

Неочевидная проблема



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

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





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



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

Вы можете проверить надежность соединения при помощи PuTTY.
Узнать номер COM порта можно заглянув в Диспетчер устройств.



Подключаем телефон к компьютеру через USB-TTL конвертер и собранный провод, коротко нажимаем на кнопку включения и в окне PuTTY должно появиться сообщение @ftmtoolerror среди прочих символов.

То же самое можно сделать под Linux при помощи minicom.

Установка



Как и сказано в начале, я рекомендую использовать Ubuntu 14.04, именно 32-битную ее версию. Возможно у Вас получится все установить и на 64-битную Ubuntu 16.04, но тогда Вам придется самостоятельно решать все проблемы с зависимостями при установке и совместимостью с ветками проектов Osmocom.

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

Установим базовые пакеты, которые нам потребуются для сборки Osmocom.

apt-get install build-essential libtool libtalloc-dev shtool autoconf automake git-core pkg-config make gcc libpcsclite-dev


Устанавливаем библиотеку libosmocore


git clone git://git.osmocom.org/libosmocore.git
cd libosmocore/
autoreconf -i
./configure
make
make install
ldconfig -i


Устанавливаем toolchain

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


git clone https://github.com/axilirator/gnu-arm-installer.git
cd gnu-arm-installer
apt-get install libgmp3-dev libmpfr-dev libx11-6 libx11-dev flex bison libncurses5 libncurses5-dbg libncurses5-dev libncursesw5 libncursesw5-dbg libncursesw5-dev zlibc zlib1g-dev libmpfr4 libmpc-dev texinfo
./download.sh
./build.sh


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

После завершения компиляции добавьте путь к исполняемым файлам в PATH, в моем случае /root/osmocom/gnu-arm-installer/install/bin


vi /etc/bash.bashrc
add in the end
export PATH=$PATH:/root/osmocom/gnu-arm-installer/install/bin


Собираем osmocombb

Master-ветка нам участвует в запуске GSM сети, но она будет полезна, если Вы захотите поработать с другими приложениями, такими как RSSI или cell_log (см. дальше по тексту).
Если Вы хотите иметь возможность что-либо отправлять в сеть, нужно раскомментировать в src/target/firmware/Makefile строку


CFLAGS += -DCONFIG_TX_ENABLE


Собираем


git clone git://git.osmocom.org/osmocom-bb.git osmocombb
cd osmocombb/src
make


Устанавливаем пакет FFT


wget http://www.fftw.org/fftw-3.3.6-pl2.tar.gz
tar -xvzf fftw-3.3.6-pl2.tar.gz
cd fftw-3.3.6-pl2
./configure --enable-threads --enable-float
make
make install 
ldconfig


Устанавливаем библиотеку libosmo-dsp


git clone git://git.osmocom.org/libosmo-dsp.git
cd libosmo-dsp/
autoreconf -i
./configure
make
make install
ldconfig


Собираем ветку osmocombb для OsmoBTS


git clone git://git.osmocom.org/osmocom-bb.git trx
cd trx/
git checkout jolly/testing
cd src/


Нужно раскомментировать в target/firmware/Makefile строку


CFLAGS += -DCONFIG_TX_ENABLE


Компилируем


make HOST_layer23_CONFARGS=--enable-transceiver


Устанавливаем libdbi для sqlite


apt-get install sqlite3 libsqlite3-dev libsctp-dev


Скачиваем sourceforge.net/projects/libdbi/files/libdbi/libdbi-0.8.3


tar -xvzf libdbi-0.8.3.tar.gz
cd libdbi-0.8.3
autogen.sh
./configure --disable-docs
make
make install
ldconfig
cd ..


Скачиваем sourceforge.net/projects/libdbi-drivers/files/libdbi-drivers/libdbi-drivers-0.8.3


tar -xvzf libdbi-drivers-0.8.3.tar.gz
cd libdbi-drivers-0.8.3


В драйвере есть опечатка, которая приведет к ошибкам во время подключения к HLR. Исправляем перед компиляцией.


vi drivers/sqlite3/dbd_sqlite3.c


Меняем
_dbi_internal_error_handler
на
_dbd_internal_error_handler


Собираем


./autogen.sh
./configure --disable-docs --with-sqlite3 --with-sqlite3-dir=/usr/bin --with-dbi-incdir=/usr/local/include
make
make install
ldconfig


Устанавливаем ORTP


wget http://download.savannah.gnu.org/releases/linphone/ortp/sources/ortp-0.22.0.tar.gz
tar -xvf ortp-0.22.0.tar.gz
cd ortp-0.22.0/
./autogen.sh
./configure
make
make install
ldconfig


Устанавливаем библиотеку libosmo-abis


git clone git://git.osmocom.org/libosmo-abis.git
cd libosmo-abis
autoreconf -i
./configure
make
make install
ldconfig


Устанавливаем библиотеку libosmo-netif


git clone git://git.osmocom.org/libosmo-netif.git
cd libosmo-netif
autoreconf -i
./configure
make
make install
ldconfig


Устанавливаем OpenBSC


apt-get install libssl0.9.8 libssl-dev
ldconfig
git clone git://git.osmocom.org/openbsc.git
cd openbsc/openbsc/
autoreconf -i
./configure
make
make install


Устанавливаем OsmoBTS


git clone git://git.osmocom.org/osmo-bts.git
cd osmo-bts
autoreconf -i
./configure --enable-trx
make
make install


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

Я работаю с Osmocom из под root, поэтому мои файлы конфигурации находятся в /root/.osmocom


mkdir /root/.osmocom;cd /root/.osmocom
touch ~/.osmocom/osmo-bts.cfg
touch ~/.osmocom/open-bsc.cfg


Далее есть два варианта:

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


Мои конфигурационные файлы osmo-bts.cfg и open-bsc.cfg находятся в конце статьи.

Я намеренно убрал из файлов настройку (band) для GSM диапазона и ARFCN.

ARFCN — радио канал на котором будет работать ваша базовая станция.
Подходящий ARFCN можно найти при помощи программы RSSI, пакета osmocombb, либо при помощи инструмента cell_log.
Помните, что сигнал от Вашей базовой станции не должен мешать сигналам коммерческих GSM сетей. В зависимости от того, какой канал Вы будете использовать, выбираете band.

Чтобы гарантированно ограничить сигнал от своей базовой станции, Вы можете соорудить Клетку Фарадея.

Без внесения ARFCN и band в мои конфигурационные файлы, OsmoNTIB не запустится.

Запуск



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


ls -l /dev/ttyUSB*


Вы должны увидеть ttyUSB0 и ttyUSB1

Далее каждую команду нужно выполнять в отдельном терминале.

В синтаксисе osmocon у Вас могут быть отличия.
Например в вашем случае может быть compal_e86 или e87 и не c123xor, а что-то другое.

Инициализируем первый трансивер


cd /root/osmocom/trx/src
host/osmocon/osmocon -m c123xor -p /dev/ttyUSB0 -s /tmp/osmocom_l2 -c target/firmware/board/compal_e88/trx.highram.bin -r 99


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

Инициализируем второй трансивер


cd /root/osmocom/trx/src
host/osmocon/osmocon -m c123xor -p /dev/ttyUSB1 -s /tmp/osmocom_l2.2 -c target/firmware/board/compal_e88/trx.highram.bin -r 99


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

Настраиваем трансиверы на следование таймеру коммерческой BTS

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


cd /root/osmocom/trx/src/host/layer23/src/transceiver/
./transceiver -a ARFCN -2 -r 99


Запускаем MSC, HLR и СМС-центр


cd /root/.osmocom
osmo-nitb -c ~/.osmocom/open-bsc.cfg -l ~/.osmocom/hlr.sqlite3 -P -C --debug=DRLL:DCC:DMM:DRR:DRSL:DNM


Запускаем базовую станцию


cd /root/.osmocom
osmo-bts-trx --debug DRSL:DOML:DLAPDM -r 99


Все компоненты GSM сети теперь должны быть в рабочем состоянии и Вы готовы стать первым абонентом!

Тестирование



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

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

После подключения узнать свой номер можно при помощи USSD кода *#100#.

Подключиться к консоли OsmoNTIB можно так


telnet localhost 4242


Подключиться к консоли OsmoBTS можно так

telnet localhost 4241


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

Успехов!

Конфигурационные файлы



osmo-bts.cfg
!
! OsmoBTS (0.4.0.433-8913) configuration saved from vty
!!!
!
log stderr
logging filter all 1
logging color 1
logging print category 0
logging timestamp 0
logging level all everything
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp debug
logging level pcu notice
logging level ho notice
logging level trx notice
logging level loop notice
logging level abis notice
logging level rtp notice
logging level sum notice
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats notice
logging level lgsup notice
logging level loap notice
logging level lss7 notice
logging level lsccp notice
logging level lsua notice
logging level lm3ua notice
log file OsmoBTS.log
logging filter all 0
logging color 1
logging print category 0
logging timestamp 1
logging level all everything
logging level rsl info
logging level oml info
logging level rll notice
logging level rr notice
logging level meas notice
logging level pag info
logging level l1c info
logging level l1p info
logging level dsp debug
logging level pcu notice
logging level ho notice
logging level trx notice
logging level loop notice
logging level abis notice
logging level rtp notice
logging level sum notice
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats notice
logging level lgsup notice
logging level loap notice
logging level lss7 notice
logging level lsccp notice
logging level lsua notice
logging level lm3ua notice
!
line vty
no login
!
e1_input
e1_line 0 driver ipa
e1_line 0 port 0
no e1_line 0 keepalive
phy 0
osmotrx ip 127.0.0.1
osmotrx fn-advance 30
osmotrx rts-advance 5
instance 0
bts 0
band [ЗАДАТЬ GSM900 ИЛИ DCS1800]
ipa unit-id 1801 0
oml remote-ip 127.0.0.1
rtp jitter-buffer 0
paging queue-size 200
paging lifetime 0
uplink-power-target -75
min-qual-rach 50
min-qual-norm -5
ms-power-loop -65
timing-advance-loop
setbsic
trx 0
power-ramp max-initial 0 mdBm
power-ramp step-size 2000 mdB
power-ramp step-interval 1
ms-power-control dsp
phy 0 instance 0


open-bsc.cfg
!
! OpenBSC (0.15.0.763-5121) configuration saved from vty
!!!
!
log stderr
logging filter all 1
logging color 1
logging print category 0
logging timestamp 0
logging level all everything
logging level rll everything
logging level cc everything
logging level mm everything
logging level rr everything
logging level rsl everything
logging level nm everything
logging level mncc notice
logging level pag notice
logging level meas notice
logging level sccp notice
logging level msc notice
logging level mgcp notice
logging level ho notice
logging level db notice
logging level ref notice
logging level gprs debug
logging level ns info
logging level bssgp debug
logging level llc debug
logging level sndcp debug
logging level nat notice
logging level ctrl notice
logging level smpp debug
logging level filter debug
logging level ranap debug
logging level sua debug
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats notice
logging level lgsup notice
logging level loap notice
logging level lss7 notice
logging level lsccp notice
logging level lsua notice
logging level lm3ua notice
log file OsmoBSC.log
logging filter all 0
logging color 1
logging print category 0
logging timestamp 1
logging level all info
logging level rll notice
logging level cc notice
logging level mm notice
logging level rr notice
logging level rsl notice
logging level nm info
logging level mncc notice
logging level pag notice
logging level meas notice
logging level sccp notice
logging level msc notice
logging level mgcp notice
logging level ho notice
logging level db notice
logging level ref notice
logging level gprs debug
logging level ns info
logging level bssgp debug
logging level llc debug
logging level sndcp debug
logging level nat notice
logging level ctrl notice
logging level smpp debug
logging level filter debug
logging level ranap debug
logging level sua debug
logging level lglobal notice
logging level llapd notice
logging level linp notice
logging level lmux notice
logging level lmi notice
logging level lmib notice
logging level lsms notice
logging level lctrl notice
logging level lgtp notice
logging level lstats notice
logging level lgsup notice
logging level loap notice
logging level lss7 notice
logging level lsccp notice
logging level lsua notice
logging level lm3ua notice
!
stats interval 5
!
line vty
no login
!
e1_input
e1_line 0 driver ipa
e1_line 0 port 0
no e1_line 0 keepalive
network
network country code 1
mobile network code 1
short name TestNet
long name TestNet
auth policy accept-all
authorized-regexp .*
location updating reject cause 13
encryption a5 0
neci 1
paging any use tch 0
rrlp mode none
mm info 1
handover 0
handover window rxlev averaging 10
handover window rxqual averaging 1
handover window rxlev neighbor averaging 10
handover power budget interval 6
handover power budget hysteresis 3
handover maximum distance 9999
timer t3101 10
timer t3103 0
timer t3105 40
timer t3107 0
timer t3109 0
timer t3111 0
timer t3113 60
timer t3115 0
timer t3117 0
timer t3119 0
timer t3122 10
timer t3141 0
dyn_ts_allow_tch_f 0
subscriber-keep-in-ram 0
bts 0
type sysmobts
description calypso
band DCS1800
cell_identity 0
location_area_code 1
base_station_id_code 63
ms max power 30
cell reselection hysteresis 4
rxlev access min 0
periodic location update 30
radio-link-timeout 32
channel allocator ascending
rach tx integer 9
rach max transmission 7
channel-descrption attach 1
channel-descrption bs-pa-mfrms 5
channel-descrption bs-ag-blks-res 1
early-classmark-sending forbidden
ip.access unit_id 1801 0
oml ip.access stream_id 255 line 0
neighbor-list mode automatic
codec-support fr amr
amr tch-h modes 0
amr tch-h start-mode 1
gprs mode none
no force-combined-si
trx 0
rf_locked 0
arfcn [ЗАДАТЬ]
nominal power 23
max_power_red 0
rsl e1 tei 0
timeslot 0
phys_chan_config CCCH+SDCCH4
hopping enabled 0
timeslot 1
phys_chan_config TCH/H
hopping enabled 0
timeslot 2
phys_chan_config TCH/H
hopping enabled 0
timeslot 3
phys_chan_config TCH/H
hopping enabled 0
timeslot 4
phys_chan_config TCH/H
hopping enabled 0
timeslot 5
phys_chan_config TCH/H
hopping enabled 0
timeslot 6
phys_chan_config TCH/H
hopping enabled 0
timeslot 7
phys_chan_config TCH/H
hopping enabled 0
mncc-int
default-codec tch-f amr
default-codec tch-h amr
nitb
subscriber-create-on-demand
assign-tmsi
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331406/


Метки:  

Приглашаем на Science Slam Digital 7 июля

Четверг, 22 Июня 2017 г. 13:22 + в цитатник

image


Научные конференции — это нужное и важное дело, но зачастую они проходят в слишком академической атмосфере. Поэтому мы приглашаем студентов IT-специальностей, профессионалов в сфере IT и просто любителей высоких технологий на Science Slam Digital. Это сражение цифровых и технологических умов: молодые ученые и профессионалы в живой форме рассказывают о своих проектах. Только в нашем случае это будут сотрудники компании, которые расскажут о том, с какими технологиями они работают или какие создают ежедневно. То есть их задача — не просто рассказать о чём-то интересном, но и сделать это увлекательно. Победители в каждом поединке определяются аплодисментами зрителей и голосами тех, кто будет смотреть интернет-трансляцию через VK-Live. По результатам будут объявлены два победителя. Программу Science Slam Digital смотрите под катом.


19:00. Сбор гостей


19:30. Начало интернет-трансляции.


20:00. Открытие.


20:05. Выступление Дмитрия Гришина — председателя совета директоров и сооснователь Mail.Ru Group.


20:15. 1 слемер. Выступление Яна Романихина — руководителя команды машинного обучения Почты.


20:30. 2 слемер. Выступление Бориса Реброва — руководителя разработки клиентской части в группе frontend-разработки медиапроектов.


20:45. 3 слемер. Выступление Вячеслава Шебанова — старшего программиста-разработчик отдела разработки ВКонтакте.


21:00. Музыкальная пауза.


21:05. 4 слемер. Выступление Виталия Худобахшова — разработчика отдела дата-майнинга Одноклассников.


21:20. 5 слемер. Выступление Дмитрия Суконовалова — руководителя направления аналитики бюзнес-юнита Почта и Портал.


21:35. 6 слэмер. Выступление Алексея Петрова — директора по качеству в отделе тестирования Почты.


21:50. Музыкальная пауза.


21:55. Выбор и награждение двух лучших слемеров.


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


Вход свободный, количество мест ограничено, необходимо зарегистрироваться. Вход для гостей откроется в 19:00. Адрес: офис Mail.Ru Group, Ленинградский проспект, д. 39 стр. 79, 1 этаж.

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

https://habrahabr.ru/post/331422/


Метки:  

Семинар «Пустячок, а приятно: 20 мелочей, которые сделают работу в серверной по-настоящему комфортной», 4 июля, Москва

Четверг, 22 Июня 2017 г. 12:41 + в цитатник


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

О чем поговорим:
  • Маркировки и обозначения
  • Инструкции и схемы
  • Вспомогательные помещения
  • Инструменты и оборудование
  • Wi-Fi и телефония

Ведущий семинара — Кирилл Шадский, руководитель отдела управления внешними ЦОД, сертифицированный специалист Uptime Institute по эксплуатации дата-центров (AOS).

После семинара для всех участников экскурсия по дата-центру OST и вкусный ланч.

Зарегистрироваться на семинар можно по ссылке.

До встречи!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331414/


Метки:  

Как семантические технологии улучшают онлайн-образование: проект ученых Университета ИТМО

Четверг, 22 Июня 2017 г. 12:21 + в цитатник
Учиться у преподавателей Университета ИТМО можно и без поступления – достаточно записаться на массовый онлайн-курс. Такие курсы Университет выпускает не только на отечественных платформах (таких как «Открытое образование»), но и на платформе edX, которая была создана силами MIT и Гарварда в 2012 году.

Например, в прошлом году на платформе edX стартовал англоязычный курс «How to Win Coding Competitions: Secrets of Champions» (о нем мы уже рассказывали ранее: 1, 2). Однако Университет ИТМО не только создает интересные курсы, но и стремится улучшить работу самих образовательных платформ. Ученые из Университета ИТМО совместно с коллегой из Yandex LLC разработали решение, позволяющее внедрить семантические технологии в образовательный процесс на edX.

/ Фото Craig Sunter / CC

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

Команда проекта


Над проектом работали ученые международной лаборатории «Интеллектуальные методы обработки информации и семантические технологии» (Information Science and Semantic Technologies, ISST) Университета ИТМО совместно со своим коллегой из Яндекса. В России ISST – одна из передовых команд, которые занимаются вопросами семантических технологий и онтологического инжиниринга.

Задача


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


/ Структура онлайн-курса. Материал из презентации «Metadata Extraction from Open edX Online Courses Using Dynamic Mapping of NoSQL Queries» (Дмитрий Муромцев, Алексей Романов, Дмитрий Волчек, Федор Козлов)

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

Решение


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

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

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


/ Онтологическая модель (курс и пользователи). Материал из презентации «Metadata Extraction from Open edX Online Courses Using Dynamic Mapping of NoSQL Queries» (Дмитрий Муромцев, Алексей Романов, Дмитрий Волчек, Федор Козлов)

Сейчас проект находится на стадии тестирования, однако первые результаты ученые уже представили на профильной конференции Open EdX Conference 2017 (конференция прошла в мае этого года в Мадриде и собрала разработчиков, аналитиков и специалистов в области образования, работающих с платформой edX). Кроме того, по результатам исследований уже были опубликованы и научные работы (1, 2).
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331410/


Метки:  

[Из песочницы] Как создавать компактный и эффективный javascript используя RollupJS

Четверг, 22 Июня 2017 г. 12:11 + в цитатник
rollupjs
Последнее время все чаще и чаще на ряду с другими сборщиками javascript стал встречать rollupJS. И даже стал использовать его для написания модулей, используемых в основном проекте компании. Поэтому хочу поделиться с вами переводом стать об этом компактном и удобном сборщике.

Стиль — авторский.

Узнаете, об использовании Rollup как более компактную и эффективную альтернативу webpack и Browserify для объединения файлов JavaScript.

В конце этого руководства мы сконфигурируем Rollup для:

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

Предварительные требования


  • Начальные знания в JavaScript.
  • Первоначальное знакомство с модулями ES2015 также не повредит.
  • На вашем компьютере должен быть установлен npm. (У вас его нет? Установите Node.js здесь.)

Что такое Rollup?


Как описывают сами разработчики:
Rollup — это инструмент следующего поколение для пакетной обработки JavaScript-модулей. Создайте свое приложение или библиотеку с помощью модулей ES2015, затем объедините их в один файл для эффективного использования в браузерах и Node.js. Это похоже на использование Browserify и webpack. Вы можете также назвать Rollup инструментом построения, который стоит на одном ряду с такими инструментами как Grunt и Gulp. Тем не менее, важно отметить, что, хотя вы можете использовать Grunt и Gulp для решения задач пакетной обработки JavaScript, эти инструменты будут использовать подобный функционал Rollup, Browserify или webpack.

Почему вам может помочь Rollup?


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

Это происходит потому, что Rollup основан на модулях ES2015, которые являются более эффективными, чем модули CommonJS, которые используются в Browserify и webpack. Кроме того, Rollup гораздо проще удалить неиспользуемый код из модулей используя tree-shaking, что в итоге означает, что только тот код, который нам действительно нужен, будет включен в окончательный пакет.

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

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

UPDATE (2016-08-22)
Для прояснить: Rollup может использовать tree-shaking только на ES-модулях. К модулям CommonJS, которыми, на момент написания, являются как lodash, так и jQuery, не может быть применен tree-shaking. Тем не менее, tree-shaking — это одно из преимуществ Rollup на ряду с основным в виде соотношения скорость/производительность. Смотрите так же пояснение Ричарда Харриса и дополнительную информацию Нолана Лоусона.

Примечание
Частично из-за эффективности Rollup, webpack 2 будет иметь поддержку tree-shaking.

Как использовать Rollup для обработки и сборки JavaScript-файлов?


Чтобы показать, насколько эффективен Rollup, давайте рассмотрим процесс создания чрезвычайно простого проекта, который использует Rollup для сборки JavaScript.

ШАГ 0: СОЗДАНИЕ ПРОЕКТА С JAVASCRIPT И CSS.


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

Структура папки выглядит так:

learn-rollup/
+-- build/
| +-- index.html
+-- src/
| +-- scripts/
| | +-- modules/
| | | +-- mod1.js
| | | +-- mod2.js
| | +-- main.js
| +-- styles/
| +-- main.css
+-- package.json


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

# Move to the folder where you keep your dev projects.
cd /path/to/your/projects

# Clone the starter branch of the app from GitHub.
git clone -b step-0 --single-branch https://github.com/jlengstorf/learn-rollup.git

# The files are downloaded to /path/to/your/projects/learn-rollup/

Примечание
Если вы не клонируете repo, обязательно скопируйте содержимое build/index.html в свой собственный код. В этом руководстве HTML не рассматривается.

ШАГ 1: УСТАНОВКА ROLLUP И СОЗДАНИЕ ФАЙЛА КОНФИГУРАЦИИ.


Чтобы начать работу, установите Rollup с помощью следующей команды:

npm install --save-dev rollup

Затем создайте новый файл с именем rollup.config.js в папке learn-rollup. В него добавьте следующее.

export default {
  entry: 'src/scripts/main.js',
  dest: 'build/js/main.min.js',
  format: 'iife',
  sourceMap: 'inline',
};

Давайте поговорим о каждой опции данной конфигурации:

  • Entry — это файл, который мы хотим, чтобы Rollup обрабатывал. В большинстве приложений это будет основной JavaScript-файл, который инициализирует все и является точкой входа.
  • Dest — это место, где будут сохранены обработанные скрипты.
  • Format — Rollup поддерживает несколько форматов вывода. Поскольку мы работаем в браузере, мы хотим использовать немедленно вызываемые функции (IIFE)

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

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

Примечание
Для более подробной информации по опции format, см. Rollup's Wiki.

ПРОВЕРКА КОНФИГУРАЦИИ ROLLUP

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

./node_modules/.bin/rollup -c

Это создаст новую папку под названием build в вашем проекте с подпапкой js, которая будет содержать наш сгенерированный файл main.min.js.

Мы увидим, что пакет был создан правильно, открыв build/index.html в нашем браузере:

image

Примечание
На этом этапе только современные браузеры будут работать без ошибок. Чтобы этот код работал со старыми браузерами, которые не поддерживают ES2015 / ES6, нам нужно добавить некоторые плагины.

РАЗБИРАЕМ СГЕНЕРИРОВАННЫЙ ПАКЕТ

Использование tree-shaking делает Rollup мощным инструментом, и благодаря чему в выходном файле нет неиспользованного кода из модулей, на которые мы ссылаемся. Например, в src/scripts/modules/mod1.js есть функция sayGoodbyeTo (), которая не используется в нашем приложении — и поскольку она никогда не используется, Rollup не включает ее в итоговый пакет:

Код

(function () {
'use strict';

/**
 * Says hello.
 * @param  {String} name a name
 * @return {String}      a greeting for `name`
 */
function sayHelloTo( name ) {
  const toSay = `Hello, ${name}!`;

  return toSay;
}

/**
 * Adds all the values in an array.
 * @param  {Array} arr an array of numbers
 * @return {Number}    the sum of all the array values
 */
const addArray = arr => {
  const result = arr.reduce((a, b) => a + b, 0);

  return result;
};

// Import a couple modules for testing.
// Run some functions from our imported modules.
const result1 = sayHelloTo('Jason');
const result2 = addArray([1, 2, 3, 4]);

// Print the results on the page.
const printTarget = document.getElementsByClassName('debug__output')[0];

printTarget.innerText = `sayHelloTo('Jason') => ${result1}\n\n`
printTarget.innerText += `addArray([1, 2, 3, 4]) => ${result2}`;

}());
//# sourceMappingURL=data:application/json;charset=utf-8;base64,...


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

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

Сноска
Однако важно помнить, что, когда мы имеем дело с таким небольшим тестовыми приложениями, удвоение размера файла не занимает много времени. Для сравнения на данный момент этот размер составляет ~ 3KB против ~ 8KB

ШАГ 2: УСТАНОВИТЕ BABEL, ЧТО БЫ ИСПОЛЬЗОВАТЬ НОВЫЕ ВОЗМОЖНОСТИ JAVASCRIPT СЕЙЧАС


На данный момент у нас есть код, который будет работать только в современных браузерах, и не будет работать в некоторых браузерах, версия которых отстает на несколько версий — и это не идеально.

К счастью, Babel может нам помочь. Этот проект позволяет трансплировать новые возможности JavaScript (ES6/ES2015 и т.д.) в ES5, и данный код будет работать практически в любом браузере, который все еще может использоваться сегодня.

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

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

УСТАНОВКА НЕОБХОДИМЫХ МОДУЛЕЙ

Сперва, нам нужно установить плагин Babel Rollup и соответствующие Babel-пресеты.

# Install Rollup’s Babel plugin.
npm install --save-dev rollup-plugin-babel

# Install the Babel preset for transpiling ES2015.
npm install --save-dev babel-preset-es2015

# Install Babel’s external helpers for module support.
npm install --save-dev babel-plugin-external-helpers

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

СОЗДАНИЕ .babelrc.

Затем создайте новый файл с именем .babelrc в корневом каталоге проекта (learn-rollup/). Внутри добавьте следующий JSON:

{
  "presets": [
    [
      "es2015",
      {
        "modules": false
      }
    ]
  ],
  "plugins": [
    "external-helpers"
  ]
}

Это сообщает Babel, какой пресет он должен использовать во время трансплирования.

Примечание
В более ранних версиях npm (2.15.11) вы можете увидеть ошибку с пресетом es2015-rollup. Если вы не можете обновить npm, см. эту проблему для альтернативной конфигурации .babelrc.

UPDATE (2016-11-13)
В видео .babelrc использует устаревшую конфигурацию. См. этот pull request для изменения конфигурации, и этот для изменений в package.json.

ОБНОВЛЕНИЕ rollup.config.js.

Чтобы добавить Babel к Rollup, нужно обновить rollup.config.js. Внутри мы импортируем плагин Babel, а затем добавляем его в новое свойство конфигурации, называемое plugins, которое будет содержать массив плагинов.


// Rollup plugins
import babel from 'rollup-plugin-babel';

export default {
  entry: 'src/scripts/main.js',
  dest: 'build/js/main.min.js',
  format: 'iife',
  sourceMap: 'inline',
  plugins: [
    babel({
      exclude: 'node_modules/**',
    }),
  ],
};

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

ПРОВЕРКА ВЫХОДНОГО ПАКЕТА

Со всем установленным и настроенным, мы можем сделать ребилд пакета:

./node_modules/.bin/rollup -c

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


var addArray = function addArray(arr) {
  var result = arr.reduce(function (a, b) {
    return a + b;
  }, 0);

  return result;
};

Посмотрите, как Babel преобразовал «жирную» стрелку для функции (arr.reduce ((a, b) => a + b, 0)) в обычную функцию.

Это транспиляция в действии: результат тот же, но код теперь поддерживается в IE9.

Важно
Babel также предлагает babel-polyfill, что делает вещи вроде Array.prototype.reduce () доступными в IE8 и более раних версиях.

ШАГ 3: ДОБАВЛЕНИЕ ESLINT ДЛЯ ПРОВЕРКИ JAVASCRIPT НА ОШИБКА


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

Для этого проекта мы будем использовать ESLint.

УСТАНОВКА МОДУЛЯ

Чтобы использовать ESLint, нам необходимо установить плагин ESLint Rollup:

npm install --save-dev rollup-plugin-eslint

ГЕНЕРИРОВАНИЕ .eslintrc.json.

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

Терминал

$ ./node_modules/.bin/eslint --init
? How would you like to configure ESLint? Answer questions about your style
? Are you using ECMAScript 6 features? Yes
? Are you using ES6 modules? Yes
? Where will your code run? Browser
? Do you use CommonJS? No
? Do you use JSX? No
? What style of indentation do you use? Spaces
? What quotes do you use for strings? Single
? What line endings do you use? Unix
? Do you require semicolons? Yes
? What format do you want your config file to be in? JSON
Successfully created .eslintrc.json file in /Users/jlengstorf/dev/code.lengstorf.com/projects/learn-rollup


Если вы ответите на вопросы, как показано выше, вы получите следующий результат в .eslintrc.json:

.eslintrc.json
{
  "env": {
    "browser": true,
    "es6": true
  },
  "extends": "eslint:recommended",
  "parserOptions": {
    "sourceType": "module"
  },
  "rules": {
    "indent": [
      "error",
      4
    ],
    "linebreak-style": [
      "error",
      "unix"
    ],
    "quotes": [
      "error",
      "single"
    ],
    "semi": [
      "error",
      "always"
    ]
  }
}


TWEAK .eslintrc.json

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

  1. Мы используем 2 пробела вместо 4.
  2. Позднее мы будем использовать глобальную переменную, названную ENV, поэтому нам нужно занести ее в белый список.

Внесите следующие изменения в свою настройку .eslintrc.json — свойство globals и настройку свойства indent:

.eslintrc.json
{
  "env": {
    "browser": true,
    "es6": true
  },
  "globals": {
    "ENV": true
  },
  "extends": "eslint:recommended",
  "parserOptions": {
    "sourceType": "module"
  },
  "rules": {
    "indent": [
      "error",
      2
    ],
    "linebreak-style": [
      "error",
      "unix"
    ],
    "quotes": [
      "error",
      "single"
    ],
    "semi": [
      "error",
      "always"
    ]
  }
}


ОБНОВЛЕНИЕ rollup.config.js

Затем импортируйте плагин ESLint и добавьте его в конфигурацию Rollup:


// Rollup plugins
import babel from 'rollup-plugin-babel';
import eslint from 'rollup-plugin-eslint';

export default {
  entry: 'src/scripts/main.js',
  dest: 'build/js/main.min.js',
  format: 'iife',
  sourceMap: 'inline',
  plugins: [
    eslint({
      exclude: [
        'src/styles/**',
      ]
    }),
    babel({
      exclude: 'node_modules/**',
    }),
  ],
};

ПРОВЕРКА РЕЗУЛЬТАТОВ В КОНСОЛИ

Когда мы запускаем ./node_modules/.bin/rollup -c, похоже, ничего не происходит. Дело в том, что код приложения в его нынешнем виде проходит linter без проблем.

Но если мы введем проблему, например удаление точки с запятой, мы увидим, как ESLint помогает:


$ ./node_modules/.bin/rollup -c

/Users/jlengstorf/dev/code.lengstorf.com/projects/learn-rollup/src/scripts/main.js
  12:64  error  Missing semicolon  semi

 1 problem (1 error, 0 warnings)

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

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

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

ШАГ 4: ДОБАВЛЕНИЕ ПЛАГИНА ДЛЯ ОБРАБОТКИ НЕ ES-МОДУЛЕЙ


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

ДОБАВЛЕНИЕ NODE-МОДУЛЕЙ КАК ЗАВИСИМОСТИ

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

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


npm install --save debug

Примечание
Поскольку это будет указано в основном проекте, важно использовать --save, что позволит избежать ошибки в продакшене, где devDependencies будет игнорирована.

Затем, внутри src/scripts/main.js, давайте добавим простой логинг:

main.js

// Import a couple modules for testing.
import { sayHelloTo } from './modules/mod1';
import addArray from './modules/mod2';

// Import a logger for easier debugging.
import debug from 'debug';
const log = debug('app:log');

// Enable the logger.
debug.enable('*');
log('Logging is enabled!');

// Run some functions from our imported modules.
const result1 = sayHelloTo('Jason');
const result2 = addArray([1, 2, 3, 4]);

// Print the results on the page.
const printTarget = document.getElementsByClassName('debug__output')[0];

printTarget.innerText = `sayHelloTo('Jason') => ${result1}\n\n`;
printTarget.innerText += `addArray([1, 2, 3, 4]) => ${result2}`;


При запуске rollup, мы получаем предупреждение:


$ ./node_modules/.bin/rollup -c
Treating 'debug' as external dependency
No name was provided for external module 'debug' in options.globals – guessing 'debug'

И если мы снова запустим наш index.html, мы увидим, что в консоли ошибка ReferenceError:

image

Вот, дрянь. Это не сработало.

Это происходит из-за того, что в узловых Node-модулях используется CommonJS, который несовместим с Rollup. Чтобы решить эту проблему, нам нужно добавить пару плагинов для обработки зависимостей Node и модулей CommonJS.

УСТАНОВКА ЭТИХ МОДУЛЕЙ

Чтобы обойти эту проблему, нам нужно добавить два плагина:

  1. rollup-plugin-node-resolve, что позволяет загружать сторонние модули из node_modules.
  2. rollup-plugin-commonjs, который обеспечивает поддержку подключения CommonJS-модулей.

Установите оба плагина с помощью следующей команды:

npm install --save-dev rollup-plugin-node-resolve rollup-plugin-commonjs

ОБНОВЛЕНИЕ rollup.config.js

Затем импортируйте его в конфигурацию Rollup:

rollup.config.js

// Rollup plugins
import babel from 'rollup-plugin-babel';
import eslint from 'rollup-plugin-eslint';
import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';

export default {
  entry: 'src/scripts/main.js',
  dest: 'build/js/main.min.js',
  format: 'iife',
  sourceMap: 'inline',
  plugins: [
    resolve({
      jsnext: true,
      main: true,
      browser: true,
    }),
    commonjs(),
    eslint({
      exclude: [
        'src/styles/**',
      ]
    }),
    babel({
      exclude: 'node_modules/**',
    }),
  ],
};


Примечание
Свойство jsnext обеспечивает простое мигрирование ES2015-модулей для Node-пакетов. Свойства main и browser помогают плагину решать, какие файлы следует использовать для пакета.

ПРОВЕРКА РЕЗУЛЬТАТОВ В КОНСОЛИ

Выполним ребилд командой ./node_modules/.bin/rollup -c, затем снова проверьте браузер, чтобы увидеть результат:

image

ШАГ 5: ДОБАВЛЕНИЕ ПЛАГИНА, ОБЕСПЕЧИВАЮЩЕГО ЗАМЕНУ ПЕРЕМЕННОЙ ОКРУЖЕНИЯ


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

Поэтому давайте убедимся, что Rollup позволит нам использовать их.

ДОБАВЛЕНИЕ УСЛОВИЙ ДЛЯ ENV В main.js

Давайте воспользуемся переменной окружения и включим логирования только в том случае, если мы не в продакшен режиме. В src/scripts/main.js, изменим способ инициализации нашего log():


// Import a logger for easier debugging.
import debug from 'debug';
const log = debug('app:log');

// The logger should only be disabled if we’re not in production.
if (ENV !== 'production') {

  // Enable the logger.
  debug.enable('*');
  log('Logging is enabled!');
} else {
  debug.disable();
}

Однако после того, как мы ребилдим наш проект (./node_modules/.bin/rollup -c) и посмотрим браузер, мы увидим, что это дает нам ReferenceError для ENV.

Это не должно удивлять, потому что мы не определили его нигде. Но если мы попробуем что-то вроде ENV = production ./node_modules/.bin/rollup -c, он все равно не сработает. Это связано с тем, что установка переменной среды таким образом делает ее доступной только для Rollup, а не к пакету, созданному с помощью Rollup.

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

УСТАНОВКА ЭТИХ МОДУЛЕЙ

Начните с установки rollup-plugin-replace, которая по существу является просто утилитой find-and-replace. Он может делать много вещей, но для наших целей мы просто найдем появление переменной среды и заменим ее фактическим значением (например, все вхождения ENV будут заменены на «production» в сборке).

npm install --save-dev rollup-plugin-replace

ОБНОВЛЕНИЕ rollup.config.js


Давайте в rollup.config.js импортируем его и добавим в наш список плагинов.

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

rollup.config.js

// Rollup plugins
import babel from 'rollup-plugin-babel';
import eslint from 'rollup-plugin-eslint';
import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';
import replace from 'rollup-plugin-replace';

export default {
  entry: 'src/scripts/main.js',
  dest: 'build/js/main.min.js',
  format: 'iife',
  sourceMap: 'inline',
  plugins: [
    resolve({
      jsnext: true,
      main: true,
      browser: true,
    }),
    commonjs(),
    eslint({
      exclude: [
        'src/styles/**',
      ]
    }),
    babel({
      exclude: 'node_modules/**',
    }),
    replace({
      exclude: 'node_modules/**',
      ENV: JSON.stringify(process.env.NODE_ENV || 'development'),
    }),
  ],
};


В нашей конфигурации мы описываем ENV как process.env.NODE_ENV — обычный способ установки переменных окружения в приложениях Node — либо «development». Мы используем JSON.stringify (), чтобы получить значение, заключенное в двойные кавычки.

Чтобы исключить проблемы со сторонним кодом, мы также устанавливаем свойство exclude для игнорирования нашего каталога node_modules и всех пакетов, которые он содержит. (Благодарность @wesleycoder по этому вопросу).

ПРОВЕРИМ РЕЗУЛЬТАТЫ

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

NODE_ENV=production ./node_modules/.bin/rollup -c

Примечание
В Windows используйте SET NODE_ENV = production ./node_modules/.bin/rollup -c, чтобы избежать ошибок при работе с переменными среды. Если у вас есть проблемы с этой командой, см. эту проблему для получения дополнительной информации.

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

image

ШАГ 6: ДОБАВЛЕНИЕ UGLIFYJS, ДЛЯ СЖАТИЯ И МИНИФИЦИРОВАНИЯ СГЕНЕРИРОВАННОГО СКРИПТА


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

УСТАНОВКА ПЛАГИНА

Мы будем использовать UglifyJS для сжатия пакета, с помощью rollup-plugin-uglify.
Установим его следующей командой:

npm install --save-dev rollup-plugin-uglify

ОБНОВЛЕНИЕ rollup.config.js

Теперь давайте добавим Uglify в нашу конфигурацию Rollup. Для удобства отладки в процессе разработки, давайте сделаем uglification только для продакшен режима:

rollup.config.js

// Rollup plugins
import babel from 'rollup-plugin-babel';
import eslint from 'rollup-plugin-eslint';
import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';
import replace from 'rollup-plugin-replace';
import uglify from 'rollup-plugin-uglify';

export default {
  entry: 'src/scripts/main.js',
  dest: 'build/js/main.min.js',
  format: 'iife',
  sourceMap: 'inline',
  plugins: [
    resolve({
      jsnext: true,
      main: true,
      browser: true,
    }),
    commonjs(),
    eslint({
      exclude: [
        'src/styles/**',
      ]
    }),
    babel({
      exclude: 'node_modules/**',
    }),
    replace({
      ENV: JSON.stringify(process.env.NODE_ENV || 'development'),
    }),
    (process.env.NODE_ENV === 'production' && uglify()),
  ],
};


В нашем случае мы загружаем uglify (), когда NODE_ENV имеет значение «production».

ПРОВЕРКА МИНИФИЦИРОВАННОЙ СБОРКИ

Сохраните конфигурацию, и запустите Rollup в продакшен режиме:

NODE_ENV=production ./node_modules/.bin/rollup -c

Содержимое выходного файла имеет не очень красивый вид, но зато он намного меньше. Вот скриншот того, как сейчас выглядит build/js/main.min.js:

image

Раньше наш пакет составлял ~ 42 КБ. После прогона его через UglifyJS, его размер снизился до ~ 29 КБ — мы просто сохранили более 30% на размере файла без дополнительных усилий.

-> Источник

Личное впечатление:

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

https://habrahabr.ru/post/331412/


Метки:  

Как внедрить процессы управления конфигурацией

Четверг, 22 Июня 2017 г. 12:07 + в цитатник
Правильная реализация процессов управления конфигурацией позволяет не только решать проблемы путем идентификации причины «поломки» (какой элемент вышел из строя, и как его «починить»), но и полностью предотвращать их возникновение за счет оценки логики работы с данными. Грамотная оценка производимых изменений позволяет поддерживать системы в работоспособном состоянии, а неправильная — приводит к пустой трате денежных средств. Поэтому сегодня мы расскажем, о внедрении процессов управления конфигурацией и на какие аспекты следует обратить пристальное внимание.

Изображение Kenny Louie CC

С чего начать


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

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


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

Составление плана


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

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


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

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

При планировании важно учитывать такие мелкие детали, как, скажем, описание способа формирования имен конфигурационных единиц. Имя для каждой CMDB должно быть уникально и содержать ключевую информацию для идентификации. Например, обозначение MSserver-Moscow-Level3 говорит оператору сервисного центра, что Windows Server на московской площадке недоступен и нуждается в технической поддержке третьей группой. Такой уровень информации при регистрации инцидента позволяет сразу предупредить всех пользователей сервера о проблеме и назначить тикет ответственной группе специалистов.

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

Определение исходного состояния


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

Как только исходное состояние определено, следует убедиться, что ему соответствуют соглашения об уровне услуг (SLAs), операционные соглашения (OLAs), внешние договоры (UCs), связанные с IT-инфраструктурой и сервисами организации.

Определение исходного состояния стоит начинать с какого-либо одного сервиса, расписав все его компоненты. При этом полученная информация должна заноситься в базу данных ITSM-платформы, например ServiceNow, или простую базу данных CMDB — это может быть таблица в Excel или Access.



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



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

Контроль


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

  • Тесно сотрудничать с работниками, осуществляющими контроль изменений, дабы работа управления конфигурациями следовала корпоративным политикам об изменениях. Без контроля изменений CMS/CMDB быстро устареет.
  • Конфигурационные единицы, участвующие в процессе оказания услуги, должны быть с ней связаны. Это даст пользователю возможность быстро выбрать требуемый сервис. В этом случае все CI добавятся автоматически.
  • ИТ-специалисты, отвечающие за систему управления конфигурацией, должны участвовать в консультативных советах по изменениям (CAB), чтобы отображать в CMS и CMDB производимые с инфраструктурой изменения. При этом все вносимые изменения должны проверяться, перед закрытием тикета как успешного.

Учет состояния


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

Аудит


Заключительный этап внедрения CMS называется проверка и аудит. Его задача — гарантировать достоверность данных, представленных в CMDB: все рабочие CI должны соответствовать тому, что указано в CMS/CMDB, а документация поддержки должна точно описывать все CI. Чтобы удовлетворить эти требования, важно составить и утвердить план проверок, содержащий ответы на следующие вопросы:

  • Имеются ли специальные инструменты для проведения проверок?
  • Требуется ли физическая проверка?
  • Каковы нормативные требования?
  • Есть ли сертификация по стандарту ISO 20000 и должны ли выполняться IL3, BASEL 3 или NGN224, требующие вмешательства третьей стороны?

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

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

P.S. Другие материалы из нашего блога «ИТ-Гильдия»:


P.P.S. И пара материалов из нашего блога на Хабре:

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

https://habrahabr.ru/post/331372/


Метки:  

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

Четверг, 22 Июня 2017 г. 12:03 + в цитатник
Одним из преимуществ строковых шаблонизаторов таких как JUST.js, jqueryTmpl или handlebarsjs перед шаблонизаторами на основе виртуального DOM дерева (VUE.js, angular) это низкий порог вхождения и простота в использовании. Ещё как мне кажется со строковыми шаблонизаторами проще интегрировать плагины для jquery.
Однако возможность реактивного связывания данных модели с шаблоном действительно удобный инструмент, и после того как я пробовал VUE.js и angular мне стало очень не хватать этого в моём любимом шаблонизаторе JUST.JS.
В итоге я решил добавить одностороннее реактивное связывание данных в JUST.JS, а в итоге получилось решение которое можно использовать практически с любым строковым шаблонизатором.

Начнём с простого примера



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

Библиотека justReactive добавляет следующие методы для Object каждый из которых предназначен для вставки отслеживаемого значения в разные места html кода.
  • justHtml — отображение текста или html кода из переменной без какой либо фильтрации
  • justText — отображение текста из переменной как текста, с преобразованием html сущностей в текст
  • justClass — подставляет класс если значение отслеживаемой переменой не false
  • justNotClass — подставляет класс если значение отслеживаемой переменой false
  • justClassName — подставляет как класс само значение отслеживаемой переменой
  • justAttr — подставляет и обновляет атрибут у элемента


Принцип действия


Следующий вызов
model.justText('time')

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

Так на пример justText вернёт следующий html код
1498115282970

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

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

Ещё пример использования


Этот пример основан на предыдущем. Здесь мы добавили отслеживание ещё переменной model.class для изменения класса элемента и переменной model.hide для скрытия ещё одного элемента.


Недостатки подходя


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

var model = {};
model.key1 = 1;

$("#time1").html(model.justText('key1'))
model = {key1:2};

В данном примере значение в dom дереве не будет обновлено так как присваивание в model = {key1:2}; фактически сначала удалило отслеживаемый нами model.key1, а потом создало новый объект model с таким же, но не тем же самым ключом key1.

Циклы и блоки шаблонов


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

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


Но такое хоть и работает но всё же не очень удобно. Я лично для себя сделал форк шаблонизатора just.js и добавил в него ряд дополнительных возможностей попутно вырезав то что мне казалось в нём лишнем.
Получившийся модифицированый шаблонизатор я назвал just-template

В него я добавил конструкцию для отслеживания переменных модели которая сразу перестраивает вложенный в неё блок шаблона. При этом через замыкание доступны все переменные переданные при построении шаблона в первый раз.
<~ this.data.itemslist> 
  
       
  • -
  • <~>

    Добавил фильтрацию данных:
     - с фильтрацией
      - без фильтрации
    

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

    Финальный пример с массивом и циклами и шаблоном.


    Ссылки


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

    https://habrahabr.ru/post/331400/


    Метки:  

    Сайт бухгалтерских услуг – боль клиента

    Четверг, 22 Июня 2017 г. 11:00 + в цитатник
    Навеяно статьей на Хабре «бухгалтерские тонкости для технологического (и другого) бизнеса». Один из посылов статьи: «Это что-то очень скучное и очень страшное.»

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

    По второй задаче я несколько раз пытался добиться от бухгалтера ответа на вопрос: какую сумму мне нужно заложить в стоимость контракта (например, на разработку сайта), чтобы хватило на отчисления УСН 6%? С учетом того, что разброс числа контрактов и их стоимостей могут в течение года меняться.

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

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

    То же должно быть и с бухгалтерией. Консультации о минимизации издержек должны быть! Вернемся к сайтам компаний бухгалтерских услуг.

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

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

    Например:
    • Для наших существующих клиентов в некоторых случаях специалисты смогли уменьшить сумму налогов на 15% белыми методами;
    • При подсчете общей сэкономленной суммы у нас получилось около 10 000 000 за 3 года работы;
    • Пробный период первый месяц — берется 50% от полной стоимости обслуживания;
    • Проверка бухучета предыдущего исполнителя — бесплатно за текущий год;
    • Мы сами общаемся с налоговой, внебюджетными фондами и «берем удар на себя», чтобы наши подопечные занимались своим делом, а не бумажной волокитой;
    • Прозрачное ценообразование и понятные тарифные планы, где учитывается число обрабатываемых документов;
    • Выполнение срочных работ для новых клиентов;
    • И наконец, калькулятор расчета УСН.


    Про калькулятор имеет смысл сказать отдельно. В выдаче масса сайтов по запросу «калькулятор усн».

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


    То, что подошло мне, я нашел тут.


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

    Иногда достаточно побыть в «шкуре» клиента и дать ему то, что он хочет в простом виде.

    А вы развиваете свои знания в смежных профессиях для работы с клиентами?
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/331402/


    Метки:  

    Что было в прошлом году: №1 по ИТ-услугам в стране, 2000+ проектов, много инженерных историй

    Четверг, 22 Июня 2017 г. 11:00 + в цитатник


    С новым годом вас, друзья! Дело в том, что итоги 2016 года мы традиционно подводим в апреле, когда всё посчитано до мелочей и сдана годовая отчётность. А сейчас, на старте отпусков, появилась возможность ещё раз оглянуться назад и рассказать не о результатах, а, скорее, о тенденциях из наблюдений наших экспертов. Так уж получилось, что со скромной позиции интегратора №1 среди поставщиков ИТ-услуг в стране (по рейтингу PA Consulting group). На конец 16 года у нас было 2174 человека в штате, и мы сделали более 2000 проектов на 28,5 миллиардов рублей. Мы видим если и не всю ИКТ-картину в стране, то основную её часть точно.

    Поехали!

    Итак, как это ни странно, в прошлом году снизилась напряжённость борьбы со спамом. Доля спама в почтовом трафике в прошлом году значительно упала, в частности, по данным компании Symantec, его показатели сравнимы с уровнем 2003 года. Точнее, спам стал умнее, фишинговые письма стали частью направленных APT-атак, особенно на банки. Им массово присылают крутой RTF, который создаёт не менее крутой exe-файл, а дальше уже ставится всё остальное нужное из payload.

    Из важного — везде чувствуется переход на отечественные решения.

    В сфере ИБ этот переход ощущается особенно остро. Помимо этого, в центре внимания оказалась и защита стратегически важных промышленных объектов и их автоматизированных систем управления технологическими процессами (АСУ ТП). В частности, об этом говорится в версии новой Доктрины информационной безопасности. Угрозы воздействия на критическую информационную инфраструктуру РФ и предприятий оборонно-промышленного комплекса, — одни из самых актуальных на глобальном уровне. Также видна тенденция перехода к комплексному подходу в области ИБ (возможно, только по нашей практике). Заказчики стремятся не просто устранить проблему, а действовать в рамках единой концепции, которая составляется по итогам аудита ИТ-инфраструктуры и бизнес-процессов. Для минимизации угроз направленных атак используется комплексный мониторинг сетевых и ИТ-ресурсов, отслеживание поведения пользователей.

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

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

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

    В каком-то смысле перевернулась сфера электронного документооборота. Стало понятно, что к пользователю надо стать лицом. Коммерческие компании постепенно переходят на среды совместной работы и хранения документов, подобные соцсетям. У себя мы уже несколько лет используем корпоративную соцсеть, которая заменяет нам довольно много внутренних сервисов: внутрикорпоративный портал, базу знаний, специализированные системы управления контентом, медиапортал. Также снята старая проблема согласования документов с мобильных устройств — появились средства, которые позволяют шифровать данные на мобильных девайсах либо хранить ключ электронной подписи на специальном устройстве, которое можно подключать к смартфону или планшету безопасным образом. Ещё один из трендов рынка СЭД — наличие возможностей case-менеджмента в системе, то есть одновременно хранение регламентов и работу по ним. Нотация BPMN (Business Process Model and Notation) уже практически де-факто поддерживается разными платформами, в особенности новыми системами. Что касается CMMN (Case Management Model and Notation), то пока такой широты распространения он не получил, но потихоньку проникает в системы практически наравне с DMN (Decision Management Notation).

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

    С точки зрения импортозамещения в области ПО — полная радуга. В 2016 году появился Единый реестр отечественного ПО, начал действовать ФЗ-188 о преференциях российским производителям ПО. Конечно, импортозамещение могло привести к потере иностранными компаниями определённой доли российского рынка, но пока больших потерь это не повлекло. Однако разработчики промышленных версий конкурентоспособных продуктов получили некоторые преимущества — это, в частности, 1С, Ред Софт, Касперский и Positive technologies, «облачные» продукты, инфраструктурные решения для создания облачных сервисов, например, на базе OpenStack, а также офисные приложения МойОфис.

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

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

    Программно-определяемые сети. Развивается практика постепенной адаптации SDN и стратегического планирования полной виртуализации ИКТ-инфраструктуры. Внимание к тематике SDN приковано огромное, и рынок продолжает расти. Ведущие аналитические агентства дают очень оптимистичные оценки: Gartner уже который год включает SDN в TOP10 технологических трендов отрасли, а IDC и Infonetics Reseach оценивают потенциал рынка SDN/NFV к 2018 году на уровне $8-11 млрд с ежегодным ростом порядка 90%. Игроки рынка рассматривают SDN как способ экономии и повышения рентабельности сервисов. Аналитики Infonetics Research уверены, что расходы на содержание телекоммуникационной инфраструктуры могут снизиться на 48% в год, а капитальные затраты — даже больше, чем на 50%. Суть программно-определяемой сети — в возможности централизованного управления сетевым оборудованием, где специальный SDN-контроллер выполняет функцию «мозга». Это требует меньшего количества обслуживающих специалистов и даёт возможность на 20–30% эффективнее распределять нагрузку на ресурсы между разными участками сети. Говоря другими словами, выгоды от внедрения SDN на сегодня очевидны, но пока по сложности это напоминает матанализ. Для упрощения внедрений мы открыли лабораторию SDN-решений, где можно всё попробовать и поиграть.

    Монетизация ИТ-решений. Любой многолюдный объект типа стадиона, гостиницы, торгового центра или аэропорта можно превратить в источник дополнительного дохода от рекламы. Ну, или вещать что-то другое полезное фанатам-покупателям-пассажирам. Или студентам — в МГТУ имени Н. Э. Баумана мы поставили систему Digital Signage.

    С учётом того, что 60% покупателей активно пользуются мобильными сервисами, логично предположить, что Wi-Fi в самое ближайшее время возьмёт на себя функцию объединяющей платформы, которая позволит эффективно привлекать клиентов. Есть, например, решение по Wi-Fi-аналитике поведения клиентов на базе Cisco Connected Mobile Experiences (CMX). Оно отслеживает все Wi-Fi-сигналы в режиме реального времени, собирает и объединяет информацию о расположении мобильных устройств и поведении пользователей в сети, включая демографические данные из социальных сетей. Решение отслеживает перемещение потоков посетителей и в режиме реального времени создаёт тепловые карты, определяя, таким образом, наиболее посещаемые участки и маршруты движения. Кроме того, подключённым к Wi-Fi пользователям можно предлагать на устройства специализированный контент, получая дополнительный доход от рекламы. В общем, если вы не заплатили за Wi-Fi — вы товар. И вас посчитают!

    У операторов связи появился высокий интерес к модели Revenue Sharing. Идея в том, что оператору нет необходимости для каждой услуги создавать собственную инфраструктуру, этим занимается разработчик или интегратор. Задача провайдера — обеспечить доставку сервиса до потребителя («транспорт») и sale-канал (канал продажи). После того как услуга будет запущена и предложена потребителям, оператор и его технологический партнёр получают проценты от сгенерированной дополнительной выручки. Как показывает наш опыт, модель Revenue Sharing становится всё более востребованной, независимо от сферы, в которой она применяется. В случае сотовых операторов у нас уже есть хороший опыт в 10 странах.

    По направлениям


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

    Софт


    Парни из ДИТ делают всё то, что нельзя кинуть в стену. Например, модернизируют ИТ-подсистемы судов в России (пример), расслаивают «пьяные» базы данных, распознают лица и котов. 518 проектов за год, из них 119 — выше 10 миллионов рублей.

    Кроме упомянутых проектов стоит отметить и внедрение 1С в Хруничеве, и как внедрили систему IAM в DPD в России, и консалтинговый проект — внедрение системы KPI в Русском свете. Самый запоминающийся проект года, конечно, как искали кота-терминатора на складе с помощью видеоохоты и как отличали тележку от прораба. Сделали портал + киоски для решения кадровых задач в Фосагро. Наиболее успешный и масштабный проект этого года — создание единого информационного пространства, обеспечивающего эффективное взаимодействие сотен ведомств из разных стран в рамках деятельности крупной международной организации. Его цель — упрощение операций и процедур, которые начинаются на территории одного государства, а заканчиваются на территории другого. Про это тоже пока рассказывать детально нельзя по NDA.

    Телекоммуникации


    Подразделение ДТК — это связисты и сетевики. С их точки зрения, любая среда, если её грамотно «построить», пригодна для того, чтобы без задержек передавать пакеты по сети. В 2016 году у ДТК было более 400 проектов, есть очень интересные и комплексные. Так, например, наши инженеры продолжили модернизировать контактный центр Tele2. Кстати, этому КЦ уже исполнилось 10 лет. Всё это время мы оказываем круглосуточную техподдержку. Модернизировали КЦ ВТБ24, там появился умный IVR. Почти как чат-бот, только автоответчик. В банке «Нейва» мы создали полнофункциональный контактный центр: по их оценке, эффективность работы операторов увеличилась на 20%. Интересный проект был с «Аэроэкспрессом», где мы модернизировали сеть передачи данных без остановки бизнес-процессов. Раньше не было разделения на слои сети, и была зависимость от провайдеров. Теперь всё куда как лучше, плюс появилась p2p-телефония.

    Для Евразийской экономической комиссии (ЕЭК) реализовали комплекс, позволяющий проводить видеоконференции с большим количеством участников из разных стран, совместно с ними работать над документами и осуществлять эффективное управление совещаниями. Большая работа, 10 полноценных подсистем.

    В октябре завершили проект по созданию ИТ-инфраструктуры ФК «Краснодар», про это будет отдельно позже. Совместно с коллегами из департамента интеллектуальных зданий (ДИЗ) спроектировали и реализовали на стадионе 45 слаботочных систем, включая системы безопасности, телетрансляции, телекоммуникаций, мультимедиа, а также системы автоматизации и диспетчеризации инженерных систем. Отмечу, что ФК «Краснодар» — единственный в России стадион, оснащённый высокоскоростным High Density Wi-Fi. Обычно из-за большого количества болельщиков, одновременно находящихся на матче, стадионы технологически не могут предоставить качественную сотовую связь и беспроводной интернет. Применённое нами решение позволило обеспечить 100-процентное покрытие чаши стадиона. Благодаря HD Wi-Fi болельщики смогут всегда оставаться на связи и делиться спортивным контентом в социальных сетях непосредственно в ходе матча. Созданное мобильное приложение футбольного клуба позволит просматривать лучшие моменты в режиме «сразу после гола», комментировать игру, видеть состав и расстановку команд, участвовать в конкурсах, получать новости и оповещения.

    Инженерный фарш зданий


    Проекты ДИЗ — это самый шик инженерной романтики. То котельную построить с определённым контроллером внутри, то здание суда реконструировать, то дата-центр построить, то тригенерационный центр для МЧС, то ещё что. А то и на Алдан сгонять — что-нибудь починить руками, ночью кабель на крыше банка гнуть, зимой в –50 антенны на северах чинить. Только один раз в тепло попали: телескоп в горах Чили устанавливали.

    В этом году было 493 проекта. Самые интересные — упомянутый стадион в Краснодаре (совместно с ДТК), стадион ЦСКА, умный офис АЛРОСА (совместно с ДТК), арбитражный суд в Смоленской области. Только начали проект оснащения стадиона в Екатеринбурге, в середине лета планируем закрывать проект по строительству завода «Ставрополь Авто».

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

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

    Хайлоад


    Это проекты ДВС, по сути — инфраструктурщиков и облачников. У них самая «тихая» работа — рутины по переездам и конфигурации много, а все новости негромкие. Ну да, в атомной энергетике теперь отказоустойчивые вычисления, ничего нигде не жахнет. Ну так и не жахнуло же до этого. И так далее. Всего за год в рамках направления ДВС реализовано 770 проектов. Самые крутые — это Росагро в облаке, VR-решения для «ДеЛаваль», виртуализация вычислительной инфраструктуры для «Связь-Банка», делали много интересного для «Восток-Запада», подняли гиперконвергентные решения для «Зельгрос».

    Общий тренд — все едут в облако, и нужно всё больше мощностей. Даже самые консервативные банкиры стали всё больше сервисов переводить в облачные среды, и на рынке это становится нормой. Потребности немного опережают то, что сейчас может предложить Россия, а на Запад масштабироваться сложно. Плюс HPC стали нужны на удалённых объектах. Часто нужна услуга «защищённое облако как сервис». Спрос на облачные сервисы растет, а вместе с этим формализуются и требования к обеспечению их безопасности. Мы предлагаем Security-as-a-Service на базе сертифицированных средств ФСТЭК и ФСБ для правильной защиты ПД.

    Ещё проекты — одной атомной компании обеспечили безотказную работу файловой системы и системы ресурсоёмких вычислений в условиях нехватки собственных ресурсов для их размещения — переехали в наш ЦОД Uptime Institute уровня Tier III Gold Certification of Operational Sustainability. Про flash-массивы: видим, что банкиры и розница хотят больше вычислений производить в оперативной памяти — и производительность в разы больше, и число одновременно обрабатываемых транзакций возрастает на порядки. «Касторама» — исправили ошибки предыдущего подрядчика из Индии, перенастроили всё, сделали мониторинг систем, заказчик доволен. Ну и провели миграцию в облако ИТ-систем «Юнистрим». Сделали для банкиров распределённую платформу и эластичную инфраструктуру, готовую к пиковым нагрузкам и тестированиям.

    Итог


    У всех кризис, а в ИТ — сумасшедшая гонка. В 16-м году все дико экономили, поэтому приходилось много думать и искать нетрадиционные решения проблем. Например, банки начали переходить с RISC-машин на x86 (неслыханное раньше дело) и in-memory computing внедрять, админы больших сетей стали разбираться с SDDC и SDN-технологиями (это что-то вроде тайных ступеней матанализа для обычного админа), плюс теперь много интересных разработок (в том числе из опенсорса) стало делаться внутри страны. А этот год проходит ещё веселее, но об этом на следующий новый год в апреле. Или июне.
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/331390/


    Метки:  

    Поиск сообщений в rss_rss_hh_new
    Страницы: 1437 ... 1018 1017 [1016] 1015 1014 ..
    .. 1 Календарь