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

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

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

Наш опыт с Kubernetes в небольших проектах (обзор и видео доклада)

Среда, 21 Июня 2017 г. 09:06 + в цитатник
Дмитрий Столяров (Флант) с докладом про Kubernetes на RootConf, РИТ++ 2017

6 июня на конференции RootConf 2017, проходившей в рамках фестиваля «Российские интернет-технологии» (РИТ++ 2017), в секции «Непрерывное развертывание и деплой» прозвучал доклад «Наш опыт с Kubernetes в небольших проектах». В нём рассказывалось об устройстве, принципах работы и основных возможностях Kubernetes, а также о нашей практике использования этой системы в небольших проектах.

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

Предыстория


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

С эксплуатацией современной, микросервисной, инфраструктуры есть ряд сложностей, обусловленных самой архитектурой и количеством её компонентов. Мы выделяем следующие из них:
  1. сбор логов;
  2. сбор метрик;
  3. supervision (проверка состояния сервисов и их перезапуск в случае проблем);
  4. service discovery (автоматическое обнаружение сервисов);
  5. автоматизация обновления конфигураций компонентов инфраструктуры (при добавлении/удалении новых сущностей сервисов);
  6. масштабирование;
  7. CI/CD (Continuous Integration и Continuous Delivery);
  8. vendor lock-in (речь про зависимость от выбранного «поставщика решения»: облачного провайдера, bare metal…).

Как легко догадаться из названия доклада, система Kubernetes появилась как ответ на эти потребности.

Основы Kubernetes


Архитектура Kubernetes в целом выглядит как master (может быть не один) и множество узлов (до 5000), на каждом из которых установлены:
  • Docker,
  • kubelet (управляет Docker),
  • kube-proxy (управляет iptables).

На master находятся:
  • сервер API,
  • база данных etcd,
  • планировщик (решает, на каком узле запускать контейнер),
  • controller-manager (отвечает за отказоустойчивость).

В дополнение ко всему этому есть управляющая утилита kubectl и конфигурации, описанные в формате YAML (декларативный DSL).



С точки зрения использования Kubernetes предлагает облако, объединяющее в себе всех этих master и узлов и позволяющее запускать «строительные блоки» инфраструктуры. К таким примитивам, в том числе, относятся:
  • контейнер — образ + запускаемая в нём команда;
  • под (Pod; дословно переводится как «стручок») — совокупность контейнеров (может быть и один) с общей сетью, одним IP-адресом и другими общими характеристиками (общие хранилища данных, лейблы); примечание: именно поды (а не отдельные контейнеры) позволяет запускать Kubernetes;
  • лейбл и селектор (Label, Selector) — набор произвольных ключей-значений, назначаемых на поды и другие примитивы Kubernetes;
  • ReplicaSet — множество подов, количество которых автоматически поддерживается (при изменении числа подов в конфигурации, при падении каких-либо подов/узлов), что делает масштабирование очень простым;
  • деплой (Deployment) — ReplicaSet + история старых версий ReplicaSet + процесс обновления между версиями (используется для решения задач непрерывной интеграции — деплоя);
  • сервис (Service) — DNS-имя + виртуальный IP + селектор + балансировщик нагрузки (для разбрасывания запросов по подам, подходящим под селектор);
  • задача (Job) — под и логика успешности выполнения пода (используется для миграций);
  • cron-задача (CronJob) — Job и расписание в формате crontab;
  • том (Volume) — подключение хранилища данных (к поду, ReplicaSet или Deployment) с указанием размера, типа доступа (ReadWrite Once, ReadOnly Many, ReadWrite Many), типа хранилища (поддерживаются 19 способов реализации: железных, программных, облачных);
  • StatefulSet — подобное ReplicaSet множество подов, но с жёстко определёнными названиями/хостами, чтобы эти поды могли всегда общаться между собой по ним (для ReplicaSet названия каждый раз генерируются случайным образом) и иметь отдельные тома (не один на всех, как в случае ReplicaSet);
  • Ingress — служба, доступная пользователям извне и разбрасывающая все запросы на сервисы по правилам (в зависимости от имени хоста и/или URL'ов).

Примеры описания пода и ReplicaSet в формате YAML:
apiVersion: v1
kind: Pod
metadata:
 name: manual-bash
spec:
 containers:
 - name: bash
   image: ubuntu:16.04
   command: bash
   args: [-c, "while true; do sleep 1; date; done"]

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: backend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: backend
  template:
   metadata:
    labels:
      tier: backend
   spec:
    containers:
    - name: fpm
      image: myregistry.local/backend:0.15.7
      command: php-fpm

Эти примитивы отвечают на все обозначенные выше вызовы за небольшими исключениями: в автоматизации обновлений конфигураций не решена проблема сборки Docker-образов, заказа новых серверов и установки узлов на них, а в CI/CD остаётся необходимость проведения подготовительных работ (установка CI, описание правил сборки Docker-образов, выкатывания YAML-конфигураций в Kubernetes).

Наш опыт: архитектура и CI/CD


Под небольшими проектами мы подразумеваем маленькие (до 50 узлов, до 1500 подов) и средние (до 500 узлов, до 15000 подов). Самые маленькие проекты на bare metal мы делаем тремя гипервизорами, которые выглядят так:



Контроллер Ingress ставится на трёх виртуальных машинах (kube-front-X):


(Вместо указанного на схеме Pacemaker может быть VRRP, ucarp или другая технология — зависит от конкретного ЦОДа.)

Как выглядит цепочка Continuous Delivery:



Пояснения:
  • Для непрерывной интеграции используем GitLab (в ближайшие недели опубликуем статью с подробностями о практике её использования).
  • В Kubernetes настраиваем окружения для каждого контура (production, staging, testing и т.п. — их количество зависит от конкретного проекта). При этом разные контуры могут обслуживаться разными кластерами Kubernetes (на разном железе и в разных облаках), а в GitLab настраивается деплой в них.
  • В Git кладём Dockerfile (а точнее, мы используем для этого dapp) и каталог .kube с YAML-конфигурациями.
  • При коммите (стадия build) создаём образ Docker, который отправляется в Docker Registry.
  • Далее (стадия test) берём этот образ Docker и запускаем на нём тесты.
  • При релизе (стадия release) YAML-конфигурации из директории .kube отдаём утилите kubectl, которая отправляет их в Kubernetes, после чего скачиваются Docker-образы и запускаются в инфраструктуре, развёрнутой по конфигурации из YAML. (Раньше мы использовали для этого Helm, но сейчас доделываем свой инструмент dapp.)
  • Таким образом, за последнюю стадию (operate) полностью отвечает Kubernetes.



В случае небольших проектов инфраструктура выглядит как контейнерное облако (его реализация вторична — зависит от имеющегося железа и потребностей) с настроенным хранилищем (Ceph, AWS, GCE…) и контроллером Ingress, а также (помимо этого облака) возможно наличие дополнительных виртуальных машин для запуска сервисов, которые мы не ставим внутрь Kubernetes:


Заключение


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

Видео и слайды


Видео с выступления (около часа) опубликовано в YouTube.

Презентация доклада:



Продолжение


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

P.S. Другие наши доклады про CI/CD


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

https://habrahabr.ru/post/331188/


Биробиджан на светлой стороне: как мы за свои деньги город осветили

Среда, 21 Июня 2017 г. 08:50 + в цитатник

Метки:  

[Перевод] CSS: введение в единицу длины 'fr'

Среда, 21 Июня 2017 г. 07:32 + в цитатник


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

Прежде чем мы начнём, давайте посмотрим, как мы обычно создаём гриды в CSS. В приведенном ниже примере мы создаем грид из четырёх столбцов с одинаковой шириной:


.grid {
  display: grid;
  grid-template-columns: repeat(4, 25%);
  grid-column-gap: 10px;
}


Если вы никогда не использовали функцию repeat() в качестве значения свойства grid-template-columns, позвольте представить вам одну из самых изящных фич CSS-грида! Это краткая запись. По сути, она позволяет нам более кратко описывать повторяющиеся значения. Вместо этого мы могли бы написать grid-template-columns: 25% 25% 25% 25%;, но удобнее использовать repeat(), особенно когда вы определяете ширину через довольно длинное выражение minmax().

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

repeat(количество столбцов/строк, нужная нам ширина столбца);

Но, на самом деле, здесь есть пара проблем.

Во-первых, для использования этой функции CSS, нам нужно было провести небольшой расчёт. Нам пришлось подсчитать, сколько мы получим, если общую ширину грида (100%) разделим на нужное число столбцов (4). Мы получили 25%. В этом примере расчёт довольно прост и не создает проблем, но и в более сложных примерах мы можем полностью избежать необходимости что-то рассчитывать и позволить браузеру сделать это за нас. У нас есть функция calc(), так что мы могли бы написать следующее: repeat(4, calc(100% / 4), но даже это немного странно, и в любом случае здесь есть еще одна проблема…

Вторая проблема связана с переполнением. Так как мы установили для каждого столбца ширину в 25% и задали grid-column-gap в 10px, весь грид становится шире 100%. Не этого ожидаешь, набирая выше приведённый код, но именно так работают процентные значения. На самом деле, мы здесь как бы говорим: «нужно установить для каждого столбца значение 25% от ширины области просмотра и расстояние в 10px между ними». Это немногим отличается от наших ожиданий, но вызывает большую проблему с вёрсткой.

Ненароком мы создали горизонтальную прокрутку:


И именно здесь нам поможет единица fr.

Единица fr («дробная часть») может использоваться при создании гридов так же, как любая другая единица длины в CSS, как %, px или em. Давайте подредактируем наш код и попробуем задать новое значение:

.grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-column-gap: 10px;
}


Результат будет таким же, как и в приведённом ранее примере, так как в данном случае мы задаём каждому из четырех столбцов ширину, равную одной дробной части (которая составляет 1/4 или 25%). Но! Мы избавились от переполнения на оси x, так как если мы определяем для каждого столбца ширину, равную 1fr, эти 10px учитываются автоматически и вычитаются из конечной ширины столбца.

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



Это довольно типичная практика для многих UI. Использование fr в таких случаях избавляет нас от необходимости создавать отдельный грид или возиться с расчётами через calc(). Ведь если бы мы не прибегли к fr в приведённом выше примере, нам бы пришлось выполнить следующий расчёт:

ширина каждого столбца = ((ширина видимой области — ширина панели навигации)/число столбцов) * 1%

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

.grid {
  display: grid;
  grid-template-columns: 250px repeat(12, 1fr);
  grid-column-gap: 10px;
}



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

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

Чем делятся наши коллеги


Хорошего результата можно добиться, используя fr вместе с другими единицами длины. Представьте фиксированный сайдбар и основную область контента, которая занимает оставшуюся часть пространства: grid-template-columns: 200px 1fr;. Легко!

Вот хороший пример использования нескольких единиц с Alligator.io:
.container {
/* ... */

grid-template-columns: 1fr 1fr 40px 2fr;
grid-template-rows: 100px 200px 100px;

/* ... */ 
}



Рэйчел Эндрю делится видео о единице fr:





Анна Монус предлагает замечательную статью об этой единице:

«Вы можете использовать единицу fr также вместе с другими единицами длины CSS. В примере ниже я использовала для моего грида соотношение 60% 1fr 2fr».



Да здравствует единица fr!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331316/


Метки:  

Как выигрывать в конкурсах репостов Вконтакте?

Среда, 21 Июня 2017 г. 01:47 + в цитатник

Метки:  

Пример синтеза асинхронных SI схем в двухходовой элементной базе: C-элемент

Вторник, 20 Июня 2017 г. 23:16 + в цитатник
В предыдущей публикации я представил метод синтеза асинхронных схем в минимальной элементной базе. Этот метод не требует вычисления логических функций, а представляет из себя коррекцию исходного поведения с помощью добавления дополнительных сигналов. Покажу на примере C-элемента, как это работает.
Исходное поведение выглядит так:
image
Сигналы a, b — входные, c — выходной. Знаки событий не обозначены, поскольку для синтеза это лишняя информация и для оптимизации их лучше расставить в конце. Цель синтеза состоит в добавлении дополнительных сигналов таким образом, чтобы каждый невходной сигнал f можно было бы вписать в следующие шаблоны:
image
Вообще таких шаблонов несколько больше, но в данном случае достаточно только этих.
Посмотрим на исходное поведение и определим имеющиеся проблемы. Во-первых, это наличие двух синхронизаций параллельных ветвей. Во-вторых, наличие входных сигналов. Двух подряд переключений входных сигналов в исходном поведении нет, поэтому входные сигналы не являются проблемой. Но на стадии декомпозиции проблемы, связанные с входными сигналами, еще возможно проявятся.
В итоге, нам нужно обеспечить две синхронизации. Один сигнал может обеспечить только одну синхронизацию (сигнал f во втором шаблоне). Сигнал c использовать для синхронизации нельзя, он не вписывается в шаблон. Значит, для синхронизации необходимо минимум 2 дополнительных сигнала. И в данном случае двух сигналов достаточно:
image
Сигналы f, g вписываются в шаблон, т.е. уже имеют двухвходовую реализацию. Их объявляем псевдовходными. Сигналы a, b теперь являются причинами только псевдовходных событий. Поэтому из дальнейшего рассмотрения их можно удалить. В итоге получаем поведение:
image
Сигналы f, g — псевдовходные.
Нарушений CSC нет. Поэтому, казалось бы, можно приступить к декомпозиции. Но, так как сигнал c требует представления в виде триггера (для декомпозиции), и в то же время сигнал c является причиной только псевдовходных событий, то переключение дуального сигнала пришлось бы ставить в параллель с последующей синхронизацией. А это слишком сложное решение. В данном случае проще принудительно вписать сигнал c в шаблон, добавив 1 или 2 дополнительных сигнала. Такое добавление, если не вставлять два переключения одного сигнала подряд, не влечет нарушений CSC, и не препятствует декомпозиции как старых, так и новых сигналов.
В нашем случае придется добавить 2 сигнала h и i, причем единственно возможным способом:
image
Сигналы f, g — псевдовходные.
Теперь можно перейти к декомпозиции. Представления в виде триггера требует только сигнал i, поэтому добавим дуальный сигнал j:
image
В итоге все сигналы c, h, i, j — вписываются в шаблон, и собственно декомпозицию делать не нужно.
Теперь восстановим сигналы a и b, ранее удаленные из рассмотрения. Таким образом получим скорректированное исходное поведение, в котором все невходные сигналы вписываются в шаблон.
image
Осталось только расставить знаки, так чтобы минимизировать количество дополнительных инверторов.
image
А теперь введем инверторы k и n для устранения возникших рассогласований на входах элементов g и i.
image
В итоге коррекция не исказила исходного поведения. Логические функции выглядят так:
$c=NAND(j,h) $
$f=NOR(a,g) $
$g=NOR(k,f) $
$h=NAND(i,f) $
$i=NAND(n,j) $
$j=NAND(h,i) $
$k=NOT(b) $
$n=NOT(g) $
Схема C-элемента:
image
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331314/


Метки:  

Современные конвергентные технологии на рынке в РФ — попробуем сравнить? «Ипортозамещение», Ceph + OpenStack, Nutanix

Вторник, 20 Июня 2017 г. 22:52 + в цитатник
На сегодняшний день в РФ на IT рынке сложилась крайне интересная ситуация.

Происходят (успешные или не очень — отдельный вопрос) попытки импортозамещения в IT, появилось множество продуктов «made in Russia», особые списки и прочее.

Мы не хотим и не будем говорить о политике, но поговорим о технологиях и ценообразовании.

Сегодня бы хотелось поговорить об одной из наиболее «нагретых» в мире и РФ тематик (и выгодной для производителей) — платформы для хранения и обработки данных — иными словами СХД, виртуализация, облака и прочее.

image



Для рассмотрения были выбраны три варианта — массово рекламируемые в РФ импортозаместительные продукты и Nutanix, как лидер (или один из лидеров) мирового рынка HCI.

Подавляющее большинство «стеков сделанных в РФ» укладываются в «Openstack + Ceph».

Перефразируя, мы говорим о современном подходе к построению IT инфрастуктур по принципу как делает Amazon, Google, Facebook и другие, но с локальными особенностям.

Как небольшое отступление, еще в 2014 году Forbes сделал прогноз о том что в 2017 большинство крупнейших / ключевых компаний будут использовать webscale решения, и они оказались правы.

Более половины крупнейших мировых компаний (из Global 100) уже используют WebScale (инфографика — ниже).

Gartner Says By 2017 Web-Scale IT Will Be an Architectural Approach Found Operating in 50 Percent of Global Enterprises

image

Аналитики в целом сходятся в том что традиционные подходы к построению инфраструктур изживают себя (так называемые «трех-уровневые инфраструктуры» базирующиеся на СХД), причем пере-раздел рынка происходит крайне быстро.

Крайне интересная инфографика и аналитика:

image

Теперь вы понимаете, почему рынок так сильно нагрет даже в РФ и почему «импортозаместители» ведут себя как в анекдоте «тушите свет, они на свет лезут», при этом (мое личное мнение) реальная ситуация с технологиями очень напоминает вот это:

image

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

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

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

Многие профессионалы знают, что в подавляющем количестве случаев все эти продукты реально не разрабатывались в России, и либо используют ceph + openstack (по ощущению — >95% «импортозамещений»), либо делают вид что разрабатывают продукт локально, но в реалиях это вполне себе западный программный код.

Один из интересных примеров — как «Лёгким движением руки брюки превращаются в шорты».

Американская компания (бывшая Parallels) Virtuozzo -> "Росплатформа" -> "СКАЛА-Р"

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

Программный код Virtuozzo принадлежит американской компании.

image

Если говорить о суммах, то речь идет обычно о проектах от сотен тысяч до многих миллионов долларов, но решения применимы и небольшими компаниями — порог входа в «новый прекрасный мир» (для РФ) — где-то 35$k.

IBS ориентирует свою «Скала-Р» как «с экономической точки зрения платформа СКАЛА-Р может быть интересна компаниям с ИТ-бюджетом от $500 тыс.», что конечно мягко говоря несколько удивляет.



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



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

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


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

Невозможно проверить (за обозримое время) на предмет ошибок или закладок программный код (миллионы строк) современного ядра Linux и всего типового окружения (на базе которого работают практически все «замещатели»), не говоря о массе дополнительного кода (ceph, openstack, virtuozzo и тд).

Только ядро Linux приблизилось к 20 миллионам строк.

image

Как показывает жизнь, практически все крупнейшие / скандальные дыры в программном коде Linux и типовых библиотек были обнаружены и исправлены не в РФ (включая heartbleed и прочее) — кому интересно, по сути можно взять и посмотреть когда были выпущены патчи к «русским линукс».

Учитывая что ceph и virtuozzo работают на уровне хоста / ядра ОС, это реально является серьезнейшей проблемой надежности и безопасности.

Итак, поехали. Пока — о базовых вещах.

Ceph + Openstack.

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

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

image

Основной гипервизор (и фактически единственный применимый для использования в случае ceph) — KVM.

В качестве SDS (программного хранения данных) — реальный вариант для использования — только ceph, отдельный opensource проект.

Теоретически можно использовать ESXi и HyperV через iSCSI, но практике ввиду отсутствия поддержки VAAI / ODX это является как максимум лабораторным вариантом.

Как отступление, я искренне не понимаю как можно запускать любые проекты на ceph для серьезного применения — только в 2017 году было открыто 108 «urgent» и 106 «immediate» баг-репортов, многие из которых могут привести к потере данных или крайне серьезным проблема.

Практически — по жесткой «баге» в день, что напоминает хождение по минному полю.



Напомню, что в конце 2016 года ceph.com «лежал» два дня ввиду падения хранилища на базе ceph. Весьма иронично.

image

Рассказы про то как «мощные команды русских программистов» (обычно речь идет реально про максимум 3-10 человек) исправили все ошибки ceph и создали русский продукт — оставим на совести продавцов таких решений, но у грамотного IT специалиста должны возникнуть вопросы — почему сотни / тысячи разработчиков основного ceph «не смогли», но у микро-команд из РФ все получилось.

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

Cудьба Openstack как проекта в целом тоже вызывает много вопросов.

Для начала — пара цитат из блога Мирантис (при том что в 2016 году они например внедряли Опенстак в крупнейшем банке РФ, уже прекрасно осознавая что OS реально «не жилец»):



"Infrastructure Software is Dead"

«Now I’d love to tell you that it’s all because Mirantis OpenStack software is so much better than everybody else’s OpenStack software, but I’d be lying. Everybody’s OpenStack software is equally bad. It’s also as bad as all the other infrastructure software out there – software-defined networking, software-defined storage, cloud management platforms, platforms-as-service, container orchestrators, you name it. It’s all full of bugs, hard to upgrade and a nightmare to operate. It’s all bad.»

На сегодняшний день, практически все ведущие «драйверы» отказались от развития — «Мирантис» уволил массу сотрудников из OpenStack подразделения и открыто признает что надо уходить на микросервисы, HPE продали полностью подразделение, Rackspace как одна из икон опенстак-движения сделал делистинг с биржи — остался пожалуй только RedHat.

Далее поговорим о «бесплатности» таких решений.

Цена на поддержку коммерческого openstack в РФ — в среднем 4-5 тысяч $ (тех самых американских долларов) в год за каждый сервер.



Это совпадает с тем, что нам называли в РФ наши клиенты, когда к ним приходил тот-же «Мирантис», поэтому можем взять как базу для рассчетов.

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

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

Сертификация решений — разброд и шатание, часть локализованных вариантов имеет сертификацию.

Стартовый ПАК — от 45 тысячи долларов США — минимум 6 серверов (3 под ceph, 3 под KVM и OS). Конфигурация реально лабораторная, для промышленного использования требуется разносить сервисы ceph.

Каждый сервер около 5$k (30$k за сервера), плюс поддержка OpenStack (около 5$k за сервер в год).

Virtuozzo / Росплатформа / СКАЛА-Р.

Parallels -> Virtuozzo — по сути, широко известное, уважаемое и достаточно распространенное решение в узких кругах сервис-провайдеров, заточенное под конкретные задачи (обеспечение работы ISP и недорогих массовых хостингов).

В качестве стека виртуализации ранее использовали свой гипервизор, но в 7-й версии приняли решение переходить на KVM, который при этом "работает на 40% быстрее чем обычный KVM" (сразу вспомнил рекламу про «обычный стиральный порошок :) „)

Частью решения является virtuozzo storage, он-же “р-хранилище» — фактически распределенная СХД с массой ограничений (об этом ниже) и минимумом функционала, заточенная конкретно под нужды сервис-провайдинга, о чем упоминается в том числе в документации (на этом фоне крайне интересно позиционирование решения в РФ как универсального).

Готовый ПАК (программно-аппаратный комплекс) из 4-х простых серверов стартует минимально от 7.8 миллионов рублей (~130 тысяч долларов США — за импортозамещение надо платить)

«Cкала-Р» и «Росплатформа» — не совсем ясно, с официального сайта — «Безопасность продукта обеспечивается комплексом средств ИБ и готовностью к сертификации во ФСТЭК.»

Nutanix

Создатели рынка HCI / WebScale, лидеры по продажам, масса реализованных проектов практически в любых индустриях.

Как уже писал выше, более половины крупнейших мировых компаний (из Global 100) уже используют Nutanix.

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

Получены практически все ключевые сертификации безопасности в мире.

Готовый ПАК в РФ стартует от 35 тысяч долларов США, минимум 3 сервера.

Фактически, вся основная инфографика приложена:
image



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

Таблицу по OpenStack + ceph сверял с представителями OpenStack и ceph коммьюнити в РФ.

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



Какие выводы? Их я делать не буду, делайте сами.
СКАЛА-Р / Росплатформа
/ Virtuozzo
Nutanix CEPH + OpenStack
Программная архитектура
В случае работы на уровне хоста / ядра ОС,
потенциальные проблемы безопасности
и отказоустойчивости.
Ядро / хост Изолированный виртуальный контроллер Ядро / хост
“Заточенность” решения Сервис провайдеры Энтерпрайз (корпорации),
правительственные службы,
военные, медицина,
промышленность,
ресурсодобывающие компании,
финансовые структуры.
Сервис провайдеры
HCI (гиперконвергентное) решение.
Дата сервисы и виртуализация
работают на серверах
одновременно.
да да нет
Отсутствие узких мест / точек
отказа (централизованные сервисы,
например cервера метаданных
или сервера управления)
нет да нет
STIG политики (Security Technical Implementation Guide) Отсутствуют, рекомендация производителя — ручной поиск rootkit и обнаружение взломов да Отсутствуют, есть масса разрозненных рекомендаций и методик
Расположение компании, разрабатывавшей основную часть ПО США
(Parallels -> Virtuozzo -> Росплатформы->”СКАЛА-Р”)
США США (основная разработка), производится множеством компаний.
Публично доступны полные исходные коды
Встроенный полноценный мониторинг (все аппаратные и программные компоненты) и самодиагностика Частично,
Скала-Р применяет дополнительные средства мониторинга
да Частично
Интеллектуальный автоматический Data Tiering — перемещение блоков данных между холодным и горячими уровнями в случае изменения частоты запросов к этим данным (“нагрев” или “охлаждение”) нет да нет
Встроенный портал самообслуживания нет да да
Локализация данных VM (data locality) — активные данные VM находятся на том-же сервере где работает виртуальная машина.
Кардинальное ускорение операций чтения и снижение нагрузки на сеть в разы.
нет да нет
Репликация на уровне VM нет да нет
Восстановление целостности данных Ручной запуск в случае потери крупного домена Автоматический старт Автоматический старт
Дедупликация данных нет да нет
Компрессия данных нет да нет
Erasure Code (помехоустойчивое кодирование) нет да да
Поддержка All Flash нет да да
Микс All Flash и Hybrid в едином кластере нет да да
Обработка отказов SSD дисков с метаданными Временная потеря части узлов с данными и долгое восстановление Автоматическая отработка, не влияет на производительность кластера, все узлы с данными продолжают работу Автоматическая отработка, может влиять на производительность кластера
Поддержка VAAI и ODX (протоколы «разгрузки» операций ввода-вывода на систему хранения данных) нет да нет
Поддержка Application Consistent Snapshots (провайдер VSS для Windows Server и имплементация для Linux) нет да нет
Неограниченное количество снапшотов VM, без влияния на производительность и возможностью манипуляций (в т.ч. удаления) снапшотов на любом уровне нет да нет
Теневые клоны (shadow disk) — создание локальной копии дисков VM для кардинальной акселерации загрузки и работы нет да нет
Встроенный бэкап на Amazon / Azure нет да нет
Наличие Best Practice для ключевых типовых приложений (Oracle RAC, MSSQL, Postgres, SAP NetWeaver, MongoDB, Microsoft Exchange, Cisco Unified Communications и другие) нет да нет
Распределенный отказоустойчивый cтек управления (management plane) без использования централизованных баз данных нет да нет
Не требуются выделенные сервера управления нет да нет
Автоматические апгрейды аппаратных прошивок (биос, прошивки дисков и флеш, контроллеры и тд) нет да нет
Прозрачное обновление без перезапуска клиентских сервисов при смене основной версии ПО нет да да
Поддержка гипервизоров KVM (несертифицированные патчи), Virtuozzo (устарел, в новой версии перешли на KVM) AHV (KVM совместим, сертифицирован Microsoft, SAP и другими), XenServer, vSphere, HyperV KVM.

Возможно использование vSphere и HyperV с подключением через iSCSI, не рекомендуется для продуктива ввиду отсуствия поддержки VAAI / ODX

Не является HCI решением.
Поддержка основных стеков виртуализации рабочих мест (VDI) – Citrix, VMware нет Citrix, VMware, Workspot и другие нет
Возможность запуска Microsoft Windows Server с полной поддержкой от Microsoft (SVVP — Server Virtualization Validation Program) Нет, SVVP сертификация присутствует для старой версии американского продукта с другим гипервизором.
Виртуализация Windows Server — на свой страх и риск
Полная SVVP сертификация Есть для RedHat OpenStack и Canonical (Ubuntu) OpenStack, отсутствует для большинства других вариантов.
Контейнерная виртуализация Virtuozzo Docker Docker, LXD
Встроенные бэкапы (без применения стороннего ПО) с пофайловым восстановлением и самообслуживанием нет да нет
Метро кластер (распределённый кластер с синхронным реплицированием) нет да нет
Встроенная поддержка аварийного мульти-цод восстановления (many to many DR) нет да <нет
Поддержка кросс-гипервизорного DR нет да нет
Автоматическая конвертация гипервизора и всех VM на кластере (например, ESXi->AHV/KVM) нет да нет
Встроенный SDN стек с интеграцией в аппаратное сетевое обеспечение нет да нет
Поддержка Affinity / Anti-Affinity, для
оптимизации лицензирования ПО.
При отсутствии поддержки
необоснованные лицензионные
затраты могут составлять
миллионы долларов
нет да нет
Поддержка RESTful API (стандарт индустрии) нет да нет
Бесплатный апгрейд ПО на
новые версии (минорные и глобальные
обновления версий) при наличии
действующей базовой техподдержки
Скала-Р — платно
Росплатформа — бесплатно
Virtuozzo — платно
да нет
Ценообразование (для РФ) на готовые коммерческие решения (ПАК — программно аппаратный комплекс) Стартовая цена от 136000$

Кластер минимум из 4-х узлов
Стартовая цена от 35000$

Кластер минимум из 3-х узлов
Стартовая цена от 45000$

Необходимый минимум:
3 сервера ceph, 3 сервера виртуализации, ~5$k в год за каждый сервер виртуализации (поддержка OpenStack). Поддержка ceph не учтена.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331306/


Метки:  

Работа с API КОМПАС-3D -> Урок 2 -> Оформление чертежа

Вторник, 20 Июня 2017 г. 18:48 + в цитатник

И снова про API САПР КОМПАС. Новая статья Сергея Норсеева, инженера-программиста АО «ВНИИ «Сигнал», автора книги «Разработка приложений под КОМПАС в Delphi». Первую статью можно прочесть здесь.


Для оформления чертежа используется несколько интерфейсов, среди них:
  • ksSheetPar – задает основные параметры оформления, такие как: используемая библиотека оформлений и конкретное оформление из этой библиотеки;
  • ksStandartSheet – задает параметры стандартного листа. Он определяет размер листа, ориентацию основной надписи и кратность;
  • ksSheetSize – задает параметры нестандартного листа (его размеры).
    В данной статье мы рассмотрим вопрос создания чертежей как на стандартных, так и на нестандартных листах.


Основные параметры оформления


Указатель на интерфейс ksSheetPar возвращается методом GetLayoutParam() интерфейса ksDocumentParam, описывающего параметры документа.
Интерфейса ksSheetPar имеет два свойства:
  • layoutName – имя библиотеки оформлений. Обычно, это библиотека «graphic.lyt», хранящаяся в подкаталоге «Sys» каталога КОМПАС;
  • shtType – тип штампа (основной надписи) из указанной библиотеки оформления.


Для того чтобы понять назначение этих свойств, откройте (или создайте новый) чертеж в КОМПАС. Раскройте список «Листы» в дереве чертежа. Откроется строка со свойствами листа документа.


Дерево документа (Картинка кликабельна)

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


Менеджер документа

Строка в колонке «Библиотека оформлений» – это наименование библиотеки, указываемой в поле «layoutName». Свойство shtType задает значение колонки «Оформление». Чтобы увидеть допустимые значения этого свойства для текущей библиотеки оформлений, дважды кликните левой кнопкой мыши по строке в окне менеджера документа. Перед вами появится окно.


Свойство shtType задает значение колонки с ГОСТом под списком «Листы». Чтобы увидеть допустимые значения этого свойства для текущей библиотеки оформлений, дважды кликните левой кнопкой мыши по строке в дереве документа. Перед вами появится окно.


Окно «Оформление»

Строка в колонке «Библиотека» – это наименование библиотеки, указываемой в поле «layoutName».
Нажмите на кнопку «…» справа от поля «Название». Перед вами появится окно.


Диалог выбора оформления

Свойство shtType содержит значение из колонки «Номер» и определяет соответствующее оформление. Например, для документа «Чертеж констр. Первый лист. ГОСТ 2.104-2006» (выделено на рисунке выше) значение свойства shtType должно быть равно 1, а для документа «Титульный лист. ГОСТ 2.104-2006.» – 42 и т. д.

Методов у интерфейса ksSheetPar всего два:
  • Init() – сбрасывает значения свойств к значениям по умолчанию;
  • GetSheetParam() – возвращает указатель на интерфейс ksStandartSheet (для листа стандартных размеров) или ksSheetSize (для листа нестандартных размеров).


Тип размеров листа (стандартные или нет) устанавливается в свойствах интерфейса ksDocumentParam при создании чертежа. В начале рассмотрим работу с листами стандартных размеров.

Стандартные листы



Параметры стандартного листа описываются интерфейсом ksStandartSheet, имеющим три свойства:
  • direct – расположение основной надписи (FALSE – вдоль короткой стороны листа, TRUE – вдоль длинной стороны);
  • format – формат листа (0 – А0, 1 – А1, 2 – А2, 3 – А3, 4 – А4, 5 –А5);
  • multiply – кратность формата листа.


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

KompasObjectPtr kompas;
//Запускаем КОМПАС
kompas.CreateInstance(L"KOMPAS.Application.5");

//Подготавливаем параметры документа
DocumentParamPtr DocumentParam;
DocumentParam=(DocumentParamPtr)kompas->GetParamStruct(ko_DocumentParam);
DocumentParam->Init();
DocumentParam->type= lt_DocSheetStandart;//Чертеж на стандартном листе

SheetParPtr SheetPar;
SheetPar = (SheetParPtr)DocumentParam->GetLayoutParam();
SheetPar->layoutName[0] = L'0';
SheetPar->shtType = 1;  //Тип документа

//Подготавливаем параметры листа
StandartSheetPtr StandartSheet;
StandartSheet = (StandartSheetPtr)SheetPar->GetSheetParam();
StandartSheet->direct = false; //надпись вдоль короткой стороны
StandartSheet->format = 4;     //А4
StandartSheet->multiply = 1;   //кратность

//Создаем чертеж
Document2DPtr Document2D;
Document2D = (Document2DPtr)kompas->Document2D();
Document2D->ksCreateDocument(DocumentParam);

//Делаем КОМПАС видимым
kompas->Visible = true;
kompas.Unbind();


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


Рамка чертежа конструкторского со стандартными размерами. Первый лист. ГОСТ 2.104-2006

Нестандартные листы



Параметры нестандартного листа описываются интерфейсом ksSheetSize со следующимия свойствами:
  • height – высота листа в миллиметрах;
  • width – ширина листа в миллиметрах.


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

KompasObjectPtr kompas;
//Запускаем КОМПАС
kompas.CreateInstance(L"KOMPAS.Application.5");

//Подготавливаем параметры документа
DocumentParamPtr DocumentParam;
DocumentParam=(DocumentParamPtr)kompas->GetParamStruct(ko_DocumentParam);
DocumentParam->Init();
DocumentParam->type = lt_DocSheetUser; //Чертеж на нестандартном листе

SheetParPtr SheetPar;
SheetPar = (SheetParPtr)DocumentParam->GetLayoutParam();
SheetPar->layoutName[0] = L'0';
SheetPar->shtType = 1;  //Тип документа

//Подготавливаем параметры листа
SheetSizePtr SheetSize;
SheetSize = (SheetSizePtr)SheetPar->GetSheetParam();
SheetSize->Init();
SheetSize->width  = 300;
SheetSize->height = 300;

//Создаем чертеж
Document2DPtr Document2D;
Document2D = (Document2DPtr)kompas->Document2D();
Document2D->ksCreateDocument(DocumentParam);

//Делаем КОМПАС видимым
kompas->Visible = true;
kompas.Unbind();


Обращаю ваше внимание на то, что для создания чертежа на листе нестандартного размера нужно в свойстве type интерфейса ksDocumentParam указать значение lt_DocSheetUser. После этого метод GetSheetParam() интерфейса ksSheetPar вернет указатель на интерфейс ksSheetSize.
На рисунке ниже показан результат работы этой программы.


Рамка чертежа конструкторского для листа с размерами 300 на 300 мм

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


Рамка чертежа конструкторского для листа с размерами 100 на 100 мм. Части штампа ушли за границы листа

В данном примере создавался лист размером 100х100 миллиметров, и к нему применялась основная надпись типа 1 («Чертеж констр. Первый лист. ГОСТ 2.104-2006»).

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

Сергей Норсеев, автор книги «Разработка приложений под КОМПАС в Delphi».
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330588/


Метки:  

Уязвимость Stack Clash позволяет получить root-привилегии в Linux и других ОС

Вторник, 20 Июня 2017 г. 18:39 + в цитатник


Изображение:finnsland, CC BY-SA 2.0

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

В чем проблема


Проблему обнаружили исследователи информационной безопасности из компании Qualys. Уязвимость была впервые обнаружена в 2005 году, тогда же появилось исправление. Однако в 2010 году исследователи выяснили, что выпущенные патчи не полностью блокируют возможность эксплуатации. Разработчики Linux вновь выпустили патч, однако оказалось, что защиту можно обойти.

Суть уязвимости заключается в том, что при смежном размещении стека и кучи не исключены ситуации, когда содержимое переполненной кучи может оказаться в области стека, или стек, наоборот, может переписать область кучи, если куча растет в сторону увеличения, а стек — в сторону уменьшения. Для предотвращения подобных ситуаций в Linux и других операционных системах используется защитная техника stack guard-page.

В ходе исследования эксперты выявили множественные уязвимости в реализации «сторожевой страницы» (guard-page) и выделили три возможных типа атак:

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

Исследователи подготовили набор PoC-эксплоитов для различных операционных систем. Для использования описанной проблемы безопасности необходим локальный доступ к компьютеру, однако специалисты не исключают наличия возможности удаленной эксплуатации, например, посредством HTTP-запросов или JavaScript.

Как защититься


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

По словам исследователей, они проверяли наличие проблемы в операционных системах FreeBSD, NetBSD, OpenBSD, Solaris, а также популярных Linux-дистрибутивов Red Hat, SuSE, Debian и Ubuntu. Пользователям рекомендуется проверить наличие обновлений для своего дистрибутива. На данный момент неясно, подвержена ли уязвимости мобильная ОС Android.

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

https://habrahabr.ru/post/331300/


Метки:  

Лекции Технотрека. Администрирование Linux

Вторник, 20 Июня 2017 г. 18:26 + в цитатник


Представляем вашему вниманию очередную порцию лекций Технотрека. В рамках курса будут рассмотрены основы системного администрирования интернет-сервисов, обеспечения их отказоустойчивости, производительности и безопасности, а также особенности устройства ОС Linux, наиболее широко применяемой в подобных проектах. В качестве примера будут использоваться дистрибутивы семейства RHEL 7 (CentOS 7), веб-сервер nginx, СУБД MySQL, системы резервного копирования bacula, системы мониторинга Zabbix, системы виртуализации oVirt, балансировщика нагрузки на базе ipvs+keepalived. Курс ведёт Сергей Клочков, системный администратор в компании Variti.


Список лекций:


  1. Основы.
  2. Пользовательское окружение Linux.
  3. Linux и сеть (основы).
  4. Управление пользовательским окружением.
  5. Веб-сервисы.
  6. Хранение данных.
  7. Сервисы инфраструктуры.
  8. Резервное копирование.
  9. Резервное копирование (часть 2).
  10. Инфраструктура электронной почты.
  11. Распределение ресурсов системы.

Лекция 1. Основы





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


Лекция 2. Пользовательское окружение Linux





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


Лекция 3. Linux и сеть (основы)





Вы узнаете, что такое сетевой стек и модель OSI. Вспомните, что такое Ethernet и как с ним работает Linux. Дальше будут освежены ваши знания об использовании IPv4, особенностях IPv4-пакетов и сетей. Затем рассматривается ICMP, мультикаст в IPv4. Далее переходим к IPv6, обсуждаются заголовки IPv6-пакетов, UDP, TCP-соединения. Затрагивается тема TCP congestion control. Потом рассказывается о NAT, протоколах уровня приложения, DNS, NTP, HTTP и URL. Разбираются коды HTTP-ответа (успешные ответы и ошибки).


Лекция 4. Управление пользовательским окружением





Вы узнаете о том, что такое менеджер пакетов RPM и как его использовать. Далее рассматривается классический init, системный менеджер systemd. Разбирается пример init-файла. Обсуждаются основные типы Unit’ов, рассказывается про системный логгер и ротацию логов. В заключение вы узнаете об основах конфигурации сетевых интерфейсов.


Лекция 5. Веб-сервисы





Сначала рассматривается типовая архитектура веб-сервиса. Рассказывается о том, что такое фронтенд, что такое сервер приложений. Разбирается вопрос хранения данных веб-приложениями. Подробно разбирается работа и использование протокола HTTP. Обсуждаются виды HTTP-запросов. Затрагивается тема создания шифрованных туннелей с помощью SSL. Затем рассматриваются примеры установки СУБД MySQL с созданием БД и пользователя. Разбирается работа с PHP-FPM, конфигурирование nginx, установка и настройка wiki-движка.


Лекция 6. Хранение данных





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


Лекция 7. Сервисы инфраструктуры





Рассматривается DNS-сервер bind, NTP-сервер. Обсуждается централизованная аутентификация на основе LDAP. Разбирается DHCP, задача установки ОС по сети с помощью kickstart, а в завершение рассматривается система управления конфигурацией Salt.


Лекция 8. Резервное копирование





Начало лекции посвящено продолжению рассказа о системе управления конфигурацией Salt. Рассказывается, как её установить, как осуществляется управление конфигурацией Linux, разбирается её пример. Вы узнаете, что такое «зёрна» и зачем они нужны. Далее переходим к теме резервного копирования: какие данные нужно копировать, каковы основные трудности, какие бывают виды резервных копий. Обсуждается задача резервного копирования ОС. Рассказывается об использовании системы резервного копирования bacula.


Лекция 9. Резервное копирование (часть 2)





В начале лекции рассказывается о резервном копировании БД. Обсуждаются различные стратегии резервного копирования — mysqldump, mylvmbackup. Вы узнаете, для чего нужен мониторинг и как его выполнять, какие есть средства мониторинга. Рассматриваются разные виды проверок. Обсуждаются шаблоны проверок. В заключение рассказывается об элементах данных, о выполнении веб-мониторинга.


Лекция 10. Инфраструктура электронной почты





Вы узнаете, что такое электронная почта, познакомитесь с основными понятиями. Затем рассматривается процесс доставки и выдачи почты. Обсуждается использование протоколов SMTP, POP3 и IMAP. Разбирается применение SMTP-сервера postfix, IMAP-сервера Dovecot. Рассказывается о том, как ходят письма по сети и что такое MX-записи. Наконец, обсуждается защита от спама, разбираются SPF-записи, DKIM и Spamassassin.


Лекция 11. Распределение ресурсов системы





Лекция посвящена продвинутым вопросам администрирования Linux. Сначала вы узнаете, как управлять параметрами ядра ОС. Затем рассматриваются модули ядра, как ими управлять. Обсуждается выделение ресурсов приложения. Далее рассказывается о планировщике задач, об алгоритмах шедулинга, о приоритетах процессов. Разбирается шедулер CFS, политики шедулинга. Вы узнаете, что такое NUMA и как с ней работать. Познакомитесь с планировщиками ввода/вывода. Далее рассказывается о контрольных группах, об управляемых ресурсах, об управлении контрольными группами и лимитами ввода/вывода.




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


Другие курсы Технотрека на Хабре:



Информацию обо всех наших образовательных проектах вы можете найти в недавней статье.

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

https://habrahabr.ru/post/330782/


Метки:  

[Из песочницы] Динамический рендеринг компонентов в Angular 2

Вторник, 20 Июня 2017 г. 18:19 + в цитатник

Вступительное слово


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

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


Начальный проект находится по ссылке. Это angular 2+ приложение, к которому подключена библиотека для работ с картой leaflet.js. В MapService есть методы для создания карты, добавления маркеров на неё и центровки на маркерах. MapComponent – компонент для отображения карты. Для сборки проекта используется webpack 2. Если запустить приложение, то перед нами появится карта с маркером, к которому привязан popup следующего вида:

marker.bindPopup(`
    	    

Leaflet PopUp

Some text

Should be deleted from DOM if it was angular component because of ngIf = false

`);


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

Карта с открытым popup

В DOM находится элемент с текстом “Should be deleted from DOM...”, который хотелось бы удалить используя *ngIf, однако в popup просто так нельзя записать код ангуляра, чтобы он тут же заработал. Именно здесь на сцену выходит динамический рендеринг компонентов ангуляра.

Решение задачи


Для начала создадим компонент, который мы хотим динамически рендерить:

@Component({
    selector: 'custom-popup',
    template: require('./custom-popup.component.html')
})
export class CustomPopUpComponent {
	public inputData: any;

	private title: string = 'Angular component';
	private array: Array = ['this', 'array', 'was viewed', 'by', 'ngFor!'];
}

Его template:

{{title}}

{{inputData}}

{{text}}

Should be deleted from DOM if it was angular component because of ngIf = false


Далее создадим новый сервис dynamic-render.service.ts:

@Injectable()
export class RenderService {

	private componentRef: ComponentRef;

	constructor(private ngZone: NgZone,
	            private injector: Injector,
	            private appRef: ApplicationRef,
	            private componentFactoryResolver: ComponentFactoryResolver) { }

	public attachCustomPopUpsToMap(map: Map) {
		this.ngZone.run(() => {
			map.on("popupopen",
			       (e: any) => {
				       const popup = e.popup;

				       const compFactory = this.componentFactoryResolver.resolveComponentFactory(popup.options.popupComponentType);
				       this.componentRef = compFactory.create(this.injector);

				       this.componentRef.instance.geoObject = popup.options.object;

				       this.appRef.attachView(this.componentRef.hostView);

				       let div = document.createElement('div');
				       div.appendChild(this.componentRef.location.nativeElement);

				       popup.setContent(div);
			       });
		});
	}
}

Так как addListener запускается вне зоны ангуляра, нам нужно самим вручную добавить его туда. Таким образом каждый раз при открытии popup’а вызывается componentFactory, которая создаёт компонент, который мы прокинули в поле options. Далее мы можем с помощью instance этого компонента записать в его поля данные, которые мы так же можем прокинуть в options popup’а. В данном примере мы назначаем полю inputData компонента данные из options.data. Затем создаем div элемент, к которому прикрепляем наш только что созданный компонент и назначаем его в качестве контента popup’у.

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

 this.appRef.attachView(this.componentRef.hostView);

нужно будет написать

if (this.appRef['attachView']) {
	this.appRef['attachView'](this.componentRef.hostView);
	this.componentRef.onDestroy(() => {
		this.appRef['detachView'](this.componentRef.hostView);
	});
}
else {
	this.appRef['registerChangeDetector'](this.componentRef.changeDetectorRef);
	this.componentRef.onDestroy(() => {
		this.appRef['unregisterChangeDetector'](this.componentRef.changeDetectorRef);
	});
}

Запровайдим RenderService в MapModule. Также обязательно нужно добавить в MapModule в declarations и entryComponents наш CustomPopUpComponent. Вызовем renderService и добавим возможность для нашего элемента карты рендерить в popup’ах ангуляровские компоненты, после чего прикрепим к маркеру кастомный компонент:

this.renderService.attachCustomPopUpsToMap(this.mapService.getMap());
let options = {
		    data: 'you can provide here anything you want',
		    popupComponentType: CustomPopUpComponent
	    };
let myPopUp = L.popup(options);
marker.bindPopup(myPopUp);

В поле data прокинем данные для компонента, в popupComponentType – сам компонент. Такую конструкцию можно обернуть в интерфейс для удобства использования, но в рамках данного примера делать этого не будем, статья не об этом. Для корректного отображения немного подправим стили, после чего можно запускать приложение. Кликнув по маркеру, видим, что наш компонент среднерился в popup’е leaflet:

Наш компонент срендерился!

Заключение


Нам удалось значительно расширить функционал стандратных popup’ов leaflet в связке с angular 2+. В качестве бонуса наши компоненты получают анимацию открытия/закрытия, изменение размера при зуме и другие стандартные вещи leaflet.

Исходники проекта, в котором реализовано всё описанное в статье находятся здесь.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331298/


Метки:  

Рынок приложений для касс: первая конференция CHANGE

Вторник, 20 Июня 2017 г. 17:53 + в цитатник
«Программное обеспечение поглощает мир» – знаменитый постулат Марка Андриссена сегодня актуален как никогда. Возглавляют «революцию кода» разработчики – именно десятки тысяч приложений сделали iOS и Android универсальными платформами, на которых, кажется, есть решение для любой задачи. Однако на десятом году, кажется, мобайл начинает поглощать сам себя, и нужно искать новые рынки. Один из таких рынков совершенно неожиданно образовался благодаря нашему правительству.



Так в ритейле в ближайшие пять лет произойдут самые большие изменения за последние полвека. Можно много обсуждать своевременность и вопросы “честного отъема денег у бизнеса”, но факт остается фактом – появился новый огромный рынок для разработчиков объемом 2 — 2.5 миллиона живых и платящих компаний, которым требуются современные IT-решения. Это почти сравнимо с самим App Store и Google Pl ay. И все это – малый и средний бизнес России.

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

28 июня компания «Эвотор» проводит открытую конференцию по разработке приложений для собственной платформы, на которой уже работают более 100 000 предприятий, а через полтора года их будет уже более 500 000.

Что будет на конференции:

  1. Тренды ритейла
  2. Чего ждут предприниматели от Магазина приложений и разработчиков
  3. Примеры работающих приложений
  4. Live сoding
  5. Обучение для разработчиков
  6. Ну и, конечно, развлечения

Зарегистрироваться и получить подробную информацию о Evotor Change можно на сайте.

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

https://habrahabr.ru/post/331296/


Метки:  

[Из песочницы] Google Play и 2K установок в сутки без денежных вложений (+ статистика и доходы)

Вторник, 20 Июня 2017 г. 17:14 + в цитатник


Всем привет! Решил я поделиться с Вами опытом «бесплатного пиара» в Google Play, а именно способами для достижения 2K установок в день без денежных вложений. Вся статистика прилагается +информация о доходах

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

Статистика, указанная в статье, собрана с нового приложения, которое живет с 24 мая 2017

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

Бесплатное продвижение в Google Play


Начнем с того, что первые пару недель количество установок приложения обычно составляет 10 — 50 в сутки, и как показывает практика, это нормально. По прошествии 1/2/3 недель такого унылого хода, установки начинают расти. К примеру, в моем первом приложении, после застоя в пару недель, количество установок в день составляло около 500 — 1000.

Для достижения более 2К скачиваний на GP я предпринял действия описанные ниже:

1. Просьба поставить оценку приложению

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

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


Статистика оценок в приложении с напоминанием

2. В игре должен быть контент для продаж
Вкладка Источники трафика -> Отчеты по источникам трафика

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


Пример: показатели коэффициента конверсии

3. Следуйте советам по оптимизации
Вкладка Источники трафика -> Советы по оптимизации

Следуйте советам по оптимизации, это поможет адаптировать приложение к юзерам из других стран.


Окно советов от GP

4. Запускайте эксперименты

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

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


Результаты 3х дневного тестирования

Немного статистики о доходах


Статистика доход с рекламы AdMob



Статистика доход с продаж в приложении



Статистика установок



Спасибо за внимание, и удачи Вам с продвижением Ваших проектов!

P.S. Это моя самая первая статья, которую я когда-либо писал. Прощу прощения, если мой текст кому-то режет глаз.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331294/


Метки:  

Умеют ли коты строить регрессию?

Вторник, 20 Июня 2017 г. 17:04 + в цитатник
Доброго времени суток, Хабр! Пора вновь вернуться к задачам оптимизации. На этот раз мы займемся линейной регрессией и разберемся, кто же такие коты — только пушистые домашние мерзавцы животные или еще и неплохой инструмент для решения прикладных задач.


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

  • в проекте Algebras находятся реализация trait'а алгебры, в котором перечислены все основные операции, которые должны быть реализованы для объекта, наследующего его; кроме того, в данном проекте на текущий момент реализованы вещественная и интервальная алгебры,
  • в проекте Transformations находятся основные типы преобразований с соответствующими связями; в данном проекте было сделано дополнение свойств преобразований (например, численная дифференциуремость), что пригодится в дальнейшем при реализации алгоритмов оптимизации, использующих градиент,
  • в проекте Algorithms находятся основные классы алгоритмов; данный проект будет наполняться по мере выделения общих типов алгоритмов (пока здесь есть лишь алгоритм оптимизации вещественнозначных функций),
  • в проектах Metaheuristic Optimization и Machine Learning хранятся реализации алгоритмов оптимизации и машинного обучения соответственно,
  • в проекте Tools собраны различные процедуры, необходимые для функционирования работы алгоритмов (например, генераторы случайных чисел в соответствии с распределениями).

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

Итак, в этой работе мы поговорим:

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

Линейные модели регрессии и как их свести к задаче оптимизации


Начнем с формулирования задачи регрессии.

Пусть имеется набор измерений, который удобно представить в виде матрицы:

$X\in\mathbb{R}^{m\times n},$

т.е. каждое измерение $x_i=\left(x_{i,1},x_{i,2},\dots,x_{i,n}\right)^T$ представляется вектором из $\mathbb{R}^n$. Также имеется набор значений зависимой переменной

$Y\in\mathbb{R}^m.$

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

$f\left(\cdot,\theta\right):\mathbb{R}^n\rightarrow\mathbb{R},$

где $\theta\in\mathbb{R}^p$ — вектор параметров модели, т.ч. $f\left(x_i,\theta\right)=\hat{y}_i\approx y_i, \forall i=1,\dots,n$. Очевидно, что задача аппроксимации и регрессии тесно связаны.

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

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

Код общей модели линейной регрессии
trait GeneralizedLinearModel {

  def getWeights(): Vector[Real]

  def apply(v: Vector[Real]): Real = getWeights().dot(v + bias)

  def apply(vectors: Seq[Vector[Real]]): Seq[Real] = vectors.map(this.apply(_))

  def convertToTransformation(): InhomogeneousTransformation[Vector[Real], Real] =
    new InhomogeneousTransformation[Vector[Real], Real](v => this.apply(v))

}

object GeneralizedLinearModel {

  val bias = Vector("bias" -> Real(1.0))

  object Metrics {

    def RSS(generalizedLinearModel: GeneralizedLinearModel, input: Seq[Vector[Real]], output: Seq[Real]): Real = {
      val predictions = generalizedLinearModel(input)
      predictions.zip(output)
        .map { case (pred, real) => (pred - real) ^ 2.0 }
        .reduce(_ + _) / input.length
    }
  }

}
В самом trait'е определены:
  • метод, возвращающий веса модели регрессии,
  • apply — метод, рассчитывающий значение зависимой переменной на основе полученного входа,
  • конвертация к неоднородному преобразованию.

В одноименном объекте имеются
  • константа, отвечающая за сдвиг,
  • метрика RSS.


Ordinary Least Squares


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

$\hat{y}_i=f\left(x_i,\theta\right)=\theta_0+\sum_{j=1}^{n}\theta_j x_{i,j},$

из которой видно, что размерность вектора $\theta$ равна размерности вектора измерений плюс один. Нулевая компонента называется смещением (bias term или intercept term). По аналогии с простой функцией $f\left(x\right)=a+bx$, где константа $a$ отвечает за смещение графика относительно оси абсцисс.

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

$\hat{y}_i=f\left(x_i,\theta\right)=\theta\cdot\left(1,x_{i,1},\dots,x_{i,n}\right)^T.$


Удобно поставить задачу поиска оптимального значения вектора параметров $\theta$ с помощью остаточной суммы квадратов (RSS, residual sum of squares)

$\theta^*=Arg\min_{\theta}\sum_{i=1}^{n}\left(y_i-f\left(x_i,\theta\right)\right)^2.$

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

$\theta^*=\left(\tilde{X}^T\cdot\tilde{X}\right)^{-1}\cdot\tilde{X}^T\cdot Y,$

где матрица $\tilde{X}$ получается из матрицы $X$ путем добавления слева столбца, состоящего из единиц.

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

Ordinary Least Squares
case class OrdinaryLeastSquaresRegression(w: Vector[Real]) extends GeneralizedLinearModel {

  override def getWeights(): Vector[Real] = w

}

object OrdinaryLeastSquaresRegression {

  class Task(input: Seq[Vector[Real]], output: Seq[Real]) extends General.Task {

    def toOptimizationTask(searchArea: Map[String, (Double, Double)]): (Optimization.Real.Task, InhomogeneousTransformation[Vector[Real], OrdinaryLeastSquaresRegression]) = {
      val vectorToRegressor =
        new InhomogeneousTransformation[Vector[Real], OrdinaryLeastSquaresRegression]((w: Vector[Real]) => OrdinaryLeastSquaresRegression(w))
      val task = new Optimization.Real.Task(
        new Function[Real]((w: Vector[Real]) =>
          GeneralizedLinearModel.Metrics.RSS(vectorToRegressor(w), input, output)), searchArea)
      (task, vectorToRegressor)
    }
  }

}


Ridge & Lasso Regression


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

Ridge regression (гребневая регрессия) использует L2 регуляризацию параметров модели:

$\theta^*=Arg\min_{\theta}\sum_{i=1}^{n}\left(y_i-f\left(x_i,\theta\right)\right)^2+\alpha\left|\left|\left(\theta_1,\dots,\theta_n\right)^T\right|\right|_2^2,$

где $\left|\left|\left(\theta_1,\dots,\theta_n\right)^T\right|\right|_2=\sqrt{\sum_{j=1}^{n}\theta_j^2}$ — L2 норма. Параметр $\alpha$ отвечает за сжатие коэффициентов: с увеличением $\alpha$ параметры модели стремятся к нулю. Наглядно это очень хорошо продемонстрировано на официальном сайте пакета scikit:


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

$\theta^*=\left(\tilde{X}^T\cdot\tilde{X}+\alpha\cdot \tilde{E}_{n+1}\right)^{-1}\cdot\tilde{X}^T\cdot Y,$

где $\tilde{E}_{n+1}$ — единичная матрица порядка $n+1$, в левом верхнем углу которой находится ноль.

Ridge Regression
class RidgeRegression(w: Vector[Real], alpha: Double) extends OrdinaryLeastSquaresRegression(w) { }

object RidgeRegression {

  class Task(input: Seq[Vector[Real]], output: Seq[Real]) extends General.Task {

    def toOptimizationTask(searchArea: Map[String, (Double, Double)], alpha: Double): (Optimization.Real.Task, InhomogeneousTransformation[Vector[Real], RidgeRegression]) = {
      val vectorToRegressor =
        new InhomogeneousTransformation[Vector[Real], RidgeRegression]((w: Vector[Real]) => new RidgeRegression(w, alpha))
      val task = new Optimization.Real.Task(
        new Function[Real]((w: Vector[Real]) =>
          GeneralizedLinearModel.Metrics.RSS(vectorToRegressor(w), input, output) +
            alpha * w.components.filterKeys(_ != "bias").values.map(_ ^ 2.0).reduce(_ + _)), searchArea)
      (task, vectorToRegressor)
    }
  }

}


Для Lasso Regression постановка задачи похожая, разница заключается в том, что теперь используется L1 регуляризация параметров модели:

$\theta^*=Arg\min_{\theta}\frac{1}{2m}\cdot\sum_{i=1}^{n}\left(y_i-f\left(x_i,\theta\right)\right)^2+\alpha\left|\left|\left(\theta_1,\dots,\theta_n\right)^T\right|\right|_1,$

где $\left|\left|\left(\theta_1,\dots,\theta_n\right)^T\right|\right|_1=\sum_{j=1}^{n}\left|\theta_j\right|$ — L1 норма

Lasso Regression
class LassoRegression(w: Vector[Real], alpha: Double) extends OrdinaryLeastSquaresRegression(w) { }

object LassoRegression {

  class Task(input: Seq[Vector[Real]], output: Seq[Real]) extends General.Task {

    def toOptimizationTask(searchArea: Map[String, (Double, Double)], alpha: Double): (Optimization.Real.Task, InhomogeneousTransformation[Vector[Real], LassoRegression]) = {
      val vectorToRegressor =
        new InhomogeneousTransformation[Vector[Real], LassoRegression]((w: Vector[Real]) => new LassoRegression(w, alpha))
      val task = new Optimization.Real.Task(
        new Function[Real]((w: Vector[Real]) =>
          GeneralizedLinearModel.Metrics.RSS(vectorToRegressor(w), input, output) / (2.0 * input.length) +
            alpha * w.components.filterKeys(_ != "bias").values.map(Algebra.abs(_)).reduce(_ + _)), searchArea)
      (task, vectorToRegressor)
    }
  }

}


Таким образом, с точки зрения оптимизации, Ridge regression и Lasso Regression отличаются лишь способом постановки задачи минимизации.

Cat Swarm Optimization


Как уже стало ясно из названия, алгоритм имитирует поведение животных семейства кошачьих (в том числе и домашних кошек). Что Вы можете сказать о своем домашнем любимце? Он может отыгрывать роль милого лежебоки (хотя мы на самом деле знаем, какие коварные мысли роятся в его голове), может вообразить себя великим (но осторожным) исследователем, а может просто носиться по квартире за несуществующим (а точнее невидимым вам) соперником. Лежащих и недвижимых словно Великая Китайская стена котов мы оставим в покое, пусть себе отдыхают, а вот на последних двух действиях остановимся подробнее. Для любого алгоритма оптимизации хорошо иметь несколько стадий поиска: глобального, в ходе которого мы должны попасть в область притяжения локального экстремума (а в идеале — глобального), и уточняющего, в ходе которого мы должны придвинуться из окрестности экстремума ближе к его истинному расположению. Ничего не напоминает? В самом деле, коты, гоняющиеся за незримым врагом, — явные кандидаты на реализацию процедуры глобального поиска, а вот аккуратные исследователи помогут вам найти оптимальное место для отдыха. Эти две эвристики лежат в основе алгоритма Cat Swarm Optimization. Для полной картины остается представить, что у вас не один кот, а целая стая. Но так ведь даже лучше, верно?

Псевдокод алгоритма представлен ниже:

Шаг 1. Инициализировать популяцию из N котов.
Шаг 2. Определить приспособленность каждого кота на основе его позиции в исследуемом пространстве. Запомнить "лучшего" кота (в терминологии задачи минимизации, ему будет соответствовать наименьшее значение функции).
Шаг 3. Переместить котов в соответствии с их процедурой смещения (поиск или погоня).
Шаг 4. Заново присвоить котам режимы перемещения в соответствии с параметром MR.
Шаг 5. Проверить условие окончания работы. В случае его невыполнения перейти к шагу 2.

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

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

Параметры, влияющие на работу алгоритма
class CatSwarmOptimization(numberOfCats: Int, MR: Double,
                           SMP: Int, SRD: Double, CDC: Int, SPC: Boolean,
                           velocityConstant: Double, velocityRatio: Double,
                           generator: DiscreteUniform with ContinuousUniform = Kaimere.Tools.Random.GoRN) extends Algorithm

  • количество котов (numberOfCats) — чем больше котов, тем дольше время работы алгоритма (если его ограничивать количеством итераций), но и потенциально большая точность найденного ответа,
  • пропорция котов в режиме поиска и погони (MR) — данный параметр позволяет направлять поиск по той стратегии, которую пользователь считает предпочтительной; например, если вы заведомо знаете окрестность, в которой лежит глобальный оптимум, то логично инициализировать популяцию в этой окрестности и поддерживать большее число котов-исследователей в популяции для уточнения первоначального решения,
  • количество попыток для режима поиска (SMP) — сколько разных смещений будет производить кот-исследователь; большие значения данного параметра увеличивают время одной итерации, но позволяют увеличить точность определения положения экстремума,
  • доля смещения для режима поиска (SRD) — доля, на которую кот-исследователь смещается относительно своего текущего положения, большие значений смещают уточняющий поиск в сторону глобального,
  • количество направлений, по которым ведется поиск (CDC) — данный параметр регулирует количество измерений, которые будут изменять у текущего положения кота, находящегося в режиме поиска; меньшие значения делают поиск покоординатным,
  • желание остаться на старом месте (SPC) — булева переменная, которая позволяет выбирать, может ли кот-исследователь остаться не текущем месте,
  • константа скорости (velocityConstant) — определяет степень поворотливости кота во время погони; большие значения быстрее меняют текущий вектор скорости кота,
  • максимальная скорость (velocityRatio) — все-таки вы в доме хозяин, поэтому в случае если кто-то из котов слишком уж разогнался, то вы вполне можете на него прикрикнуть,
    чтобы он притормозил, т.о. данный параметр ограничивает максимальную скорость движения котов.


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

Во время режима поиска из текущего положения $l\in\mathbb{R}^n$ генерируются новые возможные положения $\left\{l^k\right\}_{k=1}^N$. Новое положение выбирается выбирается по методу рулетки, где вероятность выборка $k$-го положения определяется по формуле

$p^k=\frac{\displaystyle\left|\max_{j=1,\dots,N}f\left(l^j\right)-f\left(l^k\right)\right|}{\displaystyle\max_{j=1,\dots,N}f\left(l^j\right)-\min_{j=1,\dots,N}f\left(l^j\right)}.$

Для задачи максимизации максимум в числителе следует заменить на минимум.

Теперь немного о том, как реализуется погоня. Чтобы не пугать хозяина, все-таки следует гоняться не за вымышленным врагом, а за вполне реальным — котом, который на данный момент нашел себе лучшее место (его позиция будет обозначаться $\tilde{l}$). Скорость кота меняется по следующему правилу:

$v^k=v^k+\xi\cdot c\cdot\left(\tilde{l}-l^k\right),$

где $\xi\sim U\left(0,1\right)$ — равномерно распределенная случайная величина, а $c$ — константа скорости (та самая, которая отвечает за поворотливость). Новое положение кота рассчитывается следующим образом: $l^k=l^k+v^k$.

Реализация кота
case class Cat(location: Vector[Real], velocity: Vector[Real])(implicit generator: DiscreteUniform with ContinuousUniform) {

  def getFromSeries[T](data: Seq[T], n: Int, withReturn: Boolean): Seq[T] =
    withReturn match {
      case true => Seq.fill(n)(generator.getUniform(0, data.size - 1)).map(x => data(x))
      case false => data.sortBy(_ => generator.getUniform(0.0, 1.0)).take(n)
    }

  def seek(task: Task, SPC: Boolean, SMP: Int, CDC: Int, SRD: Double): Cat = {

    val newLocations = (if (SPC) Seq(location) else Seq()) ++
      Seq.fill(SMP - (if (SPC) 1 else 0))(location)
        .map { loc =>
          val ratio =
            getFromSeries(task.searchArea.keys.toSeq, CDC, false)
              .map { key => (key, generator.getUniform(1.0 - SRD, 1.0 + SRD)) }.toMap
          (loc * ratio).constrain(task.searchArea)
        }

    val fitnessValues = newLocations.map(task(_)).map(_.value)
    val newLocation =
      if (fitnessValues.tail.forall(_ == fitnessValues.head)) newLocations(generator.getUniform(0, SMP - 1))
      else {
        val maxFitness = fitnessValues.max
        val minFitness = fitnessValues.min
        val probabilities = fitnessValues.map(v => (maxFitness - v) / (maxFitness - minFitness))
        val roulette =
          0.0 +: probabilities.tail
            .foldLeft(Seq(probabilities.head)) { case (prob, curr) => (curr + prob.head) +: prob }
            .reverse
        val chosen = generator.getUniform(0.0, roulette.last)
        val idChosen = roulette.sliding(2).indexWhere{ case Seq(a, b) => a <= chosen && chosen <= b}
        newLocations(idChosen)
      }
    new Cat(newLocation, newLocation - this.location)
  }

  def updateVelocity(bestCat: Cat, velocityConstant: Double, maxVelocity: Map[String, Double]): Vector[Real] = {
    val newVelocity = this.velocity + (bestCat.location - this.location) * velocityConstant * generator.getUniform(0.0, 1.0)
    Vector(newVelocity.components
      .map { case (key, value) =>
        if (value.value > maxVelocity(key)) (value, Real(maxVelocity(key)))
        if (value.value < -maxVelocity(key)) (value, Real(-maxVelocity(key)))
        (key, value)
      })
  }

  def trace(task: Task, bestCat: Cat, velocityConstant: Double, maxVelocity: Map[String, Double]): Cat = {
    val newVelocity = this.updateVelocity(bestCat, velocityConstant, maxVelocity)
    val newLocation = (location + newVelocity).constrain(task.searchArea)
    new Cat(newLocation, newVelocity)
  }

  def move(mode: Int, task: Task, bestCat: Cat, SPC: Boolean, SMP: Int, CDC: Int, SRD: Double, velocityConstant: Double, maxVelocity: Map[String, Double]): Cat = mode match {
    case 0 => seek(task, SPC, SMP, CDC, SRD)
    case 1 => trace(task, bestCat, velocityConstant, maxVelocity)
  }
}


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

Так умеют ли коты строить регрессию или нет?


Сгенерируем несколько тестовых наборов данных (в тетрадке также есть расчет с моделей регрессий с помощью scikit):

  1. одномерная линейная зависимость без шума: $y=2+3\cdot x$,
    • параметры модели Ordinary Least Squares: $\theta=\left(2.001, 3.001\right)^T$,
    • параметры модели Ridge Regression ($\alpha=0.7$): $\theta=\left(2.0008, 2.9993\right)^T$,
    • параметры модели Lasso Regression ($\alpha=0.7$): $\theta=\left(1.997, 2.976\right)^T$,
  2. многомерная линейная зависимость без шума: $y=x_1-2\cdot x_2+3\cdot x_3-4\cdot x_4+5\cdot x_5$,
    • параметры модели Ordinary Least Squares: $\theta=\left(0.018, 0.999, -1.9999, 3.005, -3.994, 5.002\right)^T$,
    • параметры модели Ridge Regression ($\alpha=0.7$): $\theta=\left(0.025, 1.003, -2.002, 2.998, -3.997, 4.999\right)^T$,
    • параметры модели Lasso Regression ($\alpha=0.7$): $\theta=\left(0.011, 0.972, -1.989, 2.995, -3.969, 4.971\right)^T$,
  3. одномерная линейная зависимость с шумом: $y=2+3\cdot x+\xi$,
    • параметры модели Ordinary Least Squares: $\theta=\left(2.124, 3.06\right)^T$,
    • параметры модели Ridge Regression ($\alpha=0.7$): $\theta=\left(2.121, 3.061\right)^T$,
    • параметры модели Lasso Regression ($\alpha=0.7$): $\theta=\left(2.093, 3.039\right)^T$,
  4. многомерная линейная зависимость с шумом: $y=x_1-2\cdot x_2+3\cdot x_3+\xi$,
    • параметры модели Ordinary Least Squares: $\theta=\left(0.073, 0.889, -2.005, 2.949\right)^T$,
    • параметры модели Ridge Regression ($\alpha=0.7$): $\theta=\left(-0.068, 0.884, -2.004, 2.945\right)^T$,
    • параметры модели Lasso Regression ($\alpha=0.7$): $\theta=\left(-0.082, 0.857, -1.982, 2.921\right)^T$,
где $\xi\sim U\left(-5,5\right)$ — равномерно распределенная случайная величина.

Результаты, полученные с помощью пакета scikit для данных с шумом
Для одномерной линейной зависимости с шумом:

Для многомерной линейной зависимости с шумом:


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

Заключение


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

Ссылки и литература

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

https://habrahabr.ru/post/328760/


Метки:  

[Из песочницы] Автоматизация тестирования Windows-приложений с использованием Winium

Вторник, 20 Июня 2017 г. 15:27 + в цитатник

С чем едят


С помощью Winium мы можем автоматизировать обычные Windows-приложения. Как правило, Winium может работать с теми элементами, которые можно отыскать в окнах стандартными Windows-средствами (как правило, эти элементы имеют tab-ордер). Средства эти поставляются в стандартных китах (скачать, например, можно тут, после установки искать их, например, здесь: C:\Program Files (x86)\Windows Kits\8.1\bin\x64). Наиболее удобными для себя я считаю inspect и uiverify, но на вкус и цвет, как говорят некоторые мои товарищи, все фломастеры разные.

Однако, для того, чтобы автоматизировать самописные приложения, неплохо было бы товарищам разработчикам следить за тем, чтобы у элементов были адекватные ClassName, Name и AutomationId. Конечно, в определённых ситуациях нас могут спасти передачи нажатий определённых клавиш и щёлканье мышкой по координатам, но это не панацея. Лучше всегда иметь набор заранее заготовленных «рычагов» в виде описаний объектов, чем полагаться на то, что GUI всегда будет неизменным и будет себя хорошо вести в различных ситуациях.

С Winium в нормальном режиме можно общаться посредством Selenium с использованием Python и Java; так или иначе, но звёзды встали так, что выбор пал на Java.

Установка


Во-первых, нам потребуется Winium Desktop Driver. Скачать его можно, например, тут. От нас потребуется это дело разархивировать и запускать при тестах. Через него Selenium сервер будет общаться с Windows-приложениями.

Во-вторых, собственно, Java-IDE (использовалась IntelliJ IDEA Community, за что им отдельное большое спасибо) и JDK. Не забываем проверить/прописать переменную среды JAVA_HOME со значением пути до JDK (в моём случае — C:\Program Files\Java\jdk1.8.0_131).

В-третьих, нужен нам и Selenium сервер — идем сюда, качаем Selenium Standalone Server (JAR-файл).

Далее по настройке проекта — создаём новый Java-проект и добавляем в External libraries (кликаем по кнопке Project Structure (или Ctrl+Alt+Shift+S), там в Project Settings выбираем Libraries и нажимаем плюсик) наш селениумный JAR-файл. На этом всё, можно писать.

Использование


Для того, чтобы всё работало, нужно на время использования тестов запускать Winium.Desktop.Driver с админскими правами. Но, так как драйвер время от времени может подвисать по тем или иным причинам, удобно его запускать перед каждым тестом и в конце убивать. Например, для этой цели можно использовать ProcessBuilder:

ProcessBuilder pro = new ProcessBuilder(windriverPath + windriverName, windriverParam);
shell = pro.start();
//<наш код>
shell.destroy();

где для удобства развёртывания можно задавать windriverPath, windriverName – путь до драйвера и имя исполняемого файла; windriverParam – дополнительные параметры запуска, ежели таковые потребуются.

В начале начал в коде нужно прикрепить переменную драйвера к собственно Winium драйверу:

DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability("app",""); //если хотим сразу запускать какую-либо программу
cap.setCapability("launchDelay","5"); //задержка после запуска программы
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:9999"),cap); //на этом порту по умолчанию висит Winium драйвер

Если мы не хотим запускать какое-то приложение, а просто прикрепляться к какому-либо уже запущенному, то 2 и 3 строчки можно смело опустить.

Для того, чтобы нам работать с каким-либо элементом, нам сначала нужно к нему прикрепиться. Известны три механизма прикрепления – By.name – по полю Name, By.className — по полю ClassName и By.xpath для более изощрённых условий поиска. Также если нам нужен первый/единственный элемент, мы можем использовать метод findElement, а если мы хотим получить список всех таких элементов, то нам нужно использовать метод findElements. Во втором случае элементы будут добавлены в порядке tab-ордера. Примеры использования:


WebElement wrk = driver.findElement(By.name("Значение поля Name")); //один элемент, поиск по полю Name
List wrkL = driver.findElements(By.className("Значение поля ClassName")); //список элементов с заданным полем ClassName

Так же мы можем прикрепляться к элементам другого элемента:


WebElement wrk1 = wrk.findElement(By.name("Значение поля Name"));

Если первые два механизма прикрепления очень узкоспециализированы, т.е. работают строго в иерархической структуре и строго с полями Name и ClassName, то для работы с иными случаями нам потребуется третий механизм, а именно By.xpath.

В этом механизме всё строго по канонам использования xpath (во всяком случае, с использованных случаях всё работало как нужно). С помощью xpath можно получить и обрабатывать поля IsOffscreen, AutomationId, HasKeyboardFocus:


WebElement field = wrk.findElement(By.xpath("*[@HasKeyboardFocus='True']")); //найдёт элемент у wrk, на котором стоит фокус

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


String xpathStr = "*[(@AutomationId='" + autId + "') and (@IsOffscreen='False')]"; //будем искать элемент у текущего окна с каким-то заданным AutomationId = autId и у которого свойство IsOffscreen = False 
log("Performing xpath search: " + xpathStr);
WebElement tWrk = wrk1.findElement(By.xpath(xpathStr));

Конечно же, мы можем искать xpath'ом элементы не только текущего окна, но такой поиск может длиться достаточно продолжительное время.

Есть еще другие способы поиска, но, так или иначе, все сводятся к описанным выше. Например, такие.

Также нам может потребоваться имитация ввода клавиш с клавиатуры. В обычном порядке это делается методом sendKeys(«Последовательность символов») у элемента. Однако, следует помнить, что некоторые символы используются как служебные и их надо экранировать (например, "+" это Shift, и для того, чтобы ввести "+", нужно передать последовательность "+="). Для удобства пользования кодом можно написать обёртку, которая бы автоматически заменяла все "+" на "+=", но тут как кому удобнее. Подробнее ознакомиться со стандартами передач комбинаций клавиш можно, например, тут. Тем не менее, возникали проблемы с корректной передачей нажатий стрелок на клавиатуре, так что к сожалению, при текущей версии драйвера придётся искать обходные пути.

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


Actions builder = new Actions(driver);
Action enter = builder
        .moveToElement(wrk)
        .moveByOffset(x,y)
        .click()
        .build();
enter.perform();

где wrk – имя WebElement, от центра которого будем двигать мышкой; x, y – расстояние, на которое будем двигать (положительное значение x двигает курсор вправо, положительное y – вниз).

Совсем чуть-чуть об общей структуре проекта


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

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

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

Заключение


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

https://habrahabr.ru/post/331292/


Метки:  

Новые технотренды в сфере финансов: зачем нужны чат-боты

Вторник, 20 Июня 2017 г. 15:13 + в цитатник


Изображение: Thomson Reuters

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

Как это работает: примеры банковских чат-ботов


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



Финансовая организация также запустила виртуального ассистента Alexa Skill для Amazon Echo и планирует первой запустить аналогичный продукт для Cortana от Microsoft.

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



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

Финансовая медиакомпания Thomson Reuters заявляет о том, что работает над внедрением функциональности чат-ботов в свою коммуникационную платформу Eikon.

Не только банки: боты для биржевых трейдеров


Наиболее распространенной функцией чат-ботов в сфере биржевой торговли на данный момент является информационная. Ботов используют для оперативного получения финансовой информации. Например, бот Letstock транслирует в Facebook Messenger информацию о текущей стоимости акций («сколько сегодня стоит Apple») и финансовые новости.



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

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



Схема работы такого бота

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



Помимо получения цен акций и размещения приказов на покупку и продажу, боты могут решать и другие задачи. Например, компания Polly Portfolio специализируется на вопросах повышения финансовой грамотности и помощи начинающим инвесторам. Организация запустила бота PollyChat для Facebook Messenger — он задает пользователю вопросы о его отношении к текущим новостям и на основе ответов создает финансовый профиль, в котором объединены рекомендации по финансовым операциям и подбору инструментов для торговли.



Заключение: живое общение в финансах слишком важно


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

Даже самым умным ботам не хватает возможностей понимания человеческих потребностей, особенно связанных со сложными вопросами принятия финансовых решений. Поэтому ждать того, что финансовые чат-боты станут лучшим другом инвесторов и трейдеров не стоит, сходятся во мнении опрошенные New York Times эксперты.

Популярностью продолжат пользоваться коммуникационные системы, позволяющие обсуждать финансовые вопросы непосредственно с людьми — такие, как, например, система «ЛИСА» от ITinvest.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331290/


Метки:  

[Из песочницы] CameraTablet — как сделать графический планшет при помощи веб-камеры

Вторник, 20 Июня 2017 г. 14:35 + в цитатник
Здравствуйте, меня зовут Дмитрий. Здесь я хочу рассказать о том, почему меня не устраивает мышка, и как я пытаюсь ее заменить. Я разрабатываю CAE-программы для инженеров (расчет статики и динамики механических систем), треть рабочего времени я работаю как project manager, а в остальное время я — системный архитектор, разработчик и тестер в своем и в чужих проектах. У меня всегда открыты десять-двадцать окон, между которыми мне приходится постоянно прыгать:

  1. Visual Studio – собственно, софт, обычно три-четыре разных solution
  2. SourceSafe – версионирование.
  3. Outlook
  4. Skype
  5. Total Commander – файлы, файлы.
  6. Internet-Explorer – планирование софта, мониторинг продвижения по проекту, doxygen документация и т.д.
  7. Word, Excel – список задач, протоколы заседаний, требования к проекту, быстрое построение графиков и т.д.
  8. PowerPoint – презентации для менеджмента.
  9. Notepad++ — просмотр промежуточных результатов, конфиги, и т.д.
  10. CAE soft наш – тестовая и основная версия.
  11. CAE soft других фирм – для тестов

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

В итоге весь мой рабочий день – это постоянное метание между мышкой и клавиатурой:

  • Мышка: открыть документ, пролистать,
  • Клавиатура: написать три-четыре строчки.
  • Мышка: нажать на кнопку, переместиться в другую программу, нажать на кнопку
  • Клавиатура: в появившемся окне написать 2-3 значения.
  • Мышка: отрыть другое окно. Нажать на кнопку. Выбрать пункт меню. Потом пункт в под-меню. Потом в под-под-меню. Клик! Новое окно!

В один прекрасный момент моя правая рука сказала: «Извини, хозяин, но что-то нагрузка для меня великовата». Кисть болела почти два месяца, сначала слабо, потом все сильнее. В итоге я купил вертикальную мышку, выучил побольше шорткатов в Visual Studio и перешел на Total Commander.

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

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

Есть еще программы и железо для трекинга глаз, вроде Camera Mouse или Tobii Eye Trackers. Честно, тратить сотню баксов на Tobii Eye Tracker не хотелось, а Camera Mouse очень плохо распознавало положение глаз (подозреваю, что виноваты мои очки).

Программа CameraTablet


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





Как сделан CameraTablet


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

  1. opencv
    • распознавание пальца на видео
    • сохранение файла с фотографией пальца
    • калибровка камеры
  2. keyboard – обработка горячих клавиш
  3. TkInter — пять кнопок для GUI.

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

Что дальше


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

Фич, которых на данный момент нет, но которые очень хочется сделать:

  1. Поддержка нескольких мониторов
  2. Эмуляция MouseDown und MouseUp (необходимо для выделения текста)
  3. Поддержка Linux

И тут наступил самый тяжелый момент, когда самое вкусные 20% дела уже сделаны, а в одиночку дальше пилить 80% не хочется. Тогда я и решил, что пришла пора все выложить на GitHub, благо я давно мечтал сделать что-нибудь open source. Буду очень рад, если кто-нибудь захочет принять участие проекте (тестирование, программирование, документация – все, что угодно). И, конечно, было бы интересно послушать мысли на тему интерфейсов человеко-машинных интерфейсов вообще и альтернативы мышам в частности.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331288/


Метки:  

Антипаттерны для поиска соискателей

Вторник, 20 Июня 2017 г. 14:30 + в цитатник

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


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


Оформление вакансии


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


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


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


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


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


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


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


Обязательно напишите, что скоро вы переезжаете в США или куда-нибудь ещё, куда обычно хотят программисты. Это безопасно. "Скоро" — это понятие растяжимое, обычно означает "как только мы внезапно получим кучу денег и будем купаться в них как Скрудж Макдак". Ну и что, что это в лучшем случае в перспективе пары лет. Может же случиться. Везёт же некоторым! Так что ваш стартап — убийца Фейсбука и Гугла одновременно — обязательно взлетит.


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


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


Обязательно сделайте необходимым добавление сопроводительного письма, где разработчик напишет, почему хочет идти именно к вам. Он же идёт не просто деньги за свою работу получать, а к Вам! Пускай обоснует, хотя бы символов на 500. Тех, кто пишет "хочу работать, у вроде подходящая вакансия" можно сразу отфильтровывать.


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


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


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


Не забудьте написать в описании вакансии, что у вас есть печеньки. А ещё Agile и Scrum. Это так оригинально!


Автоматическое письмо откликнувшемуся


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


Поиск соискателей


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


  • Не совпадает зарплатные вилка в два раза? Не беда — вдруг он завышает требования или очень захочет работать в вашем стартапе?
  • Хочет на ведущего разработчикам а у вас вакансия Джуниора? Ну так пускай губу закатит.
  • Хочет заниматься бэкендом, а у вас фронтенд? Ну так выше же говорили, что разработчик должен быть только фуллстыком (или как оно там. Короче, должен уметь Винду переставить и кофемашину починить).

В общем, у вас и так мало времени, а ваш KPI измеряется количеством соискателей, которые вы найдёте. Шлите всех, и пускай там уже высоколобые разработчики разбираются, подойдёт ли Javascript разработчик под Java, или 1C разработчик под C#.


Работа с соискателем


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


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


Тестовые задания


Помните про тестовые задания! Надо же как-то людей фильтровать. Принято давать три категории тестовых заданий:


  1. Типовое задание, скачанное с интернета. Не беда если оно скучное — соискатель к вам не развлекаться идёт. Не имеет значения, что решение уже опубликовано на сотне ресурсов — наверняка же искать не станет. А на случай если станет — добавьте в тестовое задание таймер — все говорят мол “креатора дедлайн возбуждает”.
  2. Какое-нибудь сложное задание, чтобы соискатель показал себя во всей красе. Рассчитывайте, чтобы он потратил на него дня 2-3. В конце концов, он хочет у вас работать или нет?
  3. Последняя категория, которая в последнее время теряет популярность — взять некую текущую задачу вашей компании и попросить соискателя её сделать. Так сказать, протестировать в условиях приближенных к боевым. А на самом деле, можно использовать такие задания как бесплатный аутсорс. Круто же! Странно, что в последнее время вижу такие тестовые задания всё реже.

Личные собеседования


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


  • Вы же знаете, что в гости прилично опаздывать на 15 минут? Ну и здесь так же. Начинайте собеседование через 15-30 минут после назначенного срока, это даст кандидату лучше подготовиться и успокоиться.
  • Если собеседование подразумевает подключение дополнительных людей, начинайте их искать в момент наступления собеседования. Не надо людей отвлекать заранее.
  • Для собеседования нужно хотя бы 4-5 человек, кроме самого соискателя. Им же потом вместе работать, так что пускай его оценивает вся команда, на первом же собеседовании. Они же просто сидят на стульях весь рабочий день — так пускай потратят его с пользой. Если вы привлекаете 5 человек и проводите хотя бы 3 полуторачасовых собеседования в неделю, то за неделю они проводят с пользой уже 3х5х1.5=22 часа, то есть почти три человеко-дня.
  • Не стоит тратить время на то, чтобы заранее вспомнить или приготовить резюме кандидата. В первые полчаса все и так вспомнят, кто он, на какую позицию пришёл, и он расскажет своё резюме ещё раз.
  • Плох тот программист, который не готов писать код на бумажке. Пускай покажет, что может не только писать код в среде, которая всё за него делает. Причём писать обязательно нужно рабочий код на вашем конкретном языке, а не какие-то там Блок схемы (ну причём тут Александр?).
  • Наверняка соискатель пришёл к вам с ощущением, что он крутой и достоин многого. Даже если так, вам явно не хочется за него переплачивать — так что найдите в его резюме что-то, чем он занимался десять лет назад, и задайте вопросов посложнее. Пускай поймёт, что у вас он может только унитазы чистить.
  • Собеседований обязательно должно быть несколько. Например, первое происходит с HR, второе с разработчиком, третье с лидом, четвёртое со всей командой, и пятое — с генеральным директором. Никуда не торопитесь, соискатель — он не волк, в лес не убежит.
  • Если нужно перенести время собеседования, то сделайте это за полчаса до прихода кандидата. Ну нельзя же учесть заранее все возможные факторы.
  • Если кандидат сказал что-то, что вы не ожидали, то можно дружно посмеяться. Это очень разряжает атмосферу!
  • Если собеседование удалённое, то попросите соискателя включить камеру, а сами не включайте. Это ведь вы на него смотрите, а не он на вас.
  • Всякая роскошь вроде гарнитуры совсем не обязательна для собеседования. Эхо, шумы офиса, переговоры вокруг — это нормальная рабочая обстановка.
  • Если вам потребовалось во время собеседования выйти — смело делайте это. Можно оставить кандидату задачку и уйти на час-два. Пускай неспешно её решает и попьёт растворимый кофе из стаканчика, который ему любезно предложили.
  • Чуть не забыл. На любом собеседовании обязательно нужно спросить про паттерны. И попросить реализовать синглтон. Наверное, нужно было поставить это первым пунктом.

Если вам понравился кандидат, и вы во всём сошлись, то не забудьте поторговаться. У вас ведь в описании вакансии указано “до ххх”. Так что вы никого не обманете, если предложите “ххх:2”. Люди — это как арбузы на рынке, только люди. Принципы торговли те же. Если после вашего предложения соискатель пропал — ну, значит, он просто не мотивирован с вами работать и сам виноват.


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


Ну и последнее. Если вам не понравился соискатель, то просто забейте на переписку. Зачем терять своё время на человека, который вам не подходит?


Следуйте этим советам, и вы обязательно не найдёте себе нужного разработчика!




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


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


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


Указывайте в комментариях свои антипаттерны — давайте дополним список!

Со сколькими из указанных антипаттернов вы уже сталкивались в поиске работы?

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

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

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

https://habrahabr.ru/post/331276/


Метки:  

Материалы студенческой школы «Recent Advances in Algorithms»

Вторник, 20 Июня 2017 г. 14:28 + в цитатник
Recent Advances in Algorithms

В конце мая в Петербурге в ПОМИ РАН прошла международная студенческая школа «Recent Advances in Algorithms». Идея школы заключалась в том, чтобы ведущие учёные рассказали о последних достижениях в области алгоритмов. В результате у нас получился следующий список курсов.

Список лекторов

Streaming Algorithms


Михаил Капралов из EPFL прочитал курс про стриминговые алгоритмы.

Михаил Капралов

Материалы и видео курса.

Graph Algorithms and Continuous Optimization


Aleksander Madry из MIT рассказал о том как применять непрерывную оптимизацию к задачам на графах.

Aleksander Madry

Материалы и видео курса.

Algorithms for High-Dimensional Data


Илья Разенштейн из MIT прочитал курс про алгоритмы для многомерных данных.

Илья Разенштейн

Материалы и видео курса.

Longest Paths in Graphs: Parameterized Algorithms


Saket Saurabh из IMSc рассказал о параметризированных алгоритмах для поиска длиннейшего пути.

Saket Saurabh

Материалы и видео курса.



Modern algorithms for parallel, streaming and query-based data processing


Кроме того, пользуясь случаем, публикуем материалы курса Григория Ярославцева про алгоритмы для параллельных вычислений, стриминг-алгоритмы и алгоритмы для обработки данных на основе запросов, который был прочитан в Computer Science клубе при ПОМИ РАН.

Григорий Ярославцев

Материалы и видео курса.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331286/


Метки:  

Облачный хостинг PCI DSS: Детали предоставления услуги

Вторник, 20 Июня 2017 г. 14:03 + в цитатник
Часть компаний, деятельность которых связана с обработкой данных платежных карт клиентов, прибегают к услуге PCI DSS хостинга. Это связано с тем, что удовлетворение требований стандарта к инфраструктуре является трудоемким процессом. Например, услугами PCI DSS хостинга пользуется банк для интернет-предпринимателей «РФИ Банк», системами которого управляет «ИТ-ГРАД». Банк арендует защищенную виртуальную инфраструктуру в соответствии с требованиями стандарта PCI DSS по модели IaaS.

Поскольку все больше компаний обращают внимание на PCI DSS Compliant Hosting, мы хотим поговорить о деталях предоставления этого типа услуги.

/ фото kuhnmi CC

Несколько слов о стандарте


Стандарт PCI DSS увидел свет в 2005 году с целью привести требования международных платежных систем к общему знаменателю в вопросах обеспечения безопасности данных держателей карт. С середины 2012 года все организации (включая российские компании), вовлечённые в процесс хранения, обработки и передачи ДПК должны соответствовать требованиям PCI DSS.

Определение необходимости соответствия стандарту PCI DSS

Чтобы понять, нужно ли компании проходить аудит на соответствие PCI DSS, нужно ответить на два вопроса:

  1. Хранятся, обрабатываются или передаются ли данные платежных карт в вашей организации?
  2. Могут ли бизнес-процессы вашей организации непосредственно влиять на безопасность данных платежных карт?

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

Детали услуги PCI DSS хостинга


Мы в компании «ИТ-ГРАД» провели исследование рынка и оценили возможные варианты предоставления сервиса PCI DSS различными компаниями. В результате было установлено, что самыми популярными подклассами PCI DSS хостинга оказались услуги Colocation, IaaS Basic и IaaS Advanced.

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

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

Не меньшей популярностью пользуется услуга IaaS Advanced, когда клиент получает максимально защищенное облако по принципу «все включено». Заказчик просто размещает в облаке бизнес-приложения, а большая часть требований PCI DSS «закрывается» провайдером.


Что касается компании «ИТ-ГРАД», то мы предоставляем услугу сертифицированного облачного PCI DSS хостинга, с физическим размещением оборудования (Colocation), а также сервисы IaaS Basic и IaaS Advanced. Далее, мы рассмотрим особенности каждого вида услуг.

Colocation


Услуга размещения оборудования в ЦОД требует соблюдения установленных норм безопасности. В этом случае используются средства контроля и управления доступом в дата-центр, где в обязательном порядке присутствуют системы видеонаблюдения и системы идентификации личности сотрудников. Все размещаемое оборудование располагается в запираемых стойках, доступ к которым регламентирован. При этом поставщик отвечает за регулярное проведение инвентаризации и проверку работоспособности устройств, используемых в инфраструктуре. Это является одним из обязательных требований стандарта PCI DSS.

IaaS Basic


При предоставлении услуги IaaS Basic обязанности поставщика и клиента разделяются согласно установленной матрице ответственности сторон. Поставщик отвечает за отдельные компоненты инфраструктуры клиента и выполняет настройки в соответствии с разработанными стандартами безопасного конфигурирования и с учетом требований PCI DSS.

Распределение зон ответственности может выполняться по-разному. В качестве примера рассмотрим, как это устроено в компании «ИТ-ГРАД». Так как в нашей инфраструктуре используется Web Application Firewall, приложения, размещаемые клиентом в облаке, можно пропускать через него, снимая часть требований по защите приложений.

При этом «ИТ-ГРАД» регулярно следит за появлением новых уязвимостей, выполняя шестое требование стандарта PCI DSS по обновлению систем и ранжированию рисков. Также внедрен процесс управления изменениями, когда корректировки в рабочую систему вносятся только после одобрения специального комитета. Такой подход позволяет избежать случайных ошибок.

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

IaaS Advanced


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

Для предоставления услуги IaaS Advanced поставщик обязан соблюдать определённые требования и применять соответствующие технологические решения. Рассмотрим несколько из них на примере компании «ИТ-ГРАД».

Технологические решения для услуги IaaS Advanced

Первое требование — двухфакторная аутентификация (Dual Factor Authentication). Например, в инфраструктуре «ИТ-ГРАД» применяется OTP-сервер, генерирующий одноразовые токены, с помощью которых пользователи выполняют VPN-подключение с пробросом в зону DMZ, где размещается узел управления и администрирования. Подключение к этому узлу позволяет выполнять административные задачи и обращаться к отдельным компонентам инфраструктуры.

Второе требование — это сетевой фаервол, разграничивающий сети на зоны. В этом случае мы следуем принципу «что не разрешено, то запрещено». Также в инфраструктуре провайдера используется система Palo Alto, оснащенная функцией IPS/IDS, чтобы выявлять ситуации неавторизованного доступа и принимать меры для устранения возникающих угроз. Еще здесь часто используется централизованный сервер антивирусной защиты с установленными агентами на хостах заказчика. Это позволяет при обнаружении сообщений о вирусах оперативно формировать инциденты и организовывать почтовую рассылку с последующей реакцией CM-системы на фиксируемое событие.

Еще одним требованием является обеспечение контроля целостности файлов приложений (File Integrity Monitor). В случае внесения изменений меняется контрольная сумма, что становится поводом автоматического создания инцидента. Кроме того, FIM следит и за критичными файлами ОС Windows и Linux. В рамках работы с целостностью файлов также проводится ежедневное создание снимков виртуальных машин, чтобы можно было «откатиться» до исходного рабочего состояния в случае нештатной ситуации.

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

Напоследок хотелось бы отметить, что компания, предлагающая услугу хостинга PCI DSS должна иметь действующий сертификат, а границы предоставляемого сервиса должны соответствовать значению поставщик услуг управляемых сервисов. Это говорит о том, что провайдер имеет право оказывать услуги PCI DSS хостинга, подразделяющиеся на классы Colocation, IaaS Basic и IaaS Advanced.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330578/


Метки:  

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

Вторник, 20 Июня 2017 г. 13:56 + в цитатник
Суровая реальность такова, что при всем многообразии решений для поисковой оптимизации, аналитики мобильных приложений и трекинга пользовательских действий команды зачастую вынуждены делать свой выбор по принципу «что дешевле». Но даже и при таком подходе можно обзавестись неплохим инструментарием, если повезет поймать момент. Сегодня мы представляем вниманию читателей небольшую подборку аналитических сервисов, которые в данный момент предлагают свои услуги бесплатно или на льготных условиях. В список вошли как совсем молодые проекты, так и крупные, известные игроки на рынке. Не упускайте шанс!



Megaindex

О Megaindex знают, пожалуй, все, кому приходилось заниматься продвижением площадки. Этот сервис и в обычных обстоятельствах можно считать подарком для масс — настолько богатый набор инструментов для SEO оптимизации и веб-аналитики он предлагает на бесплатной основе. Однако за пределами даровой досягаемости до сих пор оставался ряд интересных инструментов для сравнительного анализа с конкурентами, работы с поисковыми запросами (выведение топов, кластеризация), трекинга внешних и исходящих ссылок, оценки видимости и цитируемости площадок. В данный момент руководители проекта предлагают хабровчанам заманчивую возможность опробовать расширенный пакет услуг без доплаты и на совершенно законных основаниях. Чтобы автоматически подключить тариф Lite на следующий месяц, просто перейдите по волшебной ссылке, зарегестрируйтесь и наслаждайтесь доступом к полному набору приложений от компании.

UserX

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



Attriboost

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

Hubspot

Hubspot — платформа очень богатая функциями, очень широко известная и очень недешевая. Сервисы, которые предлагает компания, разделяются по трем направлениям — CRM, маркетинг и продажи, причем инструменты для веб-аналитики сосредоточены по большей части в сегменте «Маркетинг». Бесплатно вы можете получить доступ только к самым базовым сведениям по трафику и конверсии; все прочие, более интересные функции (сегментация, отчеты, А/Б тестирование, подробный анализ сайта, работа с рекламными кампаниями, обзор конкурентов) предоставляются только за ежемесячную плату от 200 $. Звучит не очень обнадеживающе, но есть одна лазейка: команда Hubspot постоянно набирает из числа собственных клиентов бета-тестеров для работы с новыми функциями, среди которых попадаются и аналитические решения. Чтобы подать заявку, достаточно заполнить анкету на сайте. Ограничений, связанных с тем, какой пакет услуг — платный или бесплатный — использует соискатель, не заявлено.


Piwik

Piwik предлагает open-source решение для тех, у кого возможность разместить его на собственном сервере. Сервис включает достаточно широкий набор функций: веб-аналитика (стандартные KPI — заходы, скачивания, конверсия, позиции по ключам, информация о посетителях, девайсах и сессиях), статистика по показателям ecommerce (продажи, конверсия, средний доход на посещение, доля брошенных корзин, подобные логи по каждой покупке), отслеживание маркетинговых кампаний, аналитика для интранета. Чтобы проще было разбираться в массивах данных, многочисленные виджеты можно подключать, группировать и распределять по дэшбордам в соответствии с личными целями и потребностями. За действиями пользователей можно наблюдать как в реальном времени, так и задним числом, отслеживая динамику и тренды — так как инфраструктура принадлежит клиенту, история сохраняется без ограничений.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331264/


Метки:  

Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1015 1014 [1013] 1012 1011 ..
.. 1 Календарь