...

суббота, 24 октября 2015 г.

Host-Tracker добавил новых агентов мониторинга доступности сайтов


ХостТрекер спешит порадовать своих клиентов, сайты которых размещены на серверах хостинг-провайдеров Болгарии, Литвы и Швейцарии. В списке наших агентских серверов пополнение. Теперь мониторинг сетевых ресурсов проводится также из Софии, Вильнюса и Цюриха. Новые агенты уже доступны для выполнения заданий мониторинга и добавлены в общий пул серверов Восточной и Западной Европы.
ХостТрекер развивает свою мониторинговую сеть в двух направлениях. Мы стараемся покупать новые сервера в разных регионах самостоятельно, а также привлекаем хостинг-провайдеров к партнерским отношениям. Так, мы добавили новые мониторинговые сервера в Литве, Болгарии и Швейцарии, зная, что из-за абузоустойчивости хостингов, работающих в этих странах, к их ресурсам проявляется значительный интерес со стороны владельцев веб-приложений.
Цели проекта

Мы стараемся охватить большую часть регионов нашей планеты своей мониторинговой сетью. На сегодняшний день агенты ХостТрекер работают в 55 городах по всему миру. Наш агент мониторит сетевые ресурсы даже из такой отдаленной точки Африки как Баллито. Однако часть регионов мы еще не успели освоить. А логика нашей системы такова, что предполагает корректность оценки мониторинга только на основе результатов, полученных пулом серверов: Западной или Восточной Европы, Южной или Северной Америки, Азии.
Что нужно для реализации партнерства?

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

Чтобы стать нашим партнером, хостинг-провайдеру достаточно предоставить в наше распоряжение Windows-хостинг, системные ресурсы которого отвечают самому минимальному тарифу. Агент ХостТрекера потребляет всего 20-30 Гб трафика ежемесячно. Нам в работу достаточно предоставить только IP-адрес, поэтому нет нужды создавать даже поддомен. Для регистрации партнерского хостинга достаточно заполнить небольшую форму на нашей странице.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Когда нет сил ждать Record'ы

Думаю, многие C# разработчики с нетерпением ждали в C# 6.0 появления первичных конструкторов и record'ов и были огорчены тем, что эта фича была отложена до 7-й версии. Под конец рабочего четверга желание иметь неизменяемые типы во что бы то ни стало пересилило во мне терпение и я решил написать утилиту, генерирующую их. Кому интересно — прошу под кат.
Постановка задачи видилась предельно ясно, record должен содержать:
  • Свойства с публичными getter-ами
  • Конструктор с параметрами для инициализации всех свойств
  • Метод Copy() с таким же набором параметрв, но имеющий для каждого значение по умолчанию
  • Перегрузки Equals и GetHashCode, реализацию IEquatable
  • Операторы == и !=

В общем, всё как в case-классах в Scala.
Для описания record'ов был взят слегка упрощённый синтаксис C#:
namespace Records {
    using System;

    record Test {
        Int32 Id;
        String Name;
        Nullable<Decimal> Amount;
    }
}


Разбор текста осуществляется с помощью Nemerle.PEG, получилась вот такая грамматика:
grammar {
      ANY = !['\u0000'..'\u001F'] !'\u007F' ['\u0000'..'\uFFFF'];
      ws : void = ("\r\n" / "\n" / "\r" / "\t" / ' ')*;
      letter = [Lu, Ll, Lt, Lm, Lo];
      digit = ['0'..'9'];
      keyword = "using" / "record" / "namespace";
      identifier : string = letter (letter / digit)*;
      path : string = identifier ("." identifier)*;
      genericTypeDefinition : string = identifier ws"<"ws (genericTypeDefinition / identifier)(ws","ws (genericTypeDefinition / identifier))* ws">";
      
      property : PropertyDefinition = !keyword (genericTypeDefinition / identifier) ws identifier ws";";
      properties : List[PropertyDefinition] = (ws property ws)+;
      import : ImportDefinition = "using" ws path";";
      
      record : RecordDefinition = "record" ws identifier ws "{" ws property (ws property)* ws "}";
      nmspace : NamespaceDefinition = "namespace" ws path ws "{" (ws import)* ws record (ws record)* ws "}" ws !ANY;
    }


По полученному в результате работы парсера DOM генерируется исходный код C# с помощью CodeDOM, который затем компилируется в сборку с помощью CSharpCodeProvider.

Для простоты реализации было внесено ограничение — в каждом файле должен находится новый namespace (в дальнейшем планирую убрать это ограничение). В остальном язык получился гибким: namespace можно сразу же импортировать в другие файлы, объявленые типы можно сразу же использовать как типы полей в других record'ах.

Приведу простой пример использования.
Создадим файл Units.rcs со сделующим содержанием:

namespace Units {
    using System;

    record Unit1 {
        Int32 Id;
        String Name;
    }

    record Unit2 {
        Int32 Id;
        Unit1 Unit;
        Decimal Amount;
    }
}


а также Delivery.rsc
namespace Delivery {
    using System;
    using Units;

    record Address {
        String CityName;
        String Street;
        String House;
    }

    record Package {
        Address Destination;
        Unit2 Contents;
    }
}


Для того, чтобы получить сборки нужно выполнить следующую команду:
RecSharp -i Units.rcs Delivery.rcs -o Records.dll


В результате будет получена сборка, которую можно подключить к проекту и пользоваться объектами.
Проект можно пощупать здесь:
RecSharp
(в Releases есть бинарники для тех, кто не хочет ставить Nemerle)

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

Буду рад, если утилита будет кому-то полезна)

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Уведомления на разных платформах, какие они бывают? Бонус на смарт-часах Moto 360

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

Мы расскажем о том, как выглядят различные типы уведомлений на Chrome, Android, Safari, Firefox, iOS. Какие мы используем, какие можно использовать и не много о том, как оно работает.


  • Long-pull, fast-pool, периодические обновления и т.д. Вас просто держат за дурака. Это не пуши, это пул (т.е. наоборот) через определенные периоды времени и приход уведомления, когда что то меняется. Такое работает на многих сайтах, к примеру Веб-версия вконтакте вообще держит только long-pull — длинные запросы
  • Web-socket. Это уже пуш технология, которая позволяет держать соединение и обмениваться по нему в обе стороны данными. При этом уже сервер может вам прислать что то новенькое — а вы на это реагируете. Веб-сокеты на данный момент могут работать либо в активной вкладке браузера, либо в дополнении.
  • Push API. Это новая технология, которая работает либо в паре с Service Worker (фоновый процесс сайта), либо как сафари — лишь прикидывается Push API, а на деле свой велосипед. При использовании этого протокола, используется встроенный в браузер push-сервис, к примеру GCM в Chrome (Google Cloud Messaging) он позволяет странице создать воркера и получить REGID для отправки push-уведомлений. Этот метод работает и на сайте и через дополнение.

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

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

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


Немного визуальных отличий.

1 сделано через стандартный Notification API, второй сделан через обертку для Service Worker. Эти оповещения не исчезают — но для них не применяется сглаживание изображения на многих платформах. (вы можете заметить по качеству картинок)

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

Также при использовании расширения (Rich Notification) — оно может растягивать изображение на весь блок — веб-пуши такое не делают.

А еще в дополнении можно сделать так:

Это особенно важно, т.к. скоро не будет «колокольчика» в хроме.


1. Оповещение пришло через Telegram


Преимущества


  • не нужно ставить лишних приложений
  • не зависит от браузера
  • встроенная история оповещений и управление устройством (пауза/старт)

Недостатки


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

Вот как выглядит на смарт-часах (Moto 360)

2. Оповещения через Push API (тоже самое что и на компьютерном Chrome)


Преимущества


  • Не нужно ставить лишних приложений
  • Есть иконка, пусть и плохого качества
  • Можно отслеживать статистику приёма, стирания, открытия.
  • При клике открывается сразу ссылка, в отличии от телеграма

Недостатки


  • Размытая иконка на смартчасах (некрасиво)
  • Уведомления приходит от имени хрома и есть иконка хрома вместо иконки системы
  • Лишние кнопки вроде настройки сайта и т.д. хотя это единственное где можно отписаться от такого вида оповещений, на компьютерной версии этого нет
  • Когда Service-worker спит, а потом начинает «скачивать пуши» это приводит к появлению сообщения «Сайт обновлен в фоновом режиме» Также это может произойти если есть система отслеживания
  • Нельзя кэшировать изображения — повышается расход трафика
  • Необходимо использовать хром как основной браузер
  • Нельзя настроить вибрацию или звук для оповещений, оно вибрирует всегда!
  • Пользователи не знают как их выключить, сначала все хорошо, но когда приходит по 10-20 оповещений каждый день… начинается паника. Просто почитайте комментарии в самом конце этой статьи.

3. Оповещения через полноценное приложение


Преимущества


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

Недостатки


  • Необходимо ставить и обновлять приложение, хотя оно и весит 1 мегабайт.


В общем то тот же телеграм, мало чем отличается от решения на андроид.

И нативное приложение (бета-версия, новая версия в разработке):

Из недостатков оповещений на iOS


  • Нельзя добавить иконку
  • Нельзя отследить приём оповещения
  • Можно присылать только Alert'ы т.е. по сути просто строчку текста и адрес для перехода
  • После клика можно отследить клик, т.к. уже идет обработка через код приложения
  • Сильно ограничен размер оповещения
  • Пользователь не может видеть больше 10 пришедших оповещений, то есть нужно делать костыль внутри приложения для реализации показа истории.
  • Конечно же, на iOS больше никак нельзя принимать оповещения. Push API iOS не поддерживает.

Мы пока что протестировали только стандартный Notification API на веб-сокетах.

Выглядит это так:

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

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

В Firefox нет своего Push API сервиса (пока что) поэтому мы будем использовать свой, основанный на сокетах. Однако в FF есть море проблем связанных с оповещениями

Преимущества


  • Уведомления выглядят чисто, нет никаких «Сайт обновлен», нет адреса сайта
  • Уже хорошо, что они существуют :)

Недостатки


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

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

SocketPush


Работает неплохо судя по тестам. Почему то проголосовало негативно больше людей, чем вообще тестировало (не надо так!)

Но мы будем переделывать немного алгоритм, потом удалим все добавленные SocketPush устройства. Включение будет работать уже тогда, когда активно устройство (в состоянии включено) то есть можно будет в том же сафари или FF открывать вкладку и получать пуши через 2-3 дня.

И да, оказывается EDGE даже не поддерживается Notification API.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Умственный труд и физическая культура

Разработчик программного обеспечения Ришат Мухаметшин живет в Ижевске. Мы познакомились несколько лет назад на проекте по разработке сервиса обмена заказами такси, в котором он выступал руководителем со стороны заказчика. Ришат интересовался здоровым образом жизни. Сначала он завел блог на эту тему, потом решил написать книгу и даже женился на инструкторе по фитнесу! Мы решили дать ему микрофон на страницах нашего блога в эти выходные, когда рабочая неделя уже закончена, и можно поговорить о чём-то, что касается всех занятых сидячим трудом в офисе. Итак, слово Ришату.


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

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

Эмоциональный стресс


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

Эмоциональный подъём


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

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

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

Неподвижный режим работы


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

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

Работа стоя


Вам известно о специальных столах для работы стоя? Мое мнение: это изумительно! Из-за отсутствия полного комфорта вы буквально вынуждены искать быстрые пути решения проблемы и переключаться между задачами — не клавишами Alt+Tab, а головой.

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

В первое время помогает техника Pomodoro. Синхронизируйте с таймером ваши «подходы» к столу, и работать станет значительно удобнее. Поясню. Время, проведенное за столом, нужно поделить на отрезки работы и отдыха, которые, во-первых, строго чередуются, а во-вторых, строго ограничены по продолжительности. У меня 24 минуты работы и 4 минуты отдыха. Я использую приложение для часов Pebble: запустил, нажал, забыл, они вибрируют, когда нужно покинуть место или вернуться.

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

Лёгкая физкультура


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

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

Физкультура помогает мобилизовать некоторые процессы в организме.

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

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

Спорт


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

Спорт и программирование несовместимы: любая тренировка ведёт к утомлению, на восстановление после которого недостаточно поспать одну ночь. Состояние постоянного истощения плохо сочетается с интеллектуальным трудом.

Вывод


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

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

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

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Linux-контейнеры дома: зачем и как


Рассуждения


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

Дома, на личных компьютерах многие используют виртуальные машины: в основном, пожалуй, Virtualbox. Как правило, для того, чтобы работая под Linux, иметь под рукой Windows или наоборот. Однако, при наличии множества родственных Linux-операционок, я стал замечать, что использование виртуальных машин — это, мягко говоря, нерационально.
В первую очередь, очень быстро расходуется дисковое пространство. Каждой виртуальной машине нужно место, даже если несколько из них отличаются только конфигами. Особенно критично это на невеликих размеров SSD лаптопа. В принципе, Virtualbox умеет работать с raw-девайсами и, теоретически, машинам можно назначать rw LVM-снапшот, но тут опять же встают вопросы с изменением размера файловой системы в дальнейшем, автоматизацией клонирования, переноса, удаления и тому подобное.

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

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

Зачем это нужно:
— Для сборки ПО при нежелании захламлять разномастными *-dev пакетами основную рабочую систему.
— Потребность в другом дистрибутиве для запуска каких-либо специфических программ и, опять же, сборки.
— Изоляция потенциально небезопасного софта, вроде того же скайпа совершающего разные непонятные действия в домашнем каталоге пользователя и всяких сомнительных веб-технологий: уязвимость во флеше, в java, в обработчике pdf — это только то, что плавает на поверхности.
— Анонимность. Эдак можно банально остаться залогиненым в своей любимой социалочке, забыть подчистить куки или оказаться незнакомым с очередной новой веб-технологией вроде этой webrtc. Можно, конечно, держать несколько профилей браузера, но от перечисленных выше дыр и технологий это не защитит.

Итак, рассмотрим плюсы и минусы LXC:
+ Работает на ванильном ядре
+ Простота проброса устройств и каталогов хоста, так как работает это все через cgroups
+ Очень нетребовательно к ресурсам, в отличии от виртуальных машин типа Virtualbox или qemu

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

Развертывание и настройка контейнера

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

sudo apt-get install lxc bridge-utils

Смотрим доступные группы томов LVM:

$sudo vgs
  VG         #PV #LV #SN Attr   VSize   VFree
  nethack-vg   1   6   0 wz--n- 119,00g 7,36g

sudo lxc-create -t debian -B lvm --vgname nethack-vg --fssize 2G -n deb_test

Указываем использовать LVM в качестве системы хранения, Volume Group ( в моем случае — nethack-vg) и размер 2 гигабайта, иначе по умолчанию будет создан одногиговый том. Хотя, если вдруг стало тесновато, можно будет сделать lvresize.

Смотрим:

$sudo lvs
  LV   VG         Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  deb_test nethack-vg -wi-ao----   2,00g
  home     nethack-vg -wi-ao----  93,09g
  root     nethack-vg -wi-ao----   8,38g
  tmp      nethack-vg -wi-ao---- 380,00m
  var      nethack-vg -wi-ao----   2,79g
  vm       nethack-vg -wi-ao----   5,00g

Видим, что у нас появился том deb_test.

Типовой конфиг, созданный скриптом:

/var/lib/lxc/deb_test/config
# Template used to create this container: /usr/share/lxc/templates/lxc-debian
# Parameters passed to the template:
# For additional config options, please look at lxc.container.conf(5)
lxc.network.type = empty
lxc.rootfs = /dev/nethack-vg/deb_test

# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf

# Container specific configuration
lxc.mount = /var/lib/lxc/deb_test/fstab
lxc.utsname = deb_test
lxc.arch = amd64
lxc.autodev = 1
lxc.kmsg = 0

Стартуем:

sudo lxc-start -n deb_test


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

sudo lxc-attach -n deb_test

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

На хосте прописываем в /etc/network/interfaces

auto lo br0

iface br0 inet static
   address 172.20.0.1
   netmask 255.255.255.0
   pre-up  /sbin/brctl addbr br0
   post-up /sbin/brctl setfd br0 0
   post-up iptables -t nat -A POSTROUTING -s 172.20.0.0/24 -j MASQUERADE
   post-up echo 1 > /proc/sys/net/ipv4/ip_forward
   pre-down /sbin/brctl delbr br0

В конфиг контейнера дописываем:

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 00:01:02:03:04:05

Чтобы сразу получить рабочую сеть и возможность установки пакетов apt'ом, допишем

lxc.network.ipv4 = 172.20.0.3
lxc.network.ipv4.gateway = 172.20.0.1


И выполним
echo "nameserver 192.168.18.1">/etc/resolv.conf

Понятно, что 192.168.18.1 — IP моего DNS.

Установим нужные пакеты:

#apt-get install vim openvpn zsh iftop

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

scp user@172.20.0.2:/etc/apt/sources.list /etc/apt/
scp -r user@172.20.0.2:/etc/apt/sources.list.d /etc/apt/
apt-get update
ssh user@172.20.0.2 'dpkg --get-selections|grep -v deinstall'|dpkg --set-selections
apt-get dselect-upgrade

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

/etc/network/interfaces:

auto lo eth0
iface lo inet loopback

iface eth0 inet static
address 172.20.0.3
netmask 255.255.255.0
gateway 172.20.0.1
dns-nameservers 192.168.18.1

Впрочем, это можно было сделать с хост-системы, например, смонтировав логический том. Способов много.

В принципе, в качестве DNS можно указать любой публичный, если не опасаетесь за свою приватность. Например, гугловские 8.8.8.8 и 8.8.4.4.

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

lxc.cgroup.devices.deny = a

Удаляем

lxc.include = /usr/share/lxc/config/debian.common.conf

Попробуем подключиться через OpenVPN. Сразу же получаем ошибку:

Thu Oct 15 16:39:33 2015 ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)
Thu Oct 15 16:39:33 2015 Exiting due to fatal error

Система пишет, что интерфейсы TUN/TAP недоступны по причине их отсутствия. Очевидно, что нужно разрешить гостевой системе использовать устройства хоста. Открываем конфигурационный файл контейнера, /var/lib/lxc/deb_test/config и добавляем туда строчку:

lxc.cgroup.devices.allow = c 10:200 rwm 

В контейнере выполняем:

root@deb_test:/# mkdir /dev/net; mknod /dev/net/tun c 10 200
root@deb_test:/# echo 'mkdir /dev/net; mknod /dev/net/tun c 10 200; exit 0'>/etc/rc.local

Обратим внимание на 10:200 — это идентификатор типа устройств. Если выполним на хосте:

$ls -l /dev/net/tun
crw-rw-rw- 1 root root 10, 200 окт 13 10:30 /dev/net/tun

То увидим идентификаторы 10, 200. По ним и будем ориентироваться, разрешая доступ к устройства, например камере — video0.

lxc.cgroup.devices.allow = c 81:* rwm

Точно также добавляем остальные нужные устройства:

# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rm
#usb passthrough
lxc.cgroup.devices.allow = c 189:* rwm
#video
lxc.cgroup.devices.allow = c 81:* rwm
#sound
lxc.cgroup.devices.allow = c 116:* rwm
lxc.cgroup.devices.allow = c 14:* rwm

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

lxc.mount.entry = /tmp/.X11-unix/X0 tmp/.X11-unix/X0 none bind,optional,create=file

По аналогии можно примонтировать и другие, нужные каталоги и файлы:

lxc.mount.entry = /home/user/.vim home/user/.vim none bind,optional,create=dir 0 0 
lxc.mount.entry = /home/user/.vimrc home/user/.vimrc none bind,optional,create=file 0 0 

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

lxc.cgroup.devices.allow = c 116:* rwm
lxc.cgroup.devices.allow = c 14:* rwm
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir 0 0 

А можно настроить pulseaudio на воспроизведение звука по сети, как это описано здесь. Кратко:

Отредактировать на хосте /etc/pulse/default.pa, дописав туда:

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;172.20.0.3 auth-anonymous=1

В итоге, у нас получается вот такой конифиг:

/var/lib/lxc/deb_test/config
lxc.network.type = empty
lxc.rootfs = /dev/nethack-vg/deb_test

lxc.mount = /var/lib/lxc/deb_test/fstab
lxc.utsname = deb_test
lxc.arch = amd64
lxc.autodev = 1
lxc.kmsg = 0

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 00:01:02:03:04:05

lxc.network.ipv4 = 172.20.0.3
lxc.network.ipv4.gateway = 172.20.0.1

#deny acces for all devices
lxc.cgroup.devices.deny = a

# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rm

#sound
lxc.cgroup.devices.allow = c 116:* rwm
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir 0 0 
#tun/tap adapters
lxc.cgroup.devices.allow = c 10:200 rwm 
#video0
lxc.cgroup.devices.allow = c 81:* rwm
lxc.mount.entry = /dev/video0 dev/video0 none bind,optional,create=file

lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry = /tmp/.X11-unix/X0 tmp/.X11-unix/X0 none bind,optional,create=file


Контейнер готов к использованию.

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

Доустановим, например, i2p с Tor'ом, если не сделали этого ранее, и сходу настроим privoxy:

wget -q http://ift.tt/1R1Uu8T -O- | sudo apt-key add -
echo "deb http://deb.i2p2.no/ jessie main" >/etc/apt/sources.list.d/i2p.list
echo "deb-src http://deb.i2p2.no/ jessie main" >>/etc/apt/sources.list.d/i2p.list
apt-get update
apt-get install privoxy i2p tor


/etc/privoxy/config
user-manual /usr/share/doc/privoxy/user-manual
confdir /etc/privoxy
logdir /var/log/privoxy
actionsfile user.action      # User customizations
filterfile default.filter
filterfile user.filter      # User customizations
logfile logfile
listen-address  localhost:8118
toggle  1
enable-remote-toggle  1
enable-remote-http-toggle  1
enable-edit-actions 1
enforce-blocks 0
buffer-limit 4096
enable-proxy-authentication-forwarding 0
forwarded-connect-retries  0
accept-intercepted-requests 0
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 5
tolerate-pipelining 1
socket-timeout 300
forward .i2p localhost:4444
forward-socks5 .onion localhost:9050 .

Запускать графические приложения вроде браузера удобнее всего через ssh:

ssh -Y 172.20.0.2 "PULSE_SERVER=172.20.0.1 http_proxy=127.0.0.1:8118 chromium"

Так же, разумеется, LXC предоставляет средства для клонирования контейнеров и снятия снапшотов.

Так, например, склонировать контейнер, файловая система которого будет являться LVM-снапшотом можно командой:

sudo lxc-clone -s -H -o deb_test -L 200M --new deb_test2

Будет создан контейнер deb_test2 с файловой системой, размещенной на LVM-снапшоте размером 200MB (под хранение diff'ов). Это будет точная копия deb_test, над которой можно провести пару экспериментов и, например, безболезненно удалить.

А вот lxc-snapshot с LVM в качестве хранилища, на версии lxc-1.0.6 почему-то не работает:

->sudo lxc-snapshot -n deb_test 
        lxc_container: deb_test's backing store cannot be backed up.
        lxc_container: Your container must use another backing store type.
        lxc_container: Error creating a snapshot

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

sudo lvcreate -L100M -s -n deb_test_before_rm_rf -p r /dev/nethack-vg/deb_test

В данном случае, создали read-only снапшот с именем deb_test_before_rm_rf размером 100MB. Что с ним делать дальше? Например, его можно сдампить посредством dd, перенести на другую машину вместе с конфигами контейнера, создать там том нужного размера и пролить тем же dd (cp, cat, итд) — эдакая «живая миграция».

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

На этом пока все.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

пятница, 23 октября 2015 г.

Ваш бизнес в вашем смартфоне

• Платежи в рублях по свободным реквизитам (без шаблонов) с подтверждением SMS-кодом
• Повтор любого исполненного платежа, кроме оплаты банковских комиссий, в 3 клика
• Платежи по шаблонам, созданным и подписанным в интернет-банке «Альфа-Бизнес Онлайн»
• Налоговые и бюджетные платежи
• Срочная отправка платежей по системе БЭСП
• Подписание платежей второй подписью (например, бухгалтер подписывает платеж в интернет-банке, затем руководитель в «Альфа-Бизнес Мобайл»)

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Как облако может помочь сервису заказа еды: опыт Delivery Club

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

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

Коротко о проекте

Delivery Club — это лидер российского рынка по заказу доставки еды. Проект входит в состав международной компании Foodpanda. Сервис работает в 79 городах России, предоставляя возможность заказа доставки еды из более чем 4000 ресторанов.

Зачем понадобилось облако


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

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

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

— Евгений Сальников, ИТ-директор Delivery Club


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

Свое влияние оказал и факт принятия закона о хранении персональных данных россиян. Чтобы соответствовать его требованиям, команда Delivery Club перенесла все данные пользователей из Нидерландов в Россию в облако ИТ-ГРАД.

Как это работает


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

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

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

— Евгений Сальников, ИТ-директор Delivery Club


Другие кейсы использования российскими проектами IaaS-облаков:

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Анализ вариантов построения телефонии на базе Мicrosoft Skype For Business

Всем добрый день. При построении телефонии в компании, в большинстве случаев выбор лежит среди традиционных телефонных производителей, таких как: Cisco/Avaya/Siemens(Unify)/Panasonic/NEC и прочие. В первую очередь это обусловлено тем, что люди выбирают телефонию и смотрят на классических производителей. Но всё чаще компании в своих требованиях, среди прочего, указывают возможности объединенных коммуникаций. А почему бы не подойти к этому вопросу иначе, выбирать систему объединенных коммуникаций, и на её базе уже строить систему телефонии? В данной статье я хочу рассмотреть возможность построения полноценной телефонии на базе решения Microsoft Skype For Business.

Microsoft изначально пришел на рынок с системой объединенных коммуникаций, еще с продуктом OCS, далее Lync, сейчас переименовав его в Skype For Business. Сразу оговорюсь, что к классическому Skype, решение не имеет почти никакого отношения. Все преимущества объединенных коммуникаций (любая платформа для всех коммуникаций/видео конференции/совместная работа с документами/мгновенные сообщения/интегрированность с пакетом Office/статус присутствия) я описывать детально не буду. Тут можно лишь сказать, что Microsoft уже доказала, что в этой области является мировым лидером, что подтверждает большое количество независимых исследований, в том числе «магические» квадраты Gartners. Но вот в качестве телефонии, пока решение не на столько популярно. Если рассматривать Microsoft Skype For Business (в дальнейшем S4B), то он имеет достаточное количество телефонных функций, обеспечивающих необходимый функционал для телефонии, а именно:

  1. Перевод вызова
  2. Переадресация вызова
  3. Одновременный вызов
  4. Группы поиска
  5. Перехват вызова
  6. И прочие.

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

  • Microsoft выпустила программную платформу с программным клиентом, но при этом они не выпустили телефонные аппараты и решения для стыка с телефонной сетью. Концепция Microsoft, что телефонные аппараты – это прошлый век и надо пользоваться программными клиентами, а стык с телефонной сетью достаточно сделать по SIP на прямую, причем оператор связи должен поддерживать все специфики работы MS S4B. Это концепция, как и многие другие, хороши на бумаге, но не в реальной жизни. До сих пор требуются телефонные аппараты, стык с операторами связи не только с теми, что предлагает Microsoft, а и с теми, с кем вы работаете уже давно и по тем каналам, которые работают уже давно с сохранением номера.
  • Microsoft пришел на этот рынок, как решение объединенных коммуникаций и рынок телефонии не может сразу принять, что телефония, это все лишь часть объединенных коммуникаций. Не говоря уже об отношении телефонистов к самой компании Microsoft.

Для решения задачи аппаратных средств телефонии, Microsoft решила использовать партнёрские решения. Вся информация по сертифицированным решениям представлена на сайте Microsoft:

http://ift.tt/1PZLhPv
http://ift.tt/1LRVz3h

С помощью партнёрских решений можно решить следующие задачи:

  1. IP Телефоны. Совместимый телефон – это телефон, который напрямую работает с Microsoft Lync/Skype For Business. В данном случае не стоит даже пробовать подключать стандартный SIP телефон к S4B, он просто не заработает, так как Skype For Business работает по собственному протоколу. Хотя основа данного протокола – SIP. К преимуществу таких телефонов можно выделить следующее (С точки зрения функций, я описываю функции телефонов AudioCodes. Про телефоны других производителей уточняйте на сайте Microsoft):
    • Независимость от многофункционального устройства, типа компьютера или смартфона, когда он может быть занят другими приложениями, разрядиться, перегружаться и т.д.
    • Полная синхронизация статуса со Skype For Business и возможность управления статусом непосредственно с телефона
    • Синхронизация контактов вашей телефонной книги с телефонной книгой S4B
    • Возможность настройки переадресации вызова с телефона и синхронизация статуса переадресации со Skype For Business.
    • Поддержка функционала перевода вызова/перехвата вызова/группового вызова/фильтр руководитель-секретарь/панель быстрого набора с индикацией присутствия MS S4B
    • Одна из важных и удобных функций, это драйвер Better Together, который позволяет использовать IP телефон в качестве гарнитуры. Это позволяет набирать через Skype For Business, при этом говорить по телефону/переводить активный вызов с телефона на Skype For Business клиент/управлять телефонным вызовом из S4B клиента.

  2. Не маловажным аспектом является стык Microsoft S4B с городской сетью. Тут Microsoft предлагает использовать различные устройства голосовых шлюзов и SBC (Пограничный Контроллер Сессий), которые отвечают за присоединение Microsoft Skype For Business к существующей АТС или городской линии. Причем линейка данных устройств действительно очень большая, начиная от нескольких аналоговых линий и заканчивая высокопроизводительными устройствами, рассчитанные на несколько тысяч одновременных соединений, обеспечивающие отказоустойчивость операторского класса. Варианты портов могут быть абсолютно различны: СО(FXS/FXO), E1, BRI, SIP. Если рассматривать протокол SIP, то тут есть смысл выделить несколько моментов:
    • Microsoft поддерживает SIP поверх TCP и/или TLS. SIP поверх UDP Microsoft не поддерживает. Но по мимо этого реализация протокола SIP у Microsoft весьма своеобразна. Если быть точнее, то Microsoft использует не сильно популярные расширения стандартов SIP, а где-то эти стандарты интерпретирует по-своему. Далеко не каждая станция совместима с Microsoft S4B, и даже если она совместима, то имеет ряд ограничений. Все эти ограничения описаны на страницах TechNet.
    • Если требуется использовать стандартный SIP, снять ограничения интеграции S4B и телефонных станций, то для этого используется устройство SBC, которое обеспечивает полную совместимость с Microsoft S4B и сторонними телефонными станциями, преобразуя диалекты протокола SIP под те требования, которые есть с разных сторон.
    • Так же, одна из немаловажных функций SBC заключается в обеспечении безопасного подключения к SIP оператору поверх публичной сети интернет.

  3. Система отказоустойчивости удаленных офисов. Если рассматривать Microsoft S4B как систему телефонии, то важным моментом сразу становится обеспечение отказоустойчивости удаленных офисов. В данном случае Microsoft предлагает использовать решение SBA, которое обеспечивает отказоустойчивость удаленных офисов на момент пропадания канала между удаленным офисом и центральным. Так же, компания AudioCodes предлагает ряд собственных решений по отказоустойчивости удаленных офисов для Microsoft S4B, начиная от офисов в несколько человек, до крупного удаленного офиса.
  4. Система записи разговоров. Если у службы безопасности компании есть требования к записи разговоров, то Microsoft использует партнёрское решение для данной задачи, такое как AudioCodes SmartTAP. Оно позволяет записывать все разговоры, незаметно от самого пользователя и централизованно сохранять все разговоры.
  5. Система АвтоСекретарь. Microsoft использует в качестве системы АвтоСекретаря – Exchange сервер. Так же для решения данных задач можно использовать АвтоСекретарь стороннего производителя, который может обеспечить более широкий и гибкий функционал, в том числе обеспечение выделенного АвтоСекретаря в удаленных офисах. Главное отличие АвтоСекретаря, адаптированного под Skype For Business от любого другого, заключается в том, что при распределении входящих вызовов по различным сценариям, система учитывает статус пользователя Microsoft Skype For Business.
  6. Контакт центр. Как известно, контакт центры на данный момент являются важной составляющей многих компаний и достаточно часто интегрированы в телефонную станцию. Для реализации функционала контакт центра также используются партнёрские решения, которые обеспечивают полноценное решение контакт центра под любые бизнес требования заказчика. Причем список квалифицированных решений контакт центров достаточно большой, среди которых есть ведущие производители контакт центров, в том числе лидер рынка контакт центров – Genesys.
  7. Подключение аналоговых телефонов и факсов. Основываясь на моем личном опыте, могу сказать, что данная задача до сих пор актуальна почти у всех компаний. Решение для подключения аналоговых абонентов и факсов в Microsoft Lync/S4B есть, более того, AudioCodes уделяет достаточно много внимания для решения данной задачи, таким образом можно с уверенностью сказать, что если есть задача по подключению аналоговых устройств и факсов, то её решить можно.

Как видно из данного списка, с помощью Microsoft S4B можно реализовать не просто систему UC в компании, но также, расширить её до полноценной телефонной станции. Это делается с помощью партнёрских решений. Более того, благодаря партнёрским решениям, можно реализовать и другие задачи: факс сервер, подключение существующих SIP телефонов к S4B, управление и мониторинг качества вызовов, программные консоли секретаря и т.д. Основным партнёром для Microsoft Lync/Skype For Business с точки зрения голосовых сервисов, выступает компания AudioCodes. Мы предоставляем максимальное количество оборудования, обеспечивающее голосовые сервисы для Microsoft Lync/Skype For Business. Если смотреть на голосовые решения для Lync/S4, то не стоит забывать о таком факторе, как поддержка. Microsoft полноценно обеспечивает поддержку своего решения, если оно используется совместно с сертифицированным партнёрским решением. Это не маловажный момент, так как партнёрских решений у Microsoft достаточно много и клиенту действительно предоставляется выбор, при этом не лишаясь поддержки от Microsoft.

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

  1. Microsoft в своих решениях Skype и Skype For Business использует кодек SILK. Данный кодек был взят из Skype и перемещен в Skype For Business. Почему это важно. Тут есть несколько причин:
    • a. SILK поддерживает передачу качества в HD, что обеспечивает лучшее качество звука.
    • b. SILK был разработан для передачи голосовой информации в онлайн через публичную сеть интернет и зарекомендовал себя в решении Skype лучше многих других кодеков. Если говорить про стандартную IP телефонию, то это не является важным фактором, так как телефоны, как правило выносят в отдельный VLAN, где голосовой трафик приоритезируется и проблем с качеством не возникает. Но для технологии объединенных коммуникаций, данная задача становится почти не выполнимой, так как вызов может быть осуществлен с любого устройства и с любого места (через интернет, сеть WiFi, с программного клиента и так далее). Именно в эти моменты важно иметь кодек, который может адаптироваться к существующей среде и предоставить оптимальное качество.
  2. Microsoft предоставляет очень сильные инструменты для анализа качества, такие как DashBoard, которые позволяют корректно анализировать то, что происходит с сетью унифицированных коммуникаций и вовремя находить, и исправлять проблемы на сети.
  3. Microsoft на данный момент старается быть максимально многовендорной компанией и она не даёт приоритета той или иной платформе, для клиента MS Lync/S4B. Таким образом, полноценный клиент доступен почти на всех популярных ОС для ПК/планщетов/смартфонов – Windows/MacOS/Adroid/iOS/Windows phone. Не поддерживается, разве что, только Linux.
  4. Microsoft имеет достаточно мощный интерфейс взаимодействия, как клиентский, так и серверный. Таким образом, конечный клиент может самостоятельно дописать почти любое приложение для MS Lync, либо интегрировать свою систему с MS Lync. Более того, есть компании, которые предлагают готовые решения интеграции, например, интеграцию 1С с MS Lync/S4B.

Как итог всего написанного, я бы выделил следующие сильные и слабые стороны MS Lync/Skype For Business как телефонии.

Как сильные стороны я бы выделил

  1. Единое решение по объединенным коммуникациям и телефонии. Так или иначе, всё больше и больше компаний эксплуатируют MS Lync/Skype For Business в качестве системы объединенных коммуникаций, имея параллельно отдельную систему телефонии. Так зачем тратить на эксплуатацию двух систем, если можно использовать одну.
  2. Программа партнёрских решений. Многие считают, что, сделав программу партнёрских решений, Microsoft усложняет процесс интеграции её системы со сторонними АТС или при интеграции с ТфОП. С одной стороны – это так, но с другой стороны Microsoft позволяет вам использовать по-настоящему лучшее решения в своём классе. Более того, Microsoft гарантирует работу с ними и обеспечивает поддержку своих продуктов, при работе с данными решениями. Тем самым Microsoft дает больше свободы выбора и гибкости, чем кто-либо еще.
  3. Интеграция телефонии, объединенных коммуникаций и офисных приложений. Это то, что позволит вашим сотрудникам работать проще и эффективнее. Я понимаю, что есть безумные исследования Microsoft, которые рассказывают о том, как можно сэкономить много часов в месяц, благодаря Lync и Skype For Business. Я не спорю против этого анализа, но на мой взгляд, порой более важно (особенно в наших реалиях), когда эта система позволяет сэкономить секунды, а то и минуты в те моменты, когда это по-настоящему необходимо.
  4. Удобство пользования. Я думаю никто не будет отрицать, что, с точки зрения удобства пользования Skype For Business является наиболее удобной системой объединенных коммуникаций и телефония на этой системе, так же является очень удобной и простой для использования. А возможность использования телефона в качестве гарнитуры для S4B упрощает эксплуатацию.


Ну а теперь можно поговорить и о слабых сторонах Skype For Business в качестве телефонии:
  1. Первый недостаток и, наверное, основной, это привычное количество телефонного функционала. Многие телефонисты привыкли что у них 100500 телефонных функций в системе. Действительно это «огромное преимущество», но по факту, люди пользуются 5-10 функциями, типа перехвата вызова, перевода, переадресации, групповой вызов, АвтоСекретарь. Основные функции в Skype For Business доступны.
  2. Партнёрские решения. Skype For Business не является как таковой системой телефонии, а является системой UC изначально. Более того, это полностью программный продукт. Для того, чтобы сделать систему телефонии на Skype For Business требуется использовать партнёрские решения, тем самым получая многовендорность решения. Но тут есть и обратная сторона – Microsoft официально поддерживает свою систему, если она работает с сертифицированными партнёрскими решениями. А партнёрских решений на данный момент становится всё больше и заказчику предоставлен достаточно большой выбор. А если говорить именно о голосе и телефонии, то тут можно все задачи, связанные с голосовыми сервисами, закрыть одним производителем – AudioCodes, который покрывает все задачи, связанные с голосом.

Можно резюмировать, что Microsoft Skype For Business является ведущим игроком на рынке UC, который пришёл на рынок телефонии из UC. Вследствие чего, Skype For Business не всегда однозначно воспринимается на таком консервативном рынке, как телефония. Но опять же, все телеком производители сейчас стремятся к UC, а как следствие в перспективе, всё придет к системам унифицированных коммуникаций, где телефония будет лишь частью, пускай и важной или даже важнейшей частью. Если рассматривать выбор с перспективой, что в итоге компания перейдет на объединенные коммуникации, как единую систему связи, то выбор в пользу Microsoft Skype For Business очевиден.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

[Из песочницы] Удаление слитых веток, которых нет в origin

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

Поскольку я очень ленивый (иначе бы сразу удалял мусор), я начал искать готовое решение. И вроде бы вот оно, git remote prune origin должен решить все мои проблемы… И не решил. Не знаю, почему, но команда просто не захотела работать.

Что мы имеем?


Пара сотен локальных веток… Примерно столько же веток в Origin. Некоторые ветки слиты с мастером, некоторые нет. Поскольку в продакшн попадают только ветки, которые слитые в мастер, сравнивать нужно именно с ним. В этом поможет git branch --merged. Отлично, но при тестировании выясняется, что из-за того, что около текущей ветки ставится * (астериск), bash думает, что мы хотим вывести список файлов каталога… Убираем master (что логично, он ведь и не должен быть удален).
#!/bin/bash

if test 0 -eq `git status | grep '# On branch master' | wc -l`
then
    `git checkout master`
    `git pull origin master`
fi;

echo 'Будут удалены все слитые в master ветки, которых нет в Origin';
echo 'Вы уверены? [Y/n]';

read answer;
if test 'Y' = $answer
then

    local_branches=`git branch --merged | grep -v '*'`;
elif test 'n' = answer
then
    exit;
fi;


Теперь нужно найти все ветки, которых нет в Origin. Я не придумал ничего умнее, кроме как в цикле пробежаться по выдаче git branch -r и грепнуть текущую ветку… Получилось что-то типа такого:
    for b in $local_branches;
    do
        if test 0 -eq `git branch -r | grep $b | wc -l`
        then
            echo "$b нет в origin";
        fi;
    done


Остается только удалить ветки, которые удовлетворяют условию и готово.

Итоговый скрипт:

#!/bin/bash

if test 0 -eq `git status | grep '# On branch master' | wc -l`
then
    `git checkout master`
    `git pull origin master`
fi;

echo 'Будут удалены все слитые в master ветки, которых нет в Origin';
echo 'Вы уверены? [Y/n]';

read answer;
if test 'Y' = $answer
then

    local_branches=`git branch --merged | grep -v '*'`;

    for b in $local_branches;
    do
        if test 0 -eq `git branch -r | grep $b | wc -l`
        then
            echo $b;
            `git branch -d $b`;
            `git branch -D $b`;
        fi;
    done
elif test 'n' = answer
then
    exit;
fi;

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

[Из песочницы] Почему Mobile First?

О Mobile First написано достаточно много и есть хорошие книги на эту тему. И все равно большинство разработчиков и компаний не используют его в своих проектах или не знаю вообще об этом подходе.

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

  • Что такое Mobile First и его плюсы
  • Реализация подхода
  • Статистика результатов

Что такое Mobile First?


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

Поэтому одни из самых важных требований в Mobile First разработке это:

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

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

О важности этого подхода недавно писал поисковой гигант Google:

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


Видео о значимости Mobile First от Olivier Rabenschlag – глава Агентства Творческого Развития Google.

Плюсы Mobile First подхода


Напомню, что на сегодняшний день количество пользователей использующих мобильные устройства для серфинга в интернете достигло 60%. И поэтому использование Mobile First при разработке вебсайта дает большие преимущества для этих пользователей в первую очередь.
  • Один вебсайт для всех устройств
  • Пользователи получат важное содержание страницы в первую очередь
  • Быстрая загрузка страниц при низкой скорости подключения
  • Удобный интерфейс для навигации в мобильном экране
  • Минимальное количество веб ресурсов требуемое для отображения основного содержимого – экономия мобильного Интернет трафика
  • Топовые позиции в результатах поиска Google

Реализация


Реализация подхода будет продемонстрирована с помощью фреймворка Moff.js (Mobile First Framework). Это JavaScript фреймворк, который заточен для Mobile First разработки.

Мы будем рассматривать подход на примере страницы с детальной информацией об автомобиле.

Определяем важную часть содержания


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

Подробный список данных на странице:

  • Главная картинка машины
  • Мелкие тумбы дополнительных картинок
  • Цена
  • Описание
  • Список характеристик
  • Оборудование
  • Социальные сервисы Facebook, Twitter, g+
  • Список похожих машин

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

Далее мы сверстаем страницу в которую добавим только эту информацию.

<!DOCTYPE html>
<html lang="en">
<head>
        <title>Mobile First page.</title>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="styles/styles.css">
</head>
<body>
        <div class="container">
                <header role="banner">
                        <div class="header">
                                <div class="header_logo"><img src="images/logo.jpg"></div>
                                <div class="header_info">
                                        <div class="header_info_company-name">Company Name</div>
                                        <div class="header_info_description">Company description</div>
                                </div>
                        </div>
                </header>
                <main role="main">
                        <div class="vehicle">
                                <div class="vehicle_images">
                                        <div class="vehicle_images_main">
                                                <img src="images/preview1.jpg">
                                        </div>
                                </div>
                                <div class="vehicle_info">
                                        <h1 class="vehicle_info_title">2015 Nissan Versa Note</h1>
                                        <p class="vehicle_info_description">
                                                Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
                                                Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
                                                Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
                                                Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
                                        </p>
                                </div>
                                <div class="vehicle_details">
                                        <ul class="vehicle_details_list">
                                                <li><span class="vehicle_details_label">Model:</span> Versa Note</li>
                                                <li><span class="vehicle_details_label">Body:</span> 4D Hatchback</li>
                                                <li><span class="vehicle_details_label">Engine:</span> 1.6L 4-Cylinder DOHC 16V</li>
                                                <li><span class="vehicle_details_label">Fuel:</span> Gasoline</li>
                                        </ul>
                                </div>
                                <div class="vehicle_equipment">
                                        <h3>Standard</h3>
                                        <ul class="vehicle_equipment_list">
                                                <li>Brake assist</li>
                                                <li>Dual front side impact airbags</li>
                                                <li>Rear window defroster</li>
                                                <li>Passenger door bin</li>
                                                <li>Driver door bin</li>
                                                <li>Occupant sensing airbag</li>
                                                <li>Traction control</li>
                                                <li>CD player</li>
                                                <li>Trip computer</li>
                                                <li>Electronic Stability Control</li>
                                                <li>Front anti-roll bar</li>
                                                <li>Power steering</li>
                                                <li>Rear window wiper</li>
                                                <li>Front reading lights</li>
                                                <li>Overhead airbag</li>
                                                <li>ABS brakes</li>
                                        </ul>
                                </div>
                        </div>
                </main>
                <footer role="contentinfo">
                        <div class="footer">
                                <div class="footer_created">
                                        Created by Company.com
                                </div>
                                <div class="footer_copy">
                                        <ul class="footer_copy_list">
                                                <li class="footer_copy_item"><a href="#">Copyright</a></li>
                                                <li class="footer_copy_item"><a href="#">Contact</a></li>
                                                <li class="footer_copy_item"><a href="#">Sitemap</a></li>
                                        </ul>
                                </div>
                        </div>
                </footer>
        </div>
</body>
</html>

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

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

@media (min-width: 768px) {
        /*Tablet and desktop styles*/
} 


Добавляем дополнительную информацию


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

И тут на помощь приходят Data Events хелперы и возможности AMD из фреймворка Moff.js

Добавляем тумбы для главной картинки

Мы должны показать пользователю, что есть еще дополнительные картинки доступные для просмотра. Для этого нам нужно добавить ссылку под главной картинкой, которая ведет на тумбы.
<div class="vehicle_images">
        <div class="vehicle_images_main">
                <img src="images/preview1.jpg">
        </div>
        <div class="vehicle_images_thumbs">
                <a href="thumbs.html" data-load-target=".vehicle_images_thumbs" data-load-screen="sm md lg" data-load-module="vehicle-gallery">
                        See more images...
                </a>
        </div>
</div>


Здесь мы используем Data Events хелперы, которые помогают получить информацию при ее запросе. При клике на ссылку отправится ajax запрос по адресу указанному в атрибуте href. Результат запроса будет записан в элемент, который указан в аттрибуте data-load-target. Важным моментом будет то, что атрибут data-load-screen указывает при каких значениях экрана тумбы будут загружены автоматически. Размеры экранов взяты из CSS фреймворка Twitter Bootstrap. И в атрибуте data-load-module указываем идентификатор зарегистрированного модуля, который будет подключен после вставки результата ajax запроса.

При клике на ссылку происходят следующие действия:

  1. Отправляется ajax запрос на URL указанный в ссылке и результат вставляется на страницу
  2. Подключается зарегистрированный модуль (vehicle-gallery)
  3. Подключаются зависимости (jQuery и Slick-carousel)
  4. Загружается основной файл модуля
  5. Инициализация модуля

Далее рассмотрим регистрацию этого модуля.
Объявление класса модуля

Moff фреймворк имеет систему модульности с помощью, которой мы реализуем класс модуля vehicle-gallery.

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

Moff.modules.create('VehicleGallery', function() {
        var _module = this;

        var _mainImage;

        function setMainImage() {
                _mainImage = _module.find('.vehicle_images_main img')[0];
        }

        function initializeSlickJs() {
                $(_module.find('.vehicle_images_thumbs-list')).slick({
                        infinite: true,
                        slidesToShow: 5,
                        slidesToScroll: 1
                })
        }

        function handleMainImage() {
                $(_module.scope).on('click', '.vehicle_images_thumbs-item img', changePreview);
        }

        function changePreview() {
                var index = this.src.match(/thumb(\d+)/);
                _mainImage.src = 'images/preview' + index[1] + '.jpg';
        }

        this.scopeSelector = '.vehicle_images';

        this.init = function() {
                setMainImage();
                initializeSlickJs();
                handleMainImage();
        };
});


Во время инициализации класса мы запускаем slick-carousel для создания карусели из наших тумб и устанавливаем обработчик для их просмотра.
Регистрация модуля

Регистрация модуля происходит с помощью объекта, который содержит в себе уникальный идентификатор, может содержать зависимости модуля и основной файл класса модуля.
<script src="/bower_components/moff/dist/moff.min.js"></script>
<script>
        Moff.amd.register({
                id: 'vehicle-gallery',
                depend: {
                        js: ['/bower_components/jquery/dist/jquery.min.js', '/bower_components/slick-carousel/slick/slick.min.js'],
                        css: ['/bower_components/slick-carousel/slick/slick.css']
                },
                file: {
                        js: ['js/vehicle-gallery.js']
                },
                afterInclude: function() {
                        Moff.module.initClass('VehicleGallery');
                }
        });
</script>


В нашем примере мы указали в зависимостях jQuery и его плагин slick-carousel, который создает из тумб карусель. Зависимости грузятся синхронно, в той очередности, в которой вы указываете. И после зависимостей грузится класс модуля vehicle-gallery.js. Далее, после загрузки файла модуля и его зависимостей мы инициализируем модуль в с помощью события afterInclude.

Статистика результатов.


Подведем итоги результатов создания Mobile First страницы.

Нижний график показывает, что не оптимизированная страница на 73% тяжелее, чем страница адаптированная под требования Mobile First. Таким образом мы можем сэкономить 186.94 KB, которые возможно и не понадобятся пользователю при просмотре вашей страницы.

Заключение


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

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

Пример Mobile First старницы
Пример не Mobile First страницы

P.S. В этой статье я хотел показать как правильно использовать Mobile First подход с помощью фреймворка Moff.js

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

[Из песочницы] Введение в RxJava, часть первая – Вступление: Почему Rx?

сегодня в 16:48

Этот цикл статей предназначен для знакомства начинающего реактивного программиста с мощью библиотеки RxJava ˜— реализации принципов реактивного программирования для JVM. Это перевод обширного туториала по RxJava Крисса Фруссиоса, основанного на IntroToRx для Rx.NET.

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

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

  1. Примеры с выводом в консоль (рекоммендовано для читающих в первый раз)
  2. Самопроверяющиеся примеры в форме JUnit тестов

Содержание:

  • Часть первая – Вступление
    1. Почему Rx?
    2. Ключевые типы
    3. Жизненный цикл Observable
  • Часть вторая – Последовательности
    1. Создание последовательности
    2. Фильтрация последовательности
    3. Исследование
    4. Агрегация
    5. Трансформация последовательностей
  • Часть третья – Управление последовательностями
  • Часть четвертая – Паралельность

Часть первая – Вступление: Почему Rx?


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


Добро пожаловать в Rx. Rx – это мощный инструмент, который позволяет решать проблемы в элегантном декларативном стиле, присущем функциональному программированию. Rx обладает следующими преимуществами:
  • Интуитивность
    • Действия в Rx описываются в таком же стиле, как и в других библиотеках вдохновленных функциональным программированием, например, Java Streams. Rx дает возможность использовать функциональные трансформации над потоками событий.

  • Расширяемость
    • RxJava может быть расширена пользовательскими операторами. И хотя Java не позволяет сделать это элегантным образом, RxJava предлагает всю расширяемость доступную в реализациях Rx на любом другом языке.

  • Декларативность
    • Функциональные трансформации обьявлены декларативно.

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

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


Когда следует использовать Rx?

Rx применяется для составления и обработки последовательностей событий.
Следует использовать Rx

  • UI события, такие как mouse move, button click
  • События вроде изменения свойства, обновления коллекции, «Заказ оформлен», «Регистрация закончена» и т.д.
  • Инфраструктурные события (сообщения от системы, WMI или файловых менеджеров)
  • Интеграция с событиями от шины сообщений (message bus), сообщениями из WebScoket API)
  • Интеграция с CEP-системами (StreamInsight, StreamBas)

Возможно использование Rx

  • Результат Future или похожего паттерна

Не следует использовать Rx

  • Для превращения Iterable в Observable только для того, чтобы работать с ними через библиотеку Rx.

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

Android Developer

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Должность — тимлид

Тимлид (aka ведущий разработчик, team leader) — один из таких «специалистов», обязанности которого многие видят по-разному. Думаю, что складываются различные представления примерно так: поработал кто-то в команде под руководством тимлдида, который хорошо справлялся с задачами проектирования системы, и считает теперь, что это именно то, что должен делать тимлид; в другой же команде тимлид плохо справлялся с планированием спринтов, а с другими обязанностями более или менее, и стали считать сотрудники, что планирование — не то, чем должен заниматься тимлид.

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

Откуда же появляется разное представление о должности тимлида?


ПРИМЕЧАНИЕ. Здесь и далее я говорю про тимлида только в рамках команды разработки. Догадываюсь, что многое из рассуждений распространяется и на другие команды, во многих видах деятельности.


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

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

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


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

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

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


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

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

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

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

Что же конкретно тимлид должен делать?

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

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

Это и есть фронт работ тимлида.

Разберем, что с этим нужно делать.

Лидерство


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

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

  1. Проявлять искреннюю личную заинтересованность в успехе проекта. В современной команде разработчиков все видят все, что делают остальные, как делают, насколько стараются. Разработчики с большей охотой пойдут за тем, кто сам вовсю старается ради успеха проекта, даже если этот кто-то и формальной власти то не имеет, из желания помочь. Такой лидер легко удерживает инициативу, пока не выдохнется или не потеряет интерес к проекту.
  2. За счет знания технологий и устройства проекта лучше всех в команде. К таким лидерам тянутся заинтересованные в профессиональном росте разработчики, они часто именно за этим и приходят в проект. Логично, что при достижении разработчиками уровня лидера, если других факторов нет, лидер теряет инициативу, что на практике выражается постоянной критикой решений, порой приводит к игнорированию распоряжений или скрытым саботажам.
  3. Способен добиться уважения окружающих за счет личных качеств. Когда человек объективен, справедлив, последователен, сотрудники могут полагаться на такого человека и его решения. Однако для того, чтобы команда разглядела эти качества в потенциальном лидере требуется время, за которое лидерство захватит кто-нибудь другой. Этот фактор наиболее устойчив к различного рода переменам в команде.
  4. Умение эксплуатировать настроения отдельных членов команды, заставляя действовать по своему плану (кино Filth сразу вспомнилось http://ift.tt/1f4kakk). Видел таких лидеров, даже немного поработал в профессиональной юности сдуру, но вовремя сбежал. Очевидно, что опытными специалистами, знающими себе цену, долго не поманипулируешь.
  5. Применение административных мер, предоставляемых формальной властью, для того, чтобы заставить сотрудников выполнить обязательства. Если этот фактор лидерства единственный, то это явный пример системы отношений «я — начальник, ты — дурак». Работает также на довольно ограниченном множестве сотрудников.

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

Компетентность команды


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

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


В чем же здесь проявляется профессионализм тимлида?

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

Среди способов пополнения кадрами вижу принципиально два подхода:

1. Брать готовых специалистов с рынка труда.
2. Воспитывать кадры самостоятельно.

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

Что же может пойти не так?

  1. Типовая ошибка — найм недостаточно компетентных сотрудников в силу неумения выявить профессиональные качества кандидата. Простые примеры — это неумение или боязнь задать правильные вопросы на собеседовании, смещение акцента на эзотерические особенности технологий, а не на их практическую сторону. Последствия ожидаемы — кандидат не справляется со взятыми командой обязательствами, следовательно и тимлид тоже.
  2. Другая крайность — найм только экспертов. Чтобы не ошибиться в найме после набития шишек, или из желания собрать команду мечты, тимлид тщательно отбирает только не уступающих в знаниях ему самому кандидатов. Так как такая манера больше свойственна лидерам-экспертам, то ценз получается довольно высоким. Кандидаты ищутся долго, затраты на подбор растут, задачи проекта не решаются, а у тимлида есть отличная отговорка — нет специалистов. Но даже когда команда собрана оказывается, что звезды с рутинными задачами готовы мириться, но хотелось бы задач с вызовом (challenge) и каждому, а вот пойти мусор подмести в проекте никому не хочется. Да и обстановка какая-то напряженная становится, как известно у 4-х архитекторов 8 мнений, большинство из них правильные, хоть и противоречат друг-другу.
  3. Еще типичный пример — игнорирование потребности в привлечении в команду сотрудников других специальностей, например фронтендщика, эксперта в определенной БД, проектировщика интерфейса и т.д. Часто такое происходит просто из-за непонимания того, что такой специалист в команде нужен. В итоге команда суровых бэкендщиков разрабатывает кое как работающий фронтенд в своем проекте, команда разработчиков месяцами бьется с оптимизацией PostgreSQL, ну и мой любимый случай — психбольница в руках пациентов.
  4. Пример сложнее — неравномерность найма, взял пачку джуниоров, чтобы два раза не вставать, а они как начали код писать так, что ревьювить команда не успевает, да еще подходят вопросы всякие задают непрерывно, ломают что-то постоянно.
  5. Или наоборот, работаем, концентрируемся на задачах, найм на потом откладываем, как внезапно уходит кто-то из ключевых сотрудников, другой в отпуске/болеет/забрали в другой проект, а на смену никого из подрастающего поколения нет. Скажете, что мол, ситуация неожиданная? Так вот к такой ситуации тимлид всегда должен быть готов, заранее продумывая как он поступит в случае потери того или иного члена команды. А еще лучше если он отношения построит так, чтобы заранее узнать о таком исходе.

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

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

Оценка работ


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

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

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

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

Настроения в команде


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

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

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

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

Заключение


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

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

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

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.