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

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

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

 

 -Статистика

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

Habrahabr/New








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

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

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

Сколько стоит перевести Хабр?

Четверг, 10 Августа 2017 г. 14:57 + в цитатник

Метки:  

Как участие в профессиональных ИТ-сообществах влияет на карьеру

Четверг, 10 Августа 2017 г. 14:50 + в цитатник
image

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

Поэтому, месяц назад мы ввели на «Моём круге» рейтинги участия в ИТ-сообществах. Теперь каждый соискатель может показать на своём профиле, какой вклад он внёс и какие награды получил на «Хабре» и «Тостере», на StackOverflow и GitHub.

Но какую именно роль профессиональные ИТ-сообщества играют в жизни разработчиков и в их карьере? Насколько для работодателя важна информация об участии соискателя в этих сообществах? Какие сообщества более важны, а какие менее? Можно ли всё это как-то посчитать, измерить и оценить?

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



Портрет аудитории опроса


Посмотрим, кто принимал участие в опросе. В принципе, мы видим всё то же распределение по специализациям и типам компаний, что в наших предыдущих опросах. В этот раз мы решили еще уточнить позицию/квалификацию по общепринятой среди разработчиков классификации. И в очередной раз убедились, что на «Моём круге» сеньоры и лиды составляют значительную часть сообщества (44%).

image



Участие в ИТ-сообществах


Подавляющее большинство опрошенных следит за «Хабрахабром» (85%), почти каждый второй следит также за «Гиктаймсом», GitHub и StackOverflow, каждый третий следит за «Тостером». Половина опрошенных никак не участвует в этих сообществах в качестве авторов. Почти каждый третий вносит свой вклад в GitHub, каждый седьмой — в StackOverflow, каждый восьмой — в «Хабрахабр» и «Тостер».

Среди других сообществ называли по большей части профильные группы в соцсетях, мессенджерах и на форумах, упоминали медиум, а также такие сообщества как Open Data Science, Web Standards и Reddit и другие.

image



Большинство (60-75%) участвует в ИТ-сообществах для личного развития: следят за трендами, поддерживают свои навыки, учатся. Меньше (20-40%) участвуют ради конкретной практической пользы: для развития своих проектов и расширения контактов, хорошего портфолио и карьеры. И ещё меньше (10-20%) участвуют ради помощи другим: обучают или развивают чужие проекты.

image



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

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

image



Взгляд на ИТ-сообщества со стороны соискателя


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

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

image



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

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

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

image



Взгляд на ИТ-сообщества со стороны работодателя


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

image



Трое из четырёх работодателей интересуются участием кандидата в GitHub (75% интересуются). Каждый второй интересуется участием в «Хабрахабре» (48%). Чуть меньше интересуются участием в StackOverflow (39%). Каждый десятый — участием в «Тостере», «Гиктаймсе», Behance, Dribbble.

image



У каждого четвёртого работодателя были случаи, когда участие кандидата в ИТ-сообществе играло значительную роль в принятии решения о приглашении его на работу.

Самое влиятельное в этом смысле сообщество — опять же GitHub. Почти в трёх случаях из четырёх это сообщество оказывает решающую роль в приглашении кандидата на вакансию. В трети случаев такую роль играет «Хабрахабр». В каждом пятом случае — StackOverflow.

image



Выводы


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

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

Во-вторых, мы выяснили, что GitHub является самым влиятельным сообществом в сфере найма: почти трое из четырёх работодателей обращают внимание и принимают решения о найме по участию кандидата в этом сообществе. Второе место принадлежит «Хабрахабру»: каждый второй смотрит на него, каждый третий по нему принимает решение о найме. Третье место принадлежит StackOverflow: каждый третий смотрит, каждый пятый принимает ключевые решения.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335344/


В разрезе: новостной агрегатор на Android с бэкендом. Библиотека обхода интернет-сайтов на Java (crawler4j)

Четверг, 10 Августа 2017 г. 14:41 + в цитатник
Вводная часть (со ссылками на все статьи)

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


Выбранным решением был достаточно популярный робот для обхода сайтов — crawler4j. Он, конечно тянет за собой массу библиотек для анализа полученного контента, однако это не сказывается на скорости его работы или потребляемых ресурсах. В качестве БД ссылок использует Berkley DB, создаваемому в настраиваемом каталоге для каждого анализируемого сайта.

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

Фактически для разработчика «паук» выглядит как библиотека, которая подключается к проекту и в которую передаются необходимые реализации интерфейсов для кастомизации поведения. Разработчиком расширяется библиотечный класс «edu.uci.ics.crawler4j.crawler.WebCrawler» (с методами «shouldVisit» и «visit»), который в последующем передаётся в библиотеку. Взаимодействие в процессе работы выглядит примерно таким образом:
image
, где edu.uci.ics.crawler4j.crawler.CrawlController — основной класс библиотеки, через который осуществляется взаимодействие (настройка обхода, передача управляющего кода, получение информации о статусе, запуск/остановка).

Реализацией парсинга сайтов ранее не приходилось заниматься – поэтому сразу же пришлось столкнуться с серией проблем и в процессе их устранения потребовалось сделать несколько решений по реализации и способам обработки полученных данных обхода:
  • код анализа полученного контента и реализация шаблона «Стратегия» вынесен в виде отдельного проекта, версионность которого идёт отдельно от версий самого «паука»;
  • фактический код анализа полученного контента и анализа ссылок реализован на groovy, что позволяет изменить логику работы без перезапуска пауков (активирована опция «recompileGroovySource» в «org.codehaus.groovy.control.CompilerConfiguration») (при этом соответствующий код реализации «edu.uci.ics.crawler4j.crawler.WebCrawler» фактически содержит в себе лишь интерпретатор groovy, который обрабатывает в себе переданные данные);
  • извлечение данных с каждой встреченной страницы в «пауке» осуществляется не полное – убираются комментарии, «шапка» и «подвал», т.е. то что бессмысленно тратит 50% объёма каждой страницы – всё остальное сохраняется в базе MongoDB для последующего анализа (это позволяет перезапустить анализ страниц без повторного обхода сайтов);
  • ключевые поля для каждой новости («дата», «заголовок», «тема», «автор» и т.д.) извлекаются уже из базы данных на MongoDB, при этом контролируется их заполненность – при достижении определённого количества ошибок – отправляется уведомление о необходимости корректировки скриптов (верный признак изменения структуры сайта).


Изменение в коде библиотеки


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

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

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

Спасибо за внимание!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335340/


Метки:  

Разворачиваем Emercoin testnet и получаем много бесплатных монет

Четверг, 10 Августа 2017 г. 14:17 + в цитатник


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

Специально для таких случаев существует режим “test mode”, когда монеты можно добывать центральным процессором любого маломощного ПК, но при этом они обладают всеми немонетарными свойствами “больших” монет EMC. Тестовые монеты можно пересылать на тестовые же адреса, создавать сколько угодно блокчейн-записей NVS, а кошельки в этом режиме объединять в testnet.

Сделать это очень просто:

Для начала надо скачать и установить последний кошелек Emercoin
Затем открыть emercoin.conf* и прописать:

testnet=1

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



addnode 188.166.12.157 add

Ну и теперь самое сладкое, добываем монеты, как в старом добром 2009 году — процессором!
Опять заходим в консоль и вводим:

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

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

setgenerate false

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

Для удобства отслеживания записей мы так-же развернули блокчейн эксплорер для публичного тестнета — testnet.emercoin.mintr.org он имеет тот-же функционал, что и для “большого Эмера”, между ними можно удобно переключаться.



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

Как это сделать?

Для начала Вы должны создать изолированную от Интернета локальную сеть, в которой будете производить эксперименты. Изоляция нужна, чтобы Ваш testnet не присоединился к публичному.
Далее, в этой тестовой сети установить как минимум два кошелька с активированной опцией testnet=1, как было указано выше.
После этого, на каждом узле Вашего локального тестнета, в консоли запустите команды “addnode”, как было указано в примере выше. В качестве IP-адресов укажите IP-адреса других компьютеров, где запущены узлы Вашего локального тестнета.
Например предположим, что Вы установили тестнет-кошельки на Ваших локальных машинах 192.168.1.10 и 192.168.1.11. Тогда в консоли кошелька на машине 192.168.1.10 введите “addnode 192.168.1.11 add”, а соответственно в консоли кошелька на машине 192.168.1.11 введите “addnode 192.168.1.10 add”.
Можно эти параметры внести в файл emercoin.conf. Таким образом, скажем на машине 192.168.1.10 он будет выглядеть так:

setgenerate=true 1
addnode=192.168.1.11
testnet=1

*Файл emercoin.conf находится в директории, где расположен блокчейн:

Linux/FreeBSD: $HOME/.emercoin
Windows: C:\Users\%User%\AppData\Roaming\EmerCoin

Если файла не существует — создайте его. При создании нового файла в Windows будьте внимательны — отключите “сокрытие расширений” в file explorer-е, чтобы не создать файл emercoin.conf.txt вместо emercoin.conf (Windows такое любит).
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335338/


Метки:  

Colibri-ui — наше решение по автоматизации тестирования мобильного приложения

Четверг, 10 Августа 2017 г. 14:14 + в цитатник
C ростом команд неизбежно растет количество фич, а вместе с тем и тестовая модель и количество тест-кейсов, которые необходимо проверять при регрессионном тестировании. При этом количество команд растет не просто так, в нашем случае бизнесу хочется релизиться все чаще и чаще, не потеряв в качестве.

То, как мы в Альфа-Лаборатории решали проблему поиска баланса между скоростью, бюджетом и качеством, мы и рассмотрим сегодня на примере Альфа-Мобайла. Забегая вперед, ВНИМАНИЕ, СПОЙЛЕР!!! наше решение доступно на github: библиотека colibri-ui и шаблон colibri-ui-template для быстрого старта.

В написании статьи принимали активное участие Павел pvivanov и Лилия Lidiyatullina




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


В далёком 2013 нас даже не посещали мысли об автоматизации тестирования, поскольку процесс регрессионного тестирования занимал один день одного тестировщика на обе ОС (iOS/Android).

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

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

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

Не добавляет мотивации такое положение дел и самим тестировщикам. В определенный момент у нас даже появилась шутка “На регресс как на праздник!”

Что делать?


Проблему нужно было как-то решать, и у нас было два пути “пристроить баблишко”:

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

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

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

  1. Инструмент для автоматизации тестирования должен быть с максимально низким порогом входа в разработку для начала его использования.
    Речь о минимизации написания кода, избавлении от написания сложных локаторов и т.д., поскольку основными пользователями инструмента являются тестировщики из продуктовых команд, которые могут не иметь опыта автоматизации.
  2. Сценарии тестов должны быть понятны пользователям, не связанным с разработкой;
  3. Решение должно быть кроссплатформенным и работать сразу на двух платформах — Android и iOS;
  4. Должна быть сформирована ферма с подключенным набором мобильных устройств;
  5. Решение должно быть масштабируемым на другие мобильные приложения банка.


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

  • Robotium
  • Espresso
  • UI Recorder
  • Keep it Functional
  • Calabash
  • Appium

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

Снижаем порог входа в разработку


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

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

Итак, как же выглядит наше решение со стороны пользователя?

Then загружена страница "Главный экран"
When скролл внутри "Основной список" до "Платежи и переводы"
When выполнено нажатие на "Платежи и переводы"
Then загружена страница "Платежи и переводы"
When скролл внутри "Список платежей и переводов" до "Мобильная связь"
When выполнено нажатие на "Мобильная связь"


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

When перейти в раздел "Мобильная связь"


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

Описываем экраны


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

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

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

Составные части описания страницы как набора элементов:


  • Content description — по этому идентификатору можно найти элементы на Android;
  • ResourceId / AccessabilityIdeitificator — уникальный идентификатор. Иногда разработчики приложений не ставят идентификаторы, но это самый желанный элемент, который мы можем найти в разметке приложения для Android / iOS соответственно;
  • Text — видимый текст, например, на кнопке, на которую можем нажать;
  • XPath — обычный XPath по xml-разметке. Используется в случаях, когда предыдущими тремя способами однозначно описать элемент не получилось.


Имя элемента (Name in story) мы будем использовать в сценарии, по нему будем вытаскивать Content description / ResourceId / AccessabilityIdeitificator / Text / XPath.

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



Кажется, что куда уже проще! Описали экран, написали сценарий, запустили автотесты, но поговорим немного про нетривиальные задачи и посмотрим на наш фреймворк colibri-ui изнутри.

Настраиваем окружение


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

В настоящее время описания мобильных устройств хранятся в виде набора папок, в каждой из которых содержатся файлы настроек типа .property и json-объект. В файле типа .property указаны udid и имя устройства, json-объект содержит описание настроек ноды для работы в режиме кластера (см. шаблон colibri-ui-template).

Небольшой оффтоп, или как получить udid подключенных устройств!

Для Android мы выполняем в консоли «adb devices», для iOS — " instruments -s devices | grep -v (Simulator|$(id -un))" и получаем список подключенных девайсов. В случае с Android в списке будут как реальные устройства, так и эмуляторы, а для iOS мы фильтруем только реальные устройства. Если кому-то необходимо получить только эмуляторы, необходима другая фильтрация «instruments -s devices | grep Simulator».

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

Дополнительно отметим, что для работы вышеуказанных команд на вашем Mac должны быть установлены ADB Driver и Xcode соответственно. При работе с эмуляторами также не забываем выкачать их образы.

Описываем пользователя


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

Файлы с учетными данными пользователей также лежат в проекте отдельной папкой. В перспективе, так же как и с устройствами, перенести их в БД или централизованное хранилище.
В сценариях и описаниях страниц мы используем маркеры вида #userName#, по которым получаем значение property из файла пользователя и заменяем эти маркеры в процессе прогона.

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

Вот так это выглядит в описании страницы:



Вот так это выглятит в файле user.property:

paymentAccountRur=··0278
beneficiarAccountRur=··0163
beneficiarAccountUsd=··0889
beneficiarAccountEur=··0038


Обязательно должны быть указаны ключи и значения.

Формируем Uber-шаги и некоторые побочные эффекты


Мы начали разработку с описания довольно мелких шагов, например, ввести текст или нажать на что-то. Со временем мы поняли, что писать сценарии мелкими шагами, либо писать сложные шаги, например, вернуться на главный экран, без дублирования кода мы не можем. Так начались поиски решения для переиспользования мелких шагов в более крупные.
Первой попыткой было добавить в проект guiсe, для организации DI, но его внедрение несло с собой переработку почти всего ядра проекта. А поскольку в зависимостях, прямо в appium-java-client, уже есть Spring, для нас решение стало очевидным и следующим нашим шагом было внедрение Spring.

При внедрении Sping в наш проект объем изменений был минимальный. В самой глубине проекта изменилась только фабрика шагов JBeHave и пара строчек в подключении Allure report. Почти все классы были объявлены компонентами и убрано большинство зависимостей.

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

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

Запускаем проект


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

./gradlew --info clean test --tests "*AndroidStories*" -Dorg.gradle.project.platform=Nexus6p_android6 -Dorg.gradle.project.user=6056789 -Dorg.gradle.project.testType=smokeNewReg -Dorg.gradle.project.buildVersion=9.0.0.7,development


Из примера видно, что тесты запускаются для Android (--tests "*AndroidStories*"). Также в качестве параметров передаются:

Устройство, на котором будет запущен прогон тестов, Nexus6p_android6. Не забываем описывать устройство в проекте, об этом мы писали выше. Вот так это сделано у нас.

Файл device.properties содержит:

UDID=ENU14008659
deviceName=Nexus6p


Файл test_node.json содержит данные для запуска ноды.

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

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

Meta:
@regressCycle
@smokeCycle


В файле testCycle.properties содержатся ключи и значения к меткам.

smoke=+smokeCycle,+oldRegistration,-skip
smokeNewReg=+smokeCycle,+newRegistrationCardNumber,-skip
smokeNewAccountReg=+smokeCycle,+newRegistrationAccountNumber,-skip
regress=+regressCycle,+oldRegistration,-skip
regressNewReg=+regressCycle,+newRegistrationCardNumber,-skip


Таким образом, благодаря наличию Meta Matcher в JBehave, мы можем формировать набор тестовых сценариев на конкретный цикл тестирования.

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

remoteFilePathReleaseAndDevelopment=http://mobile/android/mobile-%2$s/%1$s/mobile-%2$s-%1$s.apk


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

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

Формируем отчет


В нашем проекте отчет формируется с помощью allure report. Поэтому после того как тесты отработали, достаточно выполнить “allure generate directory-with-results”

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

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

Результат, который мы получили


Подведем итог по задачам, которые мы перед собой ставили.

  1. Нам удалось сделать инструмент для автоматизации тестирования с довольно низким порогом входа в разработку. В среднем, как показала практика, тестировщику достаточно две недели для того, чтобы уверенно начать писать и запускать автотесты. Наибольшие трудности у тестировщиков связаны с окружением по настройке appium.
  2. Сценарии тестов понятны всем членам команды, это особенно важно, когда на вашем проекте применяется BDD-методология.
  3. Наш фреймворк может работать одновременно с двумя платформами — iOS и Android.
  4. В текущий момент мы сформировали ферму из десяти мобильных устройств и Mac Pro. Проект интегрирован с Jenkins, и любой тестировщик может запустить автотесты в параллели на всех десяти устройствах.
  5. Наше решение масштабируемое и уже несколько мобильных проектов активно работают с нашим фреймворком и запускают автотесты.

В качестве бонуса:

  1. На одном из мобильных проектов за счет автоматизации мы полностью избавили функциональных тестировщиков от тестирования front-а на обратную совместимость с backend-ом. После внедрения автоматизации время тестирования в данном случае сократилось в 8 раз (с 8 часов до 1 часа).
  2. Новые автотесты пишутся тестировщиками в спринте вместе с разработкой новой функциональности в мобильных приложениях;
  3. Часть регрессионного тестирования уже автоматизирована, как следствие — мы сократили время на регресс с 8 дней до 1 дня. Это позволило нам релизиться чаще, а тестировщики перестали выпадать из команд на период регрессионного тестирования. Ну и просто стали чуточку счастливее :)


Результаты оправдали наши ожидания и подтвердили правильность решения пойти в автоматизацию.

Мы продолжаем развивать наше решение, которое доступно на github: библиотека colibri-ui и шаблон colibri-ui-template для быстрого старта. Дальше только больше!

Если вы хотите стать одним из тестировщиков Альфа-Лаборатории (или не только тестировщиком) — у нас есть открытые вакансии.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335278/


8 каких-то странных мифов про HR-технологии

Четверг, 10 Августа 2017 г. 13:50 + в цитатник
Сколько провокационных материалов с заголовками мы видим в последнее время “Искусственный интеллект убивает профессии”, “Боты заменят рекрутеров”, “Профессия HR’ам умрет в 2019 году”, “Компании покупают робота Клаву, а рекрутеры больше никому не нужны!”. И это каждый день! Сколько же там уже наванговавших разрушение мира, просто падение культуры рекрутмента — ужас. Но мы придерживаемся другого мнения и видим реальную картину с ботами, AI, автоматизацией и другими процессами.



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

Технологии сокращают время работы.
Оказывается, это не совсем правда.




По статистике Glassdoor, процесс найма сотрудника в 2016 году составлял 23 дня по сравнению с 10 днями в 2013 году (только в Великобритании количество дней, которые затрачиваются на найм, увеличилось с двух до четырёх недель). Это значит, что стали тратить существенно больше времени на скрининг (множество тестирований от употребления запрещенных веществ до проверки реальных навыков и бэкграунда) — компании стараются получить как можно больше нужной информации о кандидате, чтобы убедиться в том, подходит он или нет. В том числе, чтобы потом не облажаться и не потерять сотрудника через месяц, и не оправдать ожиданий человека.

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

Технологии не влияют на количество сотрудников (утешительное!?).
Влияют, но сказать “заменяют”, нельзя.




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

На митапах и встречах мы часто рассказываем о том, как приходим в компании с готовым решением. Например. Вот в компании «N» 10 девушек регулярно перепечатывают данные в таблицы. Только этим занимаются 24/7. И, скажем, у нас есть решение для подобных ситуаций (ну мы про автоматизацию же!). После этого возникают вопросы, мол, а как же так? Ведь пропадают рабочие места!

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

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

Работа HR’а сводится к нулю — “нас точно заменят!”.
Нет, это неправда.




Кадровики ушли в прошлое, но крутые специалисты в сфере остались, да ведь? Теперь работа с кадрами не заканчивается никогда: поиск, вовлечение, адаптация, обучение, развитие талантов, а потом ещё обучение и работа с брендом!

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

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

Да, мы ждём, что конкуренция за талантливых специалистов тоже будет возрастать. Так что знаний потребуется намного больше: знать, что происходит на рынке, чего ждут кандидаты, как удерживать сотрудников, чем мотивировать их завтра, а чем — сегодня. HR-департаменту предстоит соединить в себе множество функций, стать принципиальным для бизнеса направлением. Стать маркетологами, научиться считать ROI и владеть аналитикой, понимать, как искать особенных специалистов, будь то разработчик, администратор в офисе или ещё один бухгалтер. Технологии приходят на помощь именно в этот момент, позволяя выполнять обязанности и контролировать эффективность в одной платформе (или нескольких, если необходимо).

Искусственный интеллект переворачивают рекрутмент с ног на голову.
Ну, скорее разговоры о нём.




Хабрахабр, конечно, не лучшее место для размышления об ИИ, но мы попробуем.
Что такое ИИ? Это научное направление (подчеркнуть “наука” несколько раз), основанное на моделировании человеческой деятельности, которую традиционно считают интеллектуальной. ИИ — это история про то, что машина может что-то творить. Это то, что раньше считалось прерогативой человека. Существует несколько «примеров» того, как уже влияет ИИ на рекрутинг и какие технологические продукты создаются сейчас на рынке (Mya, Textio, Pymetrics и так далее). Почему у нас возникают сомнения относительно того, что ИИ реально присутствует в большинстве проектах (которые заявляют о том, что они “really use AI”)?

— «Искусственный интеллект» — отличное словосочетание в первую очередь для продвижения продукта. Но суть в том, что это вставленное “ИИ” может никак не влиять на удобство и инновационность сервиса. Что само по себе как-то странно, согласитесь!
— Загадочность! Она прям окружает все стартапы, которые заявляют об использовании искусственного интеллекта. Все сервисы для рекрутмента, которые сейчас позиционируют себя как AI’шные, содержат в себе некоторые элементы, например, помогающие при осуществлении поиска или анализе потребностей человека, навыков. Ни один из них не рассказывает открыто и в подробностях о том, как технология работает и как реально соотносится с понятием AI.

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

Технологии небезопасны — за нами и так все следят, а тут ещё это!
Нет, это безопасно.




Окей, то есть доверить свои отпечатки пальцев Apple вы готовы, а перейти со старой системы, установленной на компьютере — нет? Удивительно! Мы все давно пользуемся картами, оплачиваем покупки смартфоном, и делимся подробностями личной жизни в социальных сетях. Почему же вас так пугают облачные системы? Всегда интересуйтесь у создателей платформ, которыми вы пользуетесь, где хранятся ваши священные данные, в какой стране и насколько хорошо они защищены. Сейчас всё довольно строго со 152 ФЗ, так что всем сервисам приходится подстраиваться. А если нет, то и ответа вам никакого адекватного не дадут.

Автоматизация — это сплошные волшебные кнопки!
И снова нет.




ОП! И инструмент сам ищет кандидатов.
ОП! Бренд работодателя просто сверкает от привлекательности.
Это так не работает. Автоматизация — это возможность передать машине (окей, системе) те задачи, которые вы делаете вручную и тратите время. Автоматизация — это отказ от рутинных функций в пользу интеллектуального труда. Так что если вы никогда не искали кандидатов в мессенджерах, и никогда вам это было не надо — зачем вам бот в Telegram? Сто раз взвесить такое решение надо.

Это вообще такая головная боль — стараться поспевать за всеми появляющимися digital-решениями не анализируя необходимость их использования. И не понимая, зачем вам нужен, скажем, видео-суперпупер-бот, новый сайт с огроменной анимацией про карьеру с блогом, автопоиск кандидатов в Instagram или что-то ещё. «Потому что у компании „Z“ уже есть!» — плохой ответ.

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

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




Здесь есть два обычно пугающих момента: «очень долго согласовывать» и «сложно использовать». Так что разберемся.

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

И ко второму сомнительному мифу: да, мы знаем, что некоторые компании только сейчас переходят вообще с «папок на компьютере» к специальным системам для работы. Но при условии, что один инструмент позволяет сократить расходы на закрытие вакансии (вспомним кейс с перебиванием информации из таблиц), а также позволяет повысить эффективность работы команды с конкретными задачами, можно потратить время на обучение, на разбор функций и прочее. Вновь — это стоит потраченных усилий и точно не является оправданием при хранении данных в Google Docs. И помните, что любая система создаётся для пользователя: чтобы вы могли быстрее обучиться, вникнуть и начать работать. Прямо как при адаптации нового сотрудника ;)

Как не таргетируй и не ищи, лучший источник поиска — работный сайт.
Нет, потому что это не идеальный источник (как и любой другой)!




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

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

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

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

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

https://habrahabr.ru/post/335288/


Метки:  

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

Четверг, 10 Августа 2017 г. 13:37 + в цитатник


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

Введение


Официальный сайт утилиты — https://www.wlanpros.com/resources/wifi-beat/
GirHub — https://github.com/WiFiBeat/WiFiBeat

WiFiBeat позволяет работать с Wi-Fi адаптером в режиме монитора, создавать из фреймов JSON объекты и отправлять в базу данных аналитического движка Elasticsearch. Кроме этого, WiFiBeat может читать фреймы из PCAP файла.
Анализ собранной информации происходит в другом бесплатном продукте от Elastic — визуализаторе Kibana.



WiFiBeat официально стабильно работает на Ubuntu 16.04, но, конечно, его можно запустить и на других дистрибутивах, однако могут возникнуть трудности с зависимостями и несоответствием версий библиотек, под которые писалась утилита. Мы будем использовать 64-битную Ubuntu 16.04, к которой подключен USB Wi-Fi адаптер TP-LINK TL-WN722N в режиме монитора, для запуска WiFiBeat.
Elasticsearch и Kibana будут развернуты на 64-битной Debian 9.

Установка WiFiBeat


Процесс установки детально описан на GitHub.

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

wget https://github.com/mfontanini/libtins/archive/v3.5.tar.gz
tar -zxf v3.5.tar.gz
cd libtins-3.5
apt-get install libpcap-dev libssl-dev build-essential libboost-all-dev
mkdir build
cd build
cmake ../ -DLIBTINS_ENABLE_CXX11=1
make
make install
ldconfig

Устанавливаем недостающие пакеты в систему

apt-get install libyaml-cpp-dev libpoco-dev rapidjson-dev libtsan0 libboost-all-dev libb64-dev libwireshark-data build-essential libnl-3-dev libnl-genl-3-dev libnl-idiag-3-dev

Устанавливаем Codelite для сборки WiFiBeat

apt-get install codelite codelite-plugins

Запускаем codelite и создаем новый workspace



Тип C++



Запоминаем директорию



Когда workspace создан, переходим в директорию и скачиваем WiFiBeat и библиотеки с GitHub.

cd /root/WiFiBeat
git clone https://github.com/WiFiBeat/WiFiBeat
git clone https://github.com/WiFiBeat/elasticbeat-cpp
git clone https://github.com/WiFiBeat/simplejson-cpp

Добавляем все 3 проекта в наш workspace в codelite





В итоге должно получиться следующее



После двойного клика на wifibeat в списке проектов, он должен выделиться



Правым кликом на wifibeat выбираем Build



Выбираем компилятор, если не был выбран, и снова Build



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

====0 errors, 2 warnings, total time: 00:01:13 seconds====

Настройка


Процесс установки Elasticsearch и Kibana не будет рассматриваться в данной статье. На эту тему есть достаточно материалов в сети. Предполагаем, что они работают на машине 192.168.1.30, а WiFiBeat на машине 192.168.1.31. Elasticsearch слушает HTTP порт 9200 и не требует аутентификации.

К машине 192.168.1.31 я подключил Wi-Fi адаптер и перевел его в режим монитора.
В системе он отображается как mon0.

Из каталога с WiFiBeat копируем конфигурационный файл в etc и редактируем

cp wifibeat.yml /etc
vi /etc/wifibeat.yml

Этот файл хорошо документирован, коротко пройдемся по основным опциям.

Я собираюсь анализировать трафик одной сети, работающей на пятом канале диапазона 2.4 ГГц.
Поэтому в настройках интерфейсов оставляю одну запись. Есть возможность анализировать сразу несколько каналов и для каждого задать время прослушивания.

wifibeat.interfaces.devices:
        mon0: [5]

Удаляю все из раздела Output file
В разделе с PCAP-фильтрами я задам следующее

wifibeat.interfaces.filters:
                mon0: type mgt

Здесь указываются фильтры как в Wireshark, и в данном случае я указываю, что меня интересуют только Management фреймы 802.11. К ним относятся:

  • Authentication frame
  • Deauthentication frame
  • Association request frame
  • Association response frame
  • Reassociation request frame
  • Reassociation response frame
  • Disassociation frame
  • Beacon frame
  • Probe request frame
  • Probe response frame
  • Request to Send (RTS) frame
  • Clear to Send (CTS) frame
  • Acknowledgement (ACK) frame

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

В разделе Queues ничего менять не буду и в разделе Outputs задам адрес и порт Elasticsearch.

output.elasticsearch:
  enabled: true
  protocol: "http"
  # Array of hosts to connect to.
  hosts: [ "192.168.1.30:9200" ]

Сохраняем и переходим в каталог с WiFiBeat и подкаталог Debug. Здесь должен находиться скомпилированный исполняемый файл wifibeat.

Запуск


Запускаем Elasticsearch и Kibana на машине 192.168.1.30. Убеждаемся, что прослушивается порт 9200 (Elasticsearch) и Kibana (5601).

На машине 192.168.1.31 проверяем, что мы не допустили ошибок в конфигурации

./wifibeat -d

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

./wifibeat -f

Ключ -f позволяет запустить wifibeat не в режиме демона. Для нас это пока удобнее.

Теперь если вы откроете Kibana и проверите индексы, то должны увидеть, что появился новый индекс wifibeat*



Настроим Kibana. Переходим в Management, Index Patterns



Создаем новый шаблон





Отмечаем его как основной



Теперь импортируем Dashboard-ы и Визализации, которые идут в комплекте с WiFiBeat





Выбираем файл kibana.json из каталога WiFiBeat/kibana

Если импорт прошел успешно, можно перейти на вкладку Dashboard и найти там WLAN



Если не использовать фильтры в wifibeat.yml он будет выглядеть так



С фильтрами (в нашем случае), мы не будем видеть данных по Control Frames и Data Frames.

Помимо дэшбордов у нас появились новые визуализации





В заключении


Далее при помощи еще одного компонента пакета Elasitc — X-Pack можно настроить действия при обнаружении, скажем всплеска фреймов деаутентификации, что может означать DoS атаку или попытку заполучить хэндшейк для брутфорса. Таким образом можно собрать систему обнаружения атак на беспроводную сеть.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335134/


Метки:  

[Перевод] Load Average в Linux: разгадка тайны

Четверг, 10 Августа 2017 г. 12:53 + в цитатник


Средние значения нагрузки (Load averages) — это критически важная для индустрии метрика. Многие компании тратят миллионы долларов, автоматически масштабируя облачные инстансы на основании этой и ряда других метрик. Но на Linux она окутана некой тайной. Отслеживание средней нагрузки на Linux — это задача, работающая в непрерываемом состоянии сна (uninterruptible sleep state). Почему? Я никогда не встречал объяснений. В этой статье я хочу разгадать эту тайну, и создать референс по средним значениям нагрузки для всех, кто пытается их интерпретировать.


Средние значения нагрузки в Linux — это «средние значения нагрузки системы», показывающие потребность в исполняемых потоках (задачах) в виде усреднённого количества исполняемых и ожидающих потоков. Это мера нагрузки, которая может превышать обрабатываемую системой в данный момент. Большинство инструментов показывает три средних значения: для 1, 5 и 15 минут:


$ uptime
 16:48:24 up  4:11,  1 user,  load average: 25.25, 23.40, 23.46

top - 16:48:42 up  4:12,  1 user,  load average: 25.25, 23.14, 23.37

$ cat /proc/loadavg 
25.72 23.19 23.35 42/3411 43603

Некоторые интерпретации:


  • Если значения равны 0.0, то система в состоянии простоя.
  • Если среднее значение для 1 минуты выше, чем для 5 или 15, то нагрузка растёт.
  • Если среднее значение для 1 минуты ниже, чем для 5 или 15, то нагрузка снижается.
  • Если значения нагрузки выше, чем количество процессоров, то у вас могут быть проблемы с производительностью (в зависимости от ситуации).

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


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


История


Изначально средние значения нагрузки показывают только потребность в ресурсах процессора: количество выполняемых и ожидающих выполнения процессов. В RFC 546 есть хорошее описание под названием "TENEX Load Averages", август 1973:


[1] Средняя нагрузка TENEX — это мера потребности в ресурсах CPU. Это среднее количество исполняемых процессов в течение определённого времени. Например, если часовая средняя нагрузка равна 10, то это означает (для однопроцессорной системы), что в любой момент времени в течение этого часа 1 процесс выполняется, а 9 готовы к выполнению (то есть не блокированы для ввода/вывода) и ждут, когда процессор освободится.

Версия на ietf.org ведёт на PDF-скан графика, нарисованного вручную в июле 1973, демонстрирующего, что эта метрика используется десятилетиями:


image
source: https://tools.ietf.org/html/rfc546


Сегодня можно найти в сети исходный код старых операционных систем. Вот фрагмент из TENEX (начало 1970's) SCHED.MAC, на макроассемблере DEC:


NRJAVS==3               ;NUMBER OF LOAD AVERAGES WE MAINTAIN
GS RJAV,NRJAVS          ;EXPONENTIAL AVERAGES OF NUMBER OF ACTIVE PROCESSES
[...]
;UPDATE RUNNABLE JOB AVERAGES

DORJAV: MOVEI 2,^D5000
        MOVEM 2,RJATIM          ;SET TIME OF NEXT UPDATE
        MOVE 4,RJTSUM           ;CURRENT INTEGRAL OF NBPROC+NGPROC
        SUBM 4,RJAVS1           ;DIFFERENCE FROM LAST UPDATE
        EXCH 4,RJAVS1
        FSC 4,233               ;FLOAT IT
        FDVR 4,[5000.0]         ;AVERAGE OVER LAST 5000 MS
[...]
;TABLE OF EXP(-T/C) FOR T = 5 SEC.

EXPFF:  EXP 0.920043902 ;C = 1 MIN
        EXP 0.983471344 ;C = 5 MIN
        EXP 0.994459811 ;C = 15 MIN

А вот фрагмент из современной Linux (include/linux/sched/loadavg.h):


#define EXP_1           1884            /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5           2014            /* 1/exp(5sec/5min) */
#define EXP_15          2037            /* 1/exp(5sec/15min) */

В Linux тоже жёстко прописаны константы на 1, 5 и 15 минут.


Аналогичные метрики были и в более старых системах, включая Multics, которая содержала экспоненциальное среднее значение очереди планируемых заданий (exponential scheduling queue average).


Три числа


Три числа — это средние значения нагрузки для 1, 5 и 15 минут. Вот только они на самом деле не средние, и не для 1, 5 и 15 минут. Как видно из вышеприведённого кода, 1, 5 и 15 — это константы, используемые в уравнении, которое вычисляет экспоненциально затухающие изменяющиеся суммы пятисекундного среднего значения (exponentially-damped moving sums of a five second average). Так что средние нагрузки для 1, 5 и 15 минут отражают нагрузку вовсе не для указанных временных промежутков.


Если взять простаивающую систему, а затем подать в неё однопоточную нагрузку, привязанную к процессору (один поток в цикле), то каким будет одноминутное среднее значение нагрузки спустя 60 секунд? Если бы это было просто среднее, то мы получили бы 1,0. Вот график эксперимента:


image
Визуализация эксперимента по экспоненциальному затуханию среднего значения нагрузки.


Так называемое «одноминутное среднее значение» достигает примерно 0,62 на отметке в одну минуту. Доктор Нил Гюнтер подробнее описал этот и другие эксперименты в статье How It Works, также есть немало связанных с Linux комментариев на loadavg.c.


Непрерываемые задачи Linux


Когда в Linux впервые появились средние значения нагрузки, они отражали только потребность в ресурсах процессора, как и в других ОС. Но позднее они претерпели изменения, в них включили не только выполняемые задачи, но и те, что находятся в непрерываемом состоянии (TASK_UNINTERRUPTIBLE или nr_uninterruptible). Это состояние используется ветвями кода, которые хотят избежать прерывания по сигналам, в том числе задачами, блокированными дисковым вводом/выводом, и некоторыми блокировками. Вы могли уже сталкиваться с этим состоянием: оно отображается как состояние "D" в выходных данных ps и top. На странице ps(1) его называют «uninterruptible sleep (usually IO)».


Внедрение непрерываемого состояния означает, что в Linux средние значения нагрузок могут увеличиваться из-за дисковой (или NFS) нагрузки ввода/вывода, а не только ресурсов процессора. Всех, кто знаком с другими ОС и их средними нагрузками на процессор, включение этого состояния поначалу сильно смущает.


Зачем? Зачем это было сделано в Linux?


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


В поисках древнего патча для Linux


Легко понять, почему в Linux что-то меняется: просматриваешь историю git-коммитов для нужного файла и читаешь описания изменений. Я просмотрел историю на loadavg.c, но изменение, добавляющее неизменяемое состояние, датировано более ранним числом, чем файл, содержащий код из более раннего файла. Я проверил другой файл, но это ничего не дало: код «скакал» по разным файлам. Надеясь на удачу, я задампил git log -p по всему Github-репозиторию Linux, содержащему 4 Гб текста, и начал читать с конца, отыскивая место, где впервые появился этот код. Это мне тоже не помогло. Самое старое изменение в репозитории датировано 2005-м, когда Линус импортировал Linux 2.6.12-rc2, а искомое изменение было внесено ещё раньше.


Есть старинные репозитории Linux (1 и 2), но и в них отсутствует описание этого изменения. Стараясь найти хотя бы дату его внедрения, я изучил архив на kernel.org и обнаружил, что оно было в 0.99.15, а в 0.99.13 ещё не было. Однако версия 0.99.14 отсутствовала. Мне удалось её отыскать и подтвердить, что искомое изменение появилось в Linux 0.99.14, в ноябре 1993. Я надеялся, что мне поможет описание этого релиза, но и здесь я не нашёл объяснения:


«Изменения в последнем официальном релизе (p13) слишком многочисленны, чтобы их перечислять (или даже вспомнить)...» — Линус

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


По дате мне удалось найти архивы почтовой рассылки kernel и конкретный патч, но более старое письмо было датировано аж июнем 1995:


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

Я начал ощущать себя проклятым. К счастью мне удалось обнаружить старые архивы почтовой рассылки linux-devel, вытащенные из серверного бэкапа, зачастую хранящиеся как архивы дайджестов. Я просмотрел более 6000 дайджестов, содержащих свыше 98 000 писем, из которых 30 000 относились к 1993 году. Но ничего не нашёл. Казалось, исходное описание патча потеряно навеки, и ответа на вопрос «зачем» мы уже не получим.


Происхождение непрерываемости


Но вдруг на сайте oldlinux.org в архивированном файле почтового ящика за 1993 я нашёл это:


From: Matthias Urlichs <urlichs@smurf.sub.org>
Subject: Load average broken ?
Date: Fri, 29 Oct 1993 11:37:23 +0200

Ядро считает только "исполняемые" процессы при вычислении среднего значения нагрузки. Мне это не нравится. Проблема в том, что процессы, которые подкачиваются или ожидают в "быстром", то есть непрерываемом, вводе/выводе, тоже потребляют ресурсы.

Это нелогично, что средняя нагрузка снижается, когда вы заменяете диск с быстрой подкачкой на диск с медленной подкачкой…

В любом случае, следующий патч сделает среднее значение нагрузки более соответствующим субъективной скорости системы. И что ещё важнее, нагрузка всё ещё будет равна нулю, когда никто ничего не делает. ;-)

--- kernel/sched.c.orig Fri Oct 29 10:31:11 1993
+++ kernel/sched.c  Fri Oct 29 10:32:51 1993
@@ -414,7 +414,9 @@
    unsigned long nr = 0;

    for(p = &LAST_TASK; p > &FIRST_TASK; --p)
-       if (*p && (*p)->state == TASK_RUNNING)
+       if (*p && ((*p)->state == TASK_RUNNING) ||
+                  (*p)->state == TASK_UNINTERRUPTIBLE) ||
+                  (*p)->state == TASK_SWAPPING))
            nr += FIXED_1;
    return nr;
 }
--
Matthias Urlichs        \ XLink-POP N|rnberg   | EMail: urlichs@smurf.sub.org
Schleiermacherstra_e 12  \  Unix+Linux+Mac     | Phone: ...please use email.
90491 N|rnberg (Germany)  \   Consulting+Networking+Programming+etc'ing 42

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


Упомянутый пример с диском с более медленной подкачкой не лишён смысла: снижая производительность системы, потребность в ресурсах (исполняемые и ждущие очереди процессы) должна расти. Однако средние значения нагрузки снижались, потому что они учитывали только состояния выполнения процессора (CPU running states), но не состояния подкачки (swapping states). Маттиас вполне справедливо считал это нелогичным, и потому исправил.


Непрерываемость сегодня


Но разве средние значения нагрузки в Linux иногда не поднимаются слишком высоко, что уже нельзя объяснить дисковым вводом/выводом? Да, это так, хотя я предполагаю, что это следствие новой ветви кода, использующей TASK_UNINTERRUPTIBLE, не существовавшего в 1993-м. В Linux 0.99.14 было 13 ветвей кода, которые напрямую использовали TASK_UNINTERRUPTIBLE или TASK_SWAPPING (состояние подкачки позднее убрали из Linux). Сегодня в Linux 4.12 почти 400 ветвей, использующих TASK_UNINTERRUPTIBLE, включая некоторые примитивы блокировки. Вероятно, что одна из этих ветвей не должна учитываться в среднем значении нагрузки. Я проверю, так ли это, когда снова увижу, что значение слишком высокое, и посмотрю, можно ли это исправить.


Я написал Маттиасу и спросил, что он думает 24 года спустя о своём изменении среднего значения нагрузки. Он ответил через час:


«Суть «средней нагрузки» — предоставить численную оценку занятости системы с точки зрения человека. TASK_UNINTERRUPTIBLE означает (означало?), что процесс ожидает чего-то вроде чтения с диска, что влияет на нагрузку системы. Система, сильно зависящая от диска, может быть очень тормозной, но при этом среднее значение TASK_RUNNING будет в районе 0,1, что совершенно бесполезно».

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


Но сегодня TASK_UNINTERRUPTIBLE соответствует большему количеству вещей. Нужно ли нам менять средние значения нагрузки, чтобы они отражали потребности в ресурсах только процессора и диска? Peter Zijstra уже прислал мне хорошую идею: учитывать в средней нагрузке task_struct->in_iowait вместо TASK_UNINTERRUPTIBLE, потому что это точнее соответствует вводу/выводу диска. Однако это поднимает другой вопрос: чего мы хотим на самом деле? Хотим ли мы измерять потребности в системных ресурсах в виде потоков выполнения, или нам нужны физические ресурсы? Если первое, то нужно учитывать непрерываемые блокировки, потому что эти потоки потребляют ресурсы системы. Они не находятся в состоянии простоя. Так что среднее значение нагрузки в Linux, вероятно, уже работает как нужно.


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


Измерение непрерываемых задач


Вот внепроцессорный (off-CPU) флейм-график с production-сервера, охватывающий 60 секунд и показывающий только стеки ядра, на котором я оставил только состояние TASK_UNINTERRUPTIBLE (SVG).


График отражает много примеров непрерываемых ветвей кода:


image


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


Я сгенерировал график с помощью своего инструмента offcputime из bcc (для работы ему нужны eBPF-возможности Linux 4.8+), а также приложения для создания флейм-графиков:


# ./bcc/tools/offcputime.py -K --state 2 -f 60 > out.stacks
# awk '{ print $1, $2 / 1000 }' out.stacks | ./FlameGraph/flamegraph.pl --color=io --countname=ms > out.offcpu.svgb>

Для изменения выходных данных с микросекунда на миллисекунды я использую awk. Offcputime "--state 2" соответствует TASK_UNINTERRUPTIBLE (см. sched.h), это опция, которую я добавил ради этой статьи. Впервые это сделал Джозеф Бачик с его инструментом kernelscope, который тоже использует bcc и флейм-графики. В своих примерах я показываю лишь стеки ядра, но offcputime.py поддерживает и пользовательские стеки.


Что касается вышеприведённого графика: он отображает только 926 мс из 60 секунд, проведённые в состоянии непрерываемого сна. Это добавляет к нашим средним значениям нагрузки всего 0,015. Это время, потраченное некоторыми cgroup-ветвями, но на этом сервере не выполняется много дисковых операций ввода/вывода.


А вот более интересный график, охватывающий только 10 секунд (SVG):


image


Более широкая башня справа относится к блокируемому systemd-journal в proc_pid_cmdline_read() (чтение /proc/PID/cmdline), что добавляет к среднему значению нагрузки 0,07. Слева более широкая башня page fault, тоже заканчивающаяся на rwsem_down_read_failed() (добавляет к средней нагрузке 0,23). Я окрасил эти функции пурпурным цветом с помощью поисковой фичи в моём инструменте. Вот фрагмент кода из rwsem_down_read_failed():


    /* wait to be given the lock */
    while (true) {
        set_task_state(tsk, TASK_UNINTERRUPTIBLE);
        if (!waiter.task)
            break;
        schedule();
    }

Это код получения блокировки, использующий TASK_UNINTERRUPTIBLE. В Linux есть прерываемые и непрерываемые версии функций получения мьютексов (mutex acquire functions) (например, mutex_lock() и mutex_lock_interruptible(), down() и down_interruptible() для семафоров). Прерываемые версии позволяют прерывать задачи по сигналу, а затем будить для продолжения обработки прежде, чем будет получена блокировка. Время, потраченное на сон в непрерываемой блокировке, обычно мало добавляет к среднему значению нагрузки, и в данном случае прибавка достигает 0,3. Если бы было гораздо больше, то стоило бы выяснить, можно ли уменьшить конфликты при блокировках (например, я начинаю копаться в systemd-journal и proc_pid_cmdline_read()!), чтобы улучшить производительность и снизить среднее значение нагрузки.


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


Анализируем средние значения нагрузки в Linux


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


terma$ pidstat -p `pgrep -x tar` 60
Linux 4.9.0-rc5-virtual (bgregg-xenial-bpf-i-0b7296777a2585be1)     08/01/2017  _x86_64_    (8 CPU)

10:15:51 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
10:16:51 PM     0     18468    2.85   29.77    0.00   32.62     3  tar

termb$ iostat -x 60
[...]
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.54    0.00    4.03    8.24    0.09   87.10

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvdap1            0.00     0.05   30.83    0.18   638.33     0.93    41.22     0.06    1.84    1.83    3.64   0.39   1.21
xvdb            958.18  1333.83 2045.30  499.38 60965.27 63721.67    98.00     3.97    1.56    0.31    6.67   0.24  60.47
xvdc            957.63  1333.78 2054.55  499.38 61018.87 63722.13    97.69     4.21    1.65    0.33    7.08   0.24  61.65
md0               0.00     0.00 4383.73 1991.63 121984.13 127443.80    78.25     0.00    0.00    0.00    0.00   0.00   0.00

termc$ uptime
 22:15:50 up 154 days, 23:20,  5 users,  load average: 1.25, 1.19, 1.05
[...]
termc$ uptime
 22:17:14 up 154 days, 23:21,  5 users,  load average: 1.19, 1.17, 1.06

Я также построил внепроцессорный флейм-график исключительно для непрерываемого состояния (SVG):


image


Средняя нагрузка в последнюю минуту составила 1,19. Давайте разложим на составляющие:


  • 0,33 — процессорное время tar (pidstat)
  • 0,67 — непрерываемые чтения с диска, предположительно (на графике 0,69, полагаю, что для него сбор данных начался чуть позже и охватывает немного другой временной диапазон)
  • 0,04 — прочие потребители процессора (пользователь mpstat + система, минус потребление процессора tar'ом из pidstat)
  • 0,11 — непрерываемый дисковый ввод/вывод воркеров ядра, сбросы на диск (на графике две башни слева)

В сумме получается 1,15. Не хватает ещё 0,04. Частично сюда могут входить округления и ошибки измерения сдвигов интервала, но по в основном это может быть из-за того, что средняя нагрузка представляет собой экспоненциально затухающую изменяющуюся сумму, в то время как другие используемые метрики (pidstat, iostat) являются обычными средними. До 1,19 одноминутная средняя нагрузка равнялась 1,25, значит что-то из перечисленного всё ещё тянет метрику вверх. Насколько? Согласно моим ранним графикам, на одноминутной отметке 62 % метрики приходилось на текущую минуту, а остальное — на предыдущую. Так что 0,62 x 1,15 + 0,38 x 1,25 = 1,18. Достаточно близко к полученному 1,19.


В этой системе работу выполняет один поток (tar), плюс ещё немного времени тратится потоками воркеров ядра, так что отчёт Linux о средней нагрузке на уровне 1,19 выглядит обоснованно. Если бы я измерял «среднюю нагрузку на процессор», то мне показали бы только 0,37 (расчётное значение из mpstat), что корректно только для процессорных ресурсов, но не учитывает тот факт, что нужно обрабатывать более одного потока.


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


Смысл средних значений нагрузки в Linux


Я вырос на операционных системах, в которых средние значения нагрузок относились только к процессору, так что Linux-вариант всегда меня напрягал. Возможно, настоящая проблема заключается в том, что термин «средняя нагрузка» так же неоднозначен, как «ввод-вывод». Какой именно ввод/вывод? Диска? Файловой системы? Сети?.. Аналогично, средние нагрузки чего? Процессора? Системы? Эти уточнения помогли мне понять:


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

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


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


Что такое «хорошие» или «плохие» средние нагрузки?


image


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


Применительно к средней нагрузке на процессор кто-то может делить значения на количество процессоров и затем утверждать, что если соотношение больше 1,0, то могут возникнуть проблемы с производительностью. Это довольно неоднозначно, поскольку долгосрочное среднее значение (как минимум одноминутное) может скрывать в себе разные вариации. Одна система с соотношением 1,5 может прекрасно работать, а другая с тем же соотношением в течение минуты может работать быстро, но в целом производительность у неё низкая.


Однажды я администрировал двухпроцессорный почтовый сервер, который в течение дня работал со средней процессорной нагрузкой в диапазоне от 11 до 16 (соотношение между 5,5 и 8). Задержка была приемлемой, никто не жаловался. Но это экстремальный пример: большинство систем будут проседать при нагрузке/соотношении в районе 2.


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


Более подходящие метрики


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


  • использование каждого процессора (per-CPU utilization): например, используя mpstat -P ALL 1.
  • использование процессора для каждого процесса (per-process CPU utilization): например, top, pidstat 1 и так далее.
  • задержка очереди выполнения (диспетчера) для каждого потока (per-thread run queue (scheduler) latency): например, в /proc/PID/schedstats, delaystats, perf sched
  • задержка очереди выполнения процессора (CPU run queue latency): например, в /proc/schedstat, perf sched, моём инструменте runqlat bcc.
  • длина очереди выполнения процессора (CPU run queue length): например, используя vmstat 1 и колонку 'r', или мой инструмент runqlen bcc.

Первые две — метрики использования, последние три — метрики насыщения (saturation metrics). Метрики использования полезны для оценки рабочей нагрузки, а метрик насыщения — для идентификации проблем с производительностью. Лучшая метрика насыщения для процессора — измерение задержки очереди выполнения (или диспетчера): это время, проведённое задачей/потоком в состоянии готовности к выполнению, но вынужденным ждать своей очереди. Это позволяет вычислить тяжесть проблем с производительностью. Например, какая часть времени тратится потоком на задержки диспетчера. А измерение длины очереди позволяет предположить лишь наличие проблемы, а её серьёзность оценить сложнее.


В Linux 4.6 функция schedstats (sysctl kernel.sched_schedstats) стала настраиваться ядром, и по умолчанию выключена. Подсчёт задержек (delay accounting) отражает ту же метрику задержки диспетчера из cpustat, и я предложил добавить её также в htop, чтобы людям было проще ею пользоваться. Проще, чем, к примеру, собирать метрику длительности ожидания (задержка диспетчера) из недокументированных выходных данных /proc/sched_debug:


$ awk 'NF > 7 { if ($1 == "task") { if (h == 0) { print; h=1 } } else { print } }' /proc/sched_debug
            task   PID         tree-key  switches  prio     wait-time             sum-exec        sum-sleep
         systemd     1      5028.684564    306666   120        43.133899     48840.448980   2106893.162610 0 0 /init.scope
     ksoftirqd/0     3 99071232057.573051   1109494   120         5.682347     21846.967164   2096704.183312 0 0 /
    kworker/0:0H     5 99062732253.878471         9   100         0.014976         0.037737         0.000000 0 0 /
     migration/0     9         0.000000   1995690     0         0.000000     25020.580993         0.000000 0 0 /
   lru-add-drain    10        28.548203         2   100         0.000000         0.002620         0.000000 0 0 /
      watchdog/0    11         0.000000   3368570     0         0.000000     23989.957382         0.000000 0 0 /
         cpuhp/0    12      1216.569504         6   120         0.000000         0.010958         0.000000 0 0 /
          xenbus    58  72026342.961752       343   120         0.000000         1.471102         0.000000 0 0 /
      khungtaskd    59 99071124375.968195    111514   120         0.048912      5708.875023   2054143.190593 0 0 /
[...]
         dockerd 16014    247832.821522   2020884   120        95.016057    131987.990617   2298828.078531 0 0 /system.slice/docker.service
         dockerd 16015    106611.777737   2961407   120         0.000000    160704.014444         0.000000 0 0 /system.slice/docker.service
         dockerd 16024       101.600644        16   120         0.000000         0.915798         0.000000 0 0 /system.slice/
[...]

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


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


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


Заключение


В 1993 году Linux-инженер обнаружил нелогичную работу средних значений нагрузки, и с помощью трёхстрочного патча навсегда изменил их с «со средних нагрузок на процессор» на «средние нагрузки на систему». С тех пор учитываются задачи в непрерываемом состоянии, так что средние нагрузки отражают потребность не только в процессорных, но и в дисковых ресурсах. Обновлённые метрики подсчитывают количество работающих и ожидающих работы процессов (ожидающих освобождения процессора, дисков и снятия непрерываемых блокировок). Они выводятся в виде трёх экспоненциально затухающих изменяющихся сумм, в уравнениях которых используются константы в 1, 5 и 15 минут. Эти три значения позволяют видеть динамику нагрузки, а самое большое из них может использоваться для относительного сравнения с ними самими.


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


Я откопал патч, с которым было внесено это изменение в Linux в 1993-м — его было на удивление трудно найти, — содержащий исходное объяснение его автора. Также с помощью bcc/eBPF я замерил на современной Linux-системе трейсы стеков и длительность нахождения в непрерываемом состоянии, и отобразил это на внепроцессорном флем-графике. На нём отражено много примеров состояний непрерываемого сна, такой график можно генерировать, когда нужно объяснить необычно высокие средние значения нагрузки. Также я предложил вместо них использовать другие метрики, позволяющие глубже понять работу системы.


В заключение процитирую комментарий из топа kernel/sched/loadavg.c исходного кода Linux:


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

Ссылки


  • Saltzer, J., and J. Gintell. “The Instrumentation of Multics,” CACM, August 1970 (объясняет экспоненциальные значения).
  • Ссылка на команду system_performance_graph в Multics (использует одноминутное среднеее).
  • Исходный код TENEX (среднее значение нагрузки в SCHED.MAC).
  • RFC 546 "TENEX Load Averages for July 1973" (объясняет измерение потребности в ресурсах процессора).
  • Bobrow, D., et al. “TENEX: A Paged Time Sharing System for the PDP-10,” Communications of the ACM, March 1972 (объясняет три метрики средней нагрузки).
  • Gunther, N. "UNIX Load Average Part 1: How It Works" PDF (объясняет экспоненциальные вычисления).
  • Письмо Линуса по поводу Linux 0.99 patchlevel 14.
  • Письмо об изменении в среднем значении нагрузки на oldlinux.org (в alan-old-funet-lists/kernel.1993.gz, а не в linux-директориях, где я сначала искал).
  • Исходны код Linux kernel/sched.c до и после внесения изменения: 0.99.13, 0.99.14.
  • Архивы релизов Linux 0.99 на kernel.org.
  • Текущий код среднего значения нагрузки в Linux: loadavg.c, loadavg.h
  • Аналитические инструменты bcc, включая мой offcputime, использованный для трейсинга TASK_UNINTERRUPTIBLE.
  • Флейм-графики, использованные для визуализации непрерываемых ветвей.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335326/


Метки:  

[Из песочницы] Учимся программировать под Андроид

Четверг, 10 Августа 2017 г. 12:53 + в цитатник
Привет Хабр! Предлагаю вашему вниманию свободный перевод статьи «How To Learn Android Development» от Amit Shekhar.

image

Как изучить разработку приложений под Андроид?

Я видел много вопросов о том, как начать изучать программирование под Андроид и стать успешным разработчиком. Здесь я попытался охватить большинство важных аспектов в Android Development.

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

Итак, как разработать приложение под Андроид?

Ниже представлены темы, которые, по моему мнению, являются самыми важными для разработки приложений под Андроид:


Хорошего кода :-)
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335332/


Метки:  

С чего начать молодым разработчикам мобильных игр из России в текущих реалиях [Часть 2]

Четверг, 10 Августа 2017 г. 12:28 + в цитатник

Метки:  

Система мониторинга PERFEXPERT — решение проблем производительности СУБД

Четверг, 10 Августа 2017 г. 11:09 + в цитатник
Специализированный программный комплекс «PERFEXPERT» – самостоятельный программный продукт, позволяющий без вмешательства в работу баз данных и обслуживающих их программ в режиме реального времени собирать, протоколировать и визуально отображать сведения о нагрузке на систему баз данных MS SQL, оценивать эффективность их работы и выявлять причины низкой производительности.
В начале лета разработчик этого программного продукта компания SOFTPOINT и производитель серверного оборудования компания STSS запустили акцию: при покупке любого сервера или СХД
клиент получает Сертификат на бесплатное тестирование ПО диагностики СУБД PERFEXPERT сроком на 3 месяца. Акция продлится до конца лета.
Учитывая положительный результат акции, мы решили расширить круг её охвата. С сегодняшнего дня, в течение 3 месяцев, любой читатель этой статьи получает 2 недели тестирования PERFEXPERT в своей инфраструктуре СУБД.

Описание функционала


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

Общие сведения и принцип работы


Система мониторинга производительности и анализа баз данных PERFEXPERT позволяет с высокой степенью детализации получить полное представление обо всем, что сказывается на эффективности работы сервера SQL (в том числе серверов в группе доступности AlwaysOn и отказоустойчивых кластерах), серверов репликации, терминальных серверов и серверов приложений 1С.
Система имеет простое подключение к любым базам данных под управлением MS SQL Server начиная с версии 2005 и полностью интегрируется с большинством популярных информационных систем такими как: 1С: Предприятие, Microsoft DynamicsAX и DocsVision.
Большим достоинством PERFEXPERT является возможность одновременной работы с несколькими базами данных как в режиме on-line, так и последующей работы с архивными данными, накопленными за предыдущие периоды. При этом используется единая консоль управления и анализа для данных со всех серверов (узлов).
Кроме того, мониторинг PERFEXPERT позволяет анализировать статистику по всем собираемым источникам данных с максимальной детализацией, что делает возможным определять с высокой точностью проблемные модули, неоптимальные SQL-запросы, а также идентифицировать причины замедления работы серверов, как в плане настроек операционных систем, так и в плане настроек сервера MS SQL.
Возможность создания в PERFEXPERT гибких отчётов в любых разрезах работы информационной системы, позволяет анализировать множество факторов и впоследствии принимать верные и оптимальные управленческие решения для исключения проблем производительности.

Используя собственные разработки ООО «Кластерные технологии Софтпоинт», PERFEXPERT, ведя круглосуточный (24x7) активный мониторинг событий на всех серверах одновременно, позволяет задействовать не более 3% ресурсов операционной системы при контроле информационных систем в режиме реального времени.
Полученные в ходе мониторинга сведения могут быть использованы персоналом как для самостоятельного реагирования на критические ситуации, приводящие к остановке или потери части функциональности системы, так и в рамках проектов по повышению производительности, разрабатываемых SOFTPOINT.
Функционирование комплекса основано на сборе и последующем анализе факторов, влияющих на качественные характеристики серверов, таких как: время отклика, пропускная способность, загруженность процессоров (в том числе, в разрезе каждой сессии MS SQL, отдельных групп запросов, баз данных), объёмы операций ввода-вывода и т.д.



В системе PERFEXPERT ведётся сбор трасс, настроенных по различным шаблонам:
  • по длительным запросам SQL
  • по запросам SQL, потребляющим значительные ресурсы памяти и диска
  • по блокировкам и взаимоблокировкам

В первую очередь программный комплекс PERFEXPERT производит анализ факторов:
  • динамика нагрузки на сервер в разрезе сессий MS SQL, БД, групп SQL-запросов
  • причины блокировок и взаимоблокировок с детализацией по объектам блокировок
  • нагрузка на вычислительную подсистему серверов
  • загруженность сетевой подсистемы
  • динамическое разделение ресурсов между сервером MS SQL и ОС
  • узкие места клиентской части
  • качество обслуживания баз данных

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

Интерфейс


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



Информация, отображаемая в данном окне приложения, позволяет наблюдать и оперативно информировать администратора СУБД о возникшей проблеме в режиме on-line. При этом наблюдение и анализ можно производить с различным уровнем детализации.
Первичной информацией для пользователя программы служат, прежде всего, графики наблюдаемых процессов, отображение которые оператор может выбрать и сгруппировать в зависимости от конкретики решаемых задач. Дополнительные панели позволяют систематизировать и конкретизировать интересующие сведения.
На панели управления отражается информация о подключённом сервере. Данный элемент управления позволяет переключаться между наблюдаемыми серверами баз данных. При этом потушенная иконка показывает, что агент сбора данных отключён, либо не проявляет активности более 20 секунд. Иконка синего цвета – указывает об активности агента.
Выпадающий список «Онлайн наблюдение» даёт возможность выбрать интервал времени наблюдений, отображаемый на графиках, отсчитывая с момента поступления последних данных.
Фильтр по периоду и рабочему времени позволяет выбрать диапазон отображения графиков, что даёт возможность просматривать данные за прошедший период.
Для точного определения значений счётчиков на графиках в определённый момент времени используется линейка – прямая вертикальная линия, которая появляется при движении курсора мыши по окну графиков.
При пересечении линейки с каждым из графиков отображаются значения соответствующих графиков. На панелях «Сессии MS SQL» «Дополнительная информация» и «ТОП 10 процессов» отображаются измерения на момент времени, выбранный курсором мыши на графике.
Для фиксирования таблиц с измерениями на панелях «Сессии MS SQL», «Дополнительная информация» и «ТОП 10 процессов» необходимо сделать двойной щелчок мышью по изображению графика. При этом появится новая закладка для выбранного момента времени.



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



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



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

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

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

Описание каждого подменю программы

ПОДМЕНЮ «ФАЙЛ»


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



Опция «Открыть файл базы PerfExpert…» – выбор имеющегося в наличии записанного ранее файла с результатами наблюдения, имеющего расширение *.fdb или *.spdb.
Данная опция предназначена как для работы с архивными файлами PERFEXPERT, так и для ситуаций, когда нет возможности осуществить соединение с сервером посредством локальной сети. Например, файл базы данных получен из удалённого филиала по электронной почте.

Опция «Подключиться к удалённому Центру Сбора…» — создаёт подключение к серверу мониторинга. При её выборе возникнет окно, в котором необходимо указать сетевое имя компьютера или его IP-адрес, для установки удалённого подключения и, при удачном соединении, запросит имя пользователя, пароль доступа и порт по которому будет осуществляться обмен данными.





После удачного соединения опция поменяет название на «Отключиться от удалённого Центра Сбора…», выбрав которую пользователь возвращается к Центру сбора, расположенном на локальном компьютере.

Опция «Сделать BackUp…» позволяет сохранить собранные сведения наблюдаемой базы в файл (резервное копирование) и, при необходимости, добавить резервную копию в архив.
Система мониторинга создаёт новую базу каждый понедельник в час ночи, и в названии файла базы по умолчанию указываются: название домена и имени сервера, а также дата её создания (например, 2014-05-14-dbs.local_140512_234).
При выборе данной опции в открывшемся окне будет предложено выбрать вариант сохранения баз данных и откроются два поля:
  • «Архивируемый файл», т.е. файл базы, который будет заархивирован
  • «Файл резервной копии», т.е. сам файл BackUp — путь сохранения резервной копии



Если необходимо сделать резервную копию базы данных мониторинга PERFEXPERT за предыдущую или за текущую недели, то необходимо выбрать соответствующий пункт, и нажать кнопку «Упаковать». Через некоторое время файл резервной копии будет готов.
Если необходимо сделать копию базы за другой период, либо в случае истекшего срока действия лицензии, то необходимо действовать следующим образом:
  • Например, сегодня 07 августа 2017 г.
  • Для создания BackUp (резервной копии) базы за позапрошлую неделю необходимо в поле «Архивируемый файл» выбрать базу (это файл с расширением *.spbd) в названии которой указано %170724% т.е. 24 июля 2017 года, понедельник на позапрошлой неделе.
  • В поле «Файл резервной копии» указываем куда его сохранить. Нажимаем кнопку «Упаковать». Через некоторое время файл готов.
  • В результате выполнения процедур получается два файла с одинаковым названием, но разными расширениями — *.fbk и *.7z. Если в окне BackUp не включать опцию «Сжимать файл», то архивный файл с расширением *.7z создаваться не будет.

Опция «Восстановить BackUp…» обратная функция опции «Сделать BackUp…», которая позволяет восстановить из файла резервной копии собранные сведения наблюдаемой базы.
Восстановление происходит как из файла расширения *.7z, так и *.fbk. Распакованный файл будет иметь расширение *.spdb.

Опция «Задать каталог Базы Агента» позволяет установить локальный каталог, который будет использоваться агентами сбора данных для создания своих баз.



По умолчанию базы сбора находятся в папке, в которую была установлена система мониторинга, в поддиректории \data. Имя базы состоит из полного доменного имени наблюдаемого компьютера и имеет расширение *.fdb.

Опция «Выход» – завершение работы программы PERFEXPERT.

ПОДМЕНЮ «ПОДКЛЮЧЕНИЯ»


Подменю «Подключения» выводит список серверов MS SQL на которых установлены агенты сбора данных, подключённые к Центру сбора. Используется для переключения между несколькими подключёнными и работающими в режиме on-line серверами MS SQL, собирающими данные в едином Центре сбора.

ПОДМЕНЮ «ТРАССЫ»


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



Опция «Duration — запросы SQL длительностью более 5 сек.» — позволяет отобразить и проанализировать длительные SQL-запросы, являющиеся основным источником информации при исследовании повышенной нагрузки на вычислительную подсистему MS SQL сервера.
В результате в отдельном окне будут отражены списки длительных запросов, с возможностью просмотра текста выбранного запроса, а также получения статистических данных по группам запросов, создающих наибольшую суммарную нагрузку на сервер.





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

Опция «Reads — запросы SQL с количеством операций чтения более 50 000» — позволяет отобразить и проанализировать SQL-запросы, являющиеся основным источником информации при исследовании повышенной нагрузки на дисковый массив, проблем с кешем данных MS SQL сервера.

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

Опция «Locks — события блокировок» — отображает произошедшие за время наблюдения блокировки, на уровне SQL и в первую очередь позволяет определить их вид, продолжительность, статус и ресурс блокировки.

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

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



Если данное графическое описание задач и ресурсов, вовлечённых во взаимоблокировку скопировать и сохранить в файл с расширением *.xdl, то открыв его в Microsoft SQL Management Studio можно наглядно просмотреть взаимоблокировку в графическом представлении.



Опция «Transactions — фиксация и откат транзакций» позволяет отобразить и проанализировать длительность завершённых и отката незавершённых транзакций. Вид окна данной опции имеет структуру, отличающуюся от большинства опций подменю «Трассы»



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

Опция «LogOut — завершение сеансов ИС» — отображает зафиксированные за время наблюдения принудительно либо аварийно завершённые сеансы подключений к базе данных.

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

Опция «TextMask — отбор по подстройке в поле TextData» позволяет проанализировать все запросы, которые в тексте содержат подстроку из конфигуратора Агента сбора данных в поле Text mask.

Опция «Полная трасса» — позволяет ввести запись трассировки в режиме, при котором все запросы собираются без предварительной фильтрации. В настройках полной трассы можно задать такие ограничивающие факторы как максимальный размер файла трассы и максимальная длительность трассировки.
Включение полной трассировки оказывает значительную нагрузку на сервер SQL. Поэтому данную опцию целесообразно использовать, когда нужно определить запросы, не видимые в стандартных трассах: запросы менее 5 секунд (duration) либо запросы которые выполнили менее 50 тысяч логических чтений (reads).

ПОДМЕНЮ «НАСТРОЙКА»


В подменю «Настройка» пользователь имеет возможность настроить состав графиков, отображаемых в основном окне мониторинга, в том числе пользовательских SQLсчётчиков, а также пользовательские замеры (маркеры)

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

Опция «SQL — счётчики» позволяет создавать пользовательские SQL-счётчики, предназначенные для наблюдения за производительностью сервера MS SQL. При добавлении нового счётчика SQL, он через какое-то время автоматически появится в общем списке счётчиков, что будет означать, что сбор данного счётчика осуществляется корректно.

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

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

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



ПОДМЕНЮ «СТАТИСТИКА»


В подменю «Статистика» пользователь имеет возможность формировать статистические сведения по собранным данным, а также выводить их в виде отчётов.



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

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





Опция «Сессии MS SQL» вызывает окно расчёта статистики по сессиям MS SQL. Это же опция вызывается кнопкой «Статистика», расположенной над панелью «Сессии MS SQL» основного окна мониторинга.
Предоставляет возможность сгруппировать нагружающие процессы по следующим значениям:
  • База данных
  • Модуль
  • Пользователь
  • Форма
  • Программа
  • Компьютер
  • День
  • Текст запроса
  • Пользователь Windows
  • Ресурс блокировки
  • Тип ожидания
  • Процедура
  • Строка кода

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

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



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

При изменении набора видимых графиков при вызове нового окна статистики по графикам набор счётчиков автоматически изменяется и соответствует графикам отображаемым в основном окне мониторинга.

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

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





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

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

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

Сведения, отражённые во вкладке «Индексы» позволяют определить степень внешней фрагментации индексов таблицы, которая выбрана в средней части окна. Данная вкладка имеет 5 колонок:
  • Дата измерения, где представлены дата и время опроса информации
  • Название индекса, где раскрываются имена индексов, используемых в выбранной таблице
  • ScanDensity показывает уровень фрагментации. При значении равном 100 фрагментация отсутствует
  • LogicalFragmentation показывает процент страниц не в логическом порядке. Если страницы находятся в строгой последовательности слева направо, то данный параметр будет иметь значение равное 0
  • ExtentFragmentation отображает процент экстентов не в логическом порядке. Если экстенты последовательны, то данный параметр будет иметь значение равное 0

Опция «Планы выполнения запросов» вызывает окно, в котором в табличной форме отображаются сведения по планам выполнения наиболее тяжёлых SQL-запросов, а также предоставляет возможность просмотреть этот план в графическом виде в Microsoft SQL Management Studio.
Зачастую в работе возникает ситуация, когда запрос в ИС по каким-то причинам работает медленно, но анализ текста запроса не выявляет какие-либо проблемы.
В таком случае приходится изучать эту проблему на более низком уровне. Для этого нужно проанализировать план выполнения запроса, который использовал SQL-сервер при его обработке.
Это бывает необходимо, чтобы понять оптимальность логики запроса, а также сделать достоверные выводы по поводу его оптимизации, в том числе при индексном тюнинге.
В верхней части окна имеется возможность фильтрации отображаемых сведений по временному периоду, а также варианты отображения текста: выбранного запроса либо плана в нижней части окна.
Нажатие кнопки «Открыть план в MS Studio» позволяет просмотреть план выполнения в графическом виде в Microsoft SQL Management Studio.

Опция «Процедуры ИС» вызывает окно в котором отображаются сведения о длительности выполнения процедур информационной системы. Статистическая информация поступает с клиентских компьютеров, в on-line режиме, и показывает реальное время выполнения пользовательских операций.

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

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

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

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

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

ПОДМЕНЮ «ЛОГИ»


В процессе работы программного комплекса PERFEXPERT логируются все происходящие события работы агентов сбора данных и сервисов интеграции. В PERFEXPERT имеется возможность централизованного просмотра собранных логов от различных сервисов мониторинга. Данная возможность позволяет администратору оперативно реагировать на возникающие проблемы, в работе сервисов мониторинга.
В подменю «Логи» пользователь имеет возможность просмотреть не только логи сервисов мониторинга, но и журнал системных событий Windows, серверов баз данных и серверов приложений.

Опция «Логи агента данных» вызывает окно, в котором имеется возможность просмотреть события, которые залогированы агентом сбора данных. При этом, в левой части окна выбирается один из источников данных в рамках которого велось логирование:
  • Менеджер (главный поток агента, отражающий запуск, остановку и контроль состояния рабочих потоков)
  • Счётчики (данные о счётчиках производительности)
  • Сессии MS SQL (информация о выполняющихся на сервере MS SQL процессах)
  • Трассы (контроллер по работе с трассами MS SQL)
  • Процедуры ИС (сведения о выполнении процедур встроенного языка программ ИС)
  • Процессы (данные о выполняющихся процессах в операционной системе)
  • Размеры таблиц (информация о размерах таблиц и индексов баз MS SQL)
  • Статистика линии (сведения о состоянии канала связи с сервером MS SQL)
  • Метаданные ИС (информация о метаданных конфигурации программного комплекса ИС)
  • Серверные процессы (информация о процессах, выполняющихся на наблюдаемом сервере)
  • Планы статистики (сведения о планах выполнения тяжёлых SQL-запросов)
  • Блокировки (информация о блокировках)

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

Опция «Журналы событий Windows» вызывает окно, в котором имеется возможность просмотреть зарегистрированные ошибки из журнала событий операционной системы, произошедшие во время работы программы мониторинга.
В нижней части окна имеется возможность просмотра полного текста события на вкладке «Информация» и статистические сведения по различным показателям (пользователю, источнику, дате события) на вкладке «Статистика».

Опция «Журнал событий SQL-сервера» вызывает окно, в котором имеется возможность просмотреть зарегистрированные ошибки из самого SQL-сервера, произошедшие во время работы программы мониторинга.

ПОДМЕНЮ «ВИД»


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

Опция «Сессии MS SQL» вызывает одноимённую панель в правой части основного окна мониторинга и позволяет просматривать данные в табличном виде на момент времени, выбранный курсором мыши на графике.
Таблица «Сессии MS SQL» отображает значения, выбранные на линейке со значениями счётчиков (фиксированные и текущее) основными показателями из которых являются:
  • Активные пользователи в рассматриваемый момент времени. При этом имена пользователей отображаются только в случае выполнения операций, длящихся не менее 5 секунд, в остальных случаях они представлены в виде SPID
  • Создаваемую пользователями нагрузку на центральное процессорное устройство
  • Кто из пользователей создаёт блокировки и кто из них заблокирован
  • Каков тип блокировки и какие объекты заблокированы

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

Опция «ТОП 10 процессов» вызывает одноимённую панель в правой части основного окна мониторинга и отображающую информацию по 10 процессам Windows наиболее сильно нагружающим процессор.
В данной панели отображается информация по процессам, запущенных на серверах баз данных, серверах приложений и других серверах, на которых установлены и запущены агенты сбора (вкладки имеют название сервера).
Таблица «ТОП 10 процессов» отображает следующие значения, выбранные на линейке со значениями счётчиков (фиксированные и текущее):
  • Нагрузку процесса на центральное процессорное устройство (CPU)
  • Использование процессом оперативной памяти компьютера
  • Использование процессом виртуальной памяти компьютера
  • Пользователь запустивший процесс
  • Идентификатор процесса (PID)
  • Командную строку процесса

Кнопка «Статистика» в правой части позволяет увидеть нагрузку ЦПУ всех процессов, запущенных на сервере. Данная ссылка эквивалентна вызову окна «Доля программ в нагрузке» из подменю «Статистика».

Опция «Дополнительная информация» вызывает одноимённую панель в правой части основного окна мониторинга, отображающую информацию в 4 вкладках:
  • Управляемые блокировки
  • Рабочие процессы 1С
  • Маркеры
  • Активные sql – job

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

Опция «Выбор графиков» вызывает одноимённую панель в нижней части основного окна мониторинга под отображаемыми графиками. В данной панели имеется возможность самостоятельно включать или выключать графики в основном окне мониторинга.
Щелчок правой кнопки мыши в области выбора графиков либо на самих графиках, приводит к появлению контекстного меню:
  • Копировать – копирует изображение отображаемых в окне мониторинга графиков в буфер обмена
  • Экспорт списка счётчиков – сохраняет список активных графиков в файл с расширением *.xml
  • Импорт списка счётчиков – восстанавливает из ранее сохранённого файла с расширением *.xml список активных графиков, и в соответствии с ним отображает активные графики в основном окне мониторинга
  • Отметить все счётчики – отмечает все счётчики из представленного списка и отображает их в окне мониторинга
  • Снять отметку со всех счётчиков – снимает отметки и делает неактивными все счётчики из списка
  • Режим дерева – представляет вид выбора счётчиков, сгруппированных по общему признаку в виде древовидной структуры (вкл.) либо в виде списка (выкл.) (Рисунок 67). Кроме того, если выбрана древовидная структура, у пользователя появляется возможность самостоятельно изменять группировку счётчиков путём их переноса с помощью мыши, удерживая нажатой левую кнопку в процессе переноса (функция Drug-n-Drop)
  • Сброс иерархии дерева – появляется только во включенном режиме дерева приводя вид древовидной структуры по умолчанию, отменяя все пользовательские изменения отображения счётчиков (включения, выключения и перегруппировку)

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

Опция «Формы на панели задач» позволяет переключать режим видимости открытых форм и отчётов мониторинга на панели задач экрана OC Windows.
При включении этой опции все новые открытые формы будут на нижней панели задач экрана Windows как отдельные приложения. Если опция выключена – то на панели задач будет видно только одно окно (иконка).

ПОДМЕНЮ «ОКНА»


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




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

Подробные отчёты по блокировкам, взаимоблокировкам, управляемым блокировкам могут выгружаться как в HTML, при этом откроется браузер, установленный в системе по умолчанию, так и в формате MS Office если данный программный пакет установлен на том же компьютере, что и программа мониторинга PERFEXPERT.
Отчёт по объектам, нагружающим сервер и экспертная оценка значений счётчиков производительности представлены в графическом виде.

ОТЧЁТЫ ПО БЛОКИРОВКАМ И ВЗАИМОБЛОКИРОВКАМ


Аналитические отчёты по блокировкам отображают подробную статистическую информацию за выбранный период времени, согласно заданным условиям.
Составленные и сформированные в файл отчёты представляют собой табличные сведения в разрезе периодов, подключённых баз данных, компьютеров, пользователей как в целом, так и отдельно по выбранным дням. Для удобства анализа информации в конце каждого раздела имеется диаграмма, где в графическом виде отображаются сведения о времени ожидания на блокировке, а также дополнительно отмечены блокировки, которые завершились неудачно по таймауту.
Окна отчётов по блокировкам и взаимоблокировкам условно делятся на три части:
  • Выбор параметров и фильтров отображения сведений (верхняя часть)
  • Секция «База» (средняя часть) отображает таблицу со списком доступных для анализа баз данных и информацией по блокировкам для каждой базы. В нём выбираются базы, данные из которых будут участвовать в построении отчёта
  • Секция «Блокировки для выбранных баз» отображает таблицу с информацией по блокировкам для отмеченных баз по дням. Для формирования отчёта необходимо нажать на кнопку «Отчёт [HTML]» или «Отчёт [Word]»

ОТЧЁТ ПО ОБЪЕКТАМ, НАГРУЖАЮЩИМ СЕРВЕР


Данный отчёт детализирует и в графическом виде отображает распределение общей нагрузки сервера в разрезе конкретных объектов анализа.
В верхней части окна находятся настройки параметров отчёта – период (дата), время и объект анализа. С помощью выпадающего списка «Объект анализа» можно выбрать один из следующих типов объектов:
  • Пользователь ИС
  • Пользователь Windows
  • Имя компьютера
  • Приложение
  • Модуль ИС
  • Форма ИС

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

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

ЭКСПЕРТНАЯ ОЦЕНКА ЗНАЧЕНИЙ СЧЁТЧИКОВ ПРОИЗВОДИТЕЛЬНОСТИ


Данный отчёт обобщает собранные данные по счётчикам производительности и представляет их в наглядном графическом виде (помесячно в календарном виде) с использованием цветовой оценки распределения нагрузки по времени для одного из пяти выбранных параметров:
  • Процессор
  • Оперативная память
  • Дисковая подсистема
  • Блокировки
  • Внутренние показатели MS SQL

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



ОСНОВНЫЕ СТАТИСТИЧЕСКИЕ ДАННЫЕ


Данный вид отчёта позволяет сформировать и отобразить в типовом табличном виде отсортированные по степени загрузки системы наиболее распространённые ситуации.
После выбора периода и диапазона рабочих часов пользователь имеет возможность рассчитать и отобразить информацию по следующим группам данных:
  • Нагрузка на память/диск в разрезе пользователей информационной системы и по 20 наиболее нагружающим пользователям
  • Нагрузка на процессор в разрезе пользователей информационной системы и по 20 наиболее нагружающим пользователям
  • Нагрузка на память/диск в разрезе строк кода конфигурации информационной системы и по 20 наиболее нагружающим строкам
  • Статистика по времени проведения операций
  • Статистика по времени формирования стандартных отчётов
  • Статистика нагрузки на сервер в разрезе приложений
  • ТОП 20 строк конфигурации, имеющих наибольшую долю в суммарной нагрузке на центральное процессорное устройство
  • ТОП 20 запросов, имеющих наибольшую длительность
  • ТОП 20 запросов, создававших наибольшую нагрузку на процессор
  • ТОП 20 запросов, имеющих наибольшее количество логических чтений


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

ИСПОЛЬЗОВАНИЕ СТАТИСТИКИ И АНАЛИЗА ВЫБОРОК ДАННЫХ


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

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

Для определения узких мест сервера прежде всего необходимо визуально, используя линейки счётчиков (фиксированные и текущую) анализировать графики мониторинга с учётом фильтра. Если в основном окне мониторинга не показаны требуемые вам графики, нажмите кнопку «Выбор графиков» и настройте отображение графиков.
Указанные выше проблемные места сервера представлены следующими видами графиков, которые изучаются и анализируются в первую очередь:
  1. График Server: Нагрузка CPU. На этом графике отображается общая нагрузка на центральное процессорное устройство.
    Если долгое время (от 10 минут) нагрузка на CPU составляет 80-100% то скорее всего нужно начать анализировать сведения о процессах, его нагружающих.


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


  3. График Server: Свободная оперативная память (Мб). Потенциально узким местом может быть память, если долгое время свободной оперативной памяти менее 1 Гб
  4. График SQL (Name): Ожидаемый срок жизни страницы памяти. Потенциально узким местом может быть память, если долгое время ожидаемый срок жизни страницы памяти менее 300 с
  5. График SQL (Name): Блокировки, SQL (Name): Суммарное время блокировок…

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

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

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

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

АНАЛИЗ ТРАСС MS SQL


Определение проблемных мест в работе информационной базы путём анализа результатов трассировок и выявления возникших проблем в процессе выполнения запросов в большинстве случаев позволяет выявить конкретные причины снижения производительности.
К данному анализу целесообразно переходить после визуального исследования графиков в основном окне мониторинга. В зависимости от обнаруженных проблем, изучаются трассы Reads (если проблемы с очередями к дискам или памятью) или Duration (если проблемы с повышенной нагрузкой на процессор), окно отображения которых вызываются в подменю «Трассы» мониторинга одноимёнными опциями: «Duration» (время выполнения запросов), либо «Reads» (число чтений).
В окне анализа трасс задаётся фильтр по времени и диапазон рабочих часов, в зависимости от анализируемого участка. Нажатие кнопки «Применить фильтр» проведёт отбор данных в зависимости от настроек фильтра.

Группировка по модулю информационной системы и номеру строки во вкладке «Статистика», либо применение пользовательских фильтров в группе «Сгруппировать по полям» сформирует выборку, необходимую для анализа.
Отсортировав таблицу по столбцу «%доля CPU», либо «%доля чтения» определяются конструкции, внёсшие наибольший вклад в нагрузку центрального процессорного устройства или создающие наибольшее количество чтений.
Целесообразно рассматривать только первые 3 – 8 записей, доля которых не превышает 3 – 5%.
Двойное нажатие по выбранной записи, позволяет видеть и анализировать запросы в центральной части окна анализа трасс. Отсортировав по столбцам «Длительность», «Чтений» и «Процессорное время», имеется возможность выявить наиболее «тяжёлые» запросы.
При необходимости можно переключиться на вкладку Текст запроса для детального изучения запроса, предварительно выбрав его в центральной табличной части окна.

Для некоторых информационных систем (1С и т.п.) имеется возможность сопоставления SQL-запросов со специфичными именами внутренних объектов информационной системы, что дополняет стандартную SQL-информацию сведениями о модуле и строке кода конфигурации, которые могут быть использованы разработчиками ИС для их оптимизации.

ИСПОЛЬЗОВАНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ЗАМЕРОВ В АНАЛИЗЕ ПРОИЗВОДИТЕЛЬНОСТИ


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



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

Учитывая, что сведения о текущих данных пользовательских замеров соответствуют текущим временным характеристикам под основной линейкой графиков, пользователь имеет возможность сопоставить результаты замеров с остальными значениями графиков и определить причины замедления: нехватка оперативной памяти, очередь к дискам, повышенная нагрузка на центральное процессорное устройство и т.д. Фиксация значений линейки даёт возможность детального изучения полученных данных в соответствующих таблицах.
В представленном на рисунках 83 и 84 примере, пользовательский замер «ЛюбоеНазваниеМаркера» настроен на диапазон значений от 1,5 до 3,0 секунды, т.е. временные затраты до 1,5 секунд будут отображаться зелёным цветом (по умолчанию), попадающие в заданный промежуток времени – жёлтым и превышающие 3,0 секунды – красным. На шкале маркеров при наведении на линейки через дробь соответственно отображаются красные/жёлтые/зелёные маркеры (в данном примере: 3/4/1). При использовании панели «Дополнительная информация» расположенной справа в основном окне мониторинга (подключается в подменю «Вид»), можно подробно изучить полученные значения.

ИСПОЛЬЗОВАНИЕ СТАТИСТИЧЕСКИХ СВЕДЕНИЙ ПО ТАБЛИЦАМ И ИНДЕКСАМ


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

MS SQL Server не сможет выполнять запросы за разумное время, если в базах данных имеются следующие проблемы:
  • Индексы становятся сильно фрагментированными
  • Часть данных на строках, когда-то участвовавших в индексе уже удалена, и из-за этого индекс занимает на диске больше места и требует при выполнении запросов больше операций ввода-вывода
  • Статистика таблиц становится существенно неточной, причём это выясняется сервером именно в тот момент, когда она нужна

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

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

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

Scan Density показывает процент идеальности размещения страниц. Чем ближе результат к 100%, тем меньше фрагментация. В представленном примере заметно, что эта таблица довольно сильно фрагментирована. Сканирование постоянно использует переключение вперёд и назад от одного экстента к другому, вместо использования только ссылки одной страницы на следующую в пределах экстента.
Как правило, дефрагментация индекса путём его реорганизации целесообразна при значении Scan Density от 95% до 85%, перестройки – менее 85%.

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

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



Во вкладке «Статистика» имеется информация по каждой таблице по каждой статистики. В «Таблицы» выбирается таблица, в «Статистика» — статистика по которой необходимо отследить и

Vivaldi 1.11 — стремление к комфорту

Четверг, 10 Августа 2017 г. 10:31 + в цитатник
image

Всем привет!

Летняя пора, но работа идёт своим чередом — мы представляем новую стабильную выерсию браузера Vivaldi 1.11. Изменений в ней немного по причине летних отпусков, но кое-что интересное вы найдёте под катом.

Настройки режима чтения


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

image

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

image

Все настройки доступны прямо на странице при включенном режиме чтения.

Отключаем гифки


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

image

Другие удобства


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

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

image

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

Загрузить новую версию браузера можно с официальной страницы загрузки.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335324/


Метки:  

[Из песочницы] Angular 4 Material. Часть 1 — Создание и настройка проекта

Четверг, 10 Августа 2017 г. 10:02 + в цитатник

Предисловие


Столкнулся с необходимостью использования Angular 4 Material. Качал с .io сайтов HelloWorld-овские проекты, следовал гайдам. Но уроков по Angular 4 Material мало и складывается ощущение, что они написаны для уже знающих людей. Поэтому, решил написать несколько статей, в которых расскажу, как сделать из обычного проекта Angular проект Angular Material, а также о неожиданных проблемах использования некоторых компонентов и о их решениях. Пару раз пришлось даже написать собственные компоненты на основе существующих, что тоже будет освещено. Но обо все по порядку.

Этап 1. Подготовка ОС


В уроках используется Ubuntu 16.04.

Установка NodeJS


Сначала необходимо установить NodeJS. Используем пакетный менеджер Ubuntu:

sudo apt-get install nodejs

Для тех, кому не подходит пакетный менеджер Ubuntu, используйте Node Version Manager (если NodeJS успешно стал с помощью пакетного менеджера Ubuntu, пропустите этот шаг).

Установка Node Version Manager


Выполните:

sudo apt-get install build-essential checkinstall
sudo apt-get install libssl-dev
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash

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

sudo apt-get update
sudo apt-get install curl

Перезапустите свой терминал и выполните установку NVM:

nvm install stable

Установка NodeJS с помощью NVM завершена.

Установка nmp


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

Установка npm:

sudo apt-get install npm

И, наконец, последняя и важная вещь для нас, это инструмент для инициализации, разработки и поддержки приложений Angular, то есть, Angular CLI:

sudo npm install -g @angular/cli

Этап 2. Базовое приложение


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

Компонент — это элемент или совокупность элементов веб-страницы (отображение).
Модуль — всё приложение на Angular состоит из модулей. Обязан быть как минимум один корневой модуль.

Мы сделаем Material Angular проект на основе обычного генерирующегося Angular проекта. Для создания нового проекта служит команда:

ng new mySoul

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

А вот и первая ошибка при создании проекта:

cannot find module 'abbrev'

Чтобы ее устранить я создал ссылку на node для совместимости:

sudo ln -s /usr/bin/nodejs /usr/bin/node

Теперь проект успешно создан. Перейдем в папку с проектом

cd mySoul

И запустим его

ng serve --open

Автоматически откроется страница в браузере, где Вы увидите

image

Если Вы закрыли страницу, а сервер еще запущен, то в адресной строке напишите:
localhost:4200. 4200 — порт по умолчанию. Как его изменить, расскажу в следующей части.

Давайте удалим лишнее. Откройте файл mySoul/src/app/app.component.html и можете удалить всё из файла. Сохраните файл, перейдите на Вашу страницу и увидите, что на ней ничего нет. Одно из удобств: при редактировании проекта Вы сразу же можете видеть изменения.
Т.к. мы делаем проект Angular Material, нам необходимо установить дополнительные компоненты.

Внимание! Установка дополнительных пакетов должна производиться в корневом каталоге проекта (в нашем случае в папке mySoul)

Установим Angular Material:

npm install --save @angular/material

Angular CDK:

npm install --save @angular/cdk

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

npm install --save @angular/animations

И еще один важный шаг, который не описан на официальном сайте (или я очень слеп, т.к. несколько раз все перечитывал на официальном сайте, но этого не видел), но он необходим.
Необходимо подключить стиль. Для этого открываем файл mySoul/src/styles.css и подключаем стиль:

@import "~@angular/material/prebuilt-themes/indigo-pink.css";

Больше стилей можете найти на официальном сайте.

Теперь мы можем добавить Material компонент. Все Material компоненты можете найти на сайте Material Angular

Практически на любой веб-странице есть кнопки, поэтому добавим кнопку. Переходим на сайт Material Angular -> вкладка Components -> в меню слева ищем Button и кликаем на него. На открытой странице Вы можете увидеть, как этот элемент работает, и весь необходимый код для добавления элемента в Ваш проект.

Сначала, Вы должны нажать «<>» (вверху справа) и скопировать код

button md-button> Click me! code>
(добавьте открывающий и закрывающий теги)
с вкладки «HTML». Вставьте этот код в файл mySoul/src/app/app.component.html. После того, как Вы сохранили файл, на Вашей странице Вы увидите кнопку.

image

Кнопка самая обычная. А где же Material Design? Чтобы его увидеть, необходимо сделать следующее: импортировать модуль для этого компонента в свой проект. Перейдите на вкладку «API» (вверху).

Вы увидите:

import {MdButtonModule} from '@angular/material';

Откройте файл mySoul/src/app/app.modul.ts и подключите необходимый модуль. До редактирования файл app.modul.ts выглядел так:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

После подключения модуля он должен выглядеть так:

 import { BrowserModule } from '@angular/platform-browser';
        import { NgModule } from '@angular/core';
        import {MdButtonModule} from '@angular/material';

        import { AppComponent } from './app.component';

        @NgModule({
          declarations: [
            AppComponent
          ],
          imports: [
            BrowserModule,
            MdButtonModule
          ],
          providers: [],
          bootstrap: [AppComponent]
        })
        export class AppModule { }

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

image

Совет: для правильного отображения некоторых компонентов прямо сейчас подключите анимацию:

import {BrowserAnimationsModule} from '@angular/platform-browser/animations';


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

Теперь у Вас есть проект Angular с единственным Material компонентом. В следующей части я расскажу подробно о структуре проекта, как создать и правильно подключить несколько компонентов и напишем сервис.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335318/


Метки:  

По следам Petya: находим и эксплуатируем уязвимость в программном обеспечении

Четверг, 10 Августа 2017 г. 10:01 + в цитатник
image

Нашумевшие события последних месяцев наглядно показывают, насколько актуальной является проблема критических уязвимостей в программном обеспечении. Массовые атаки на пользователей с помощью вирусов-шифровальщиков WannaCry и Petya осуществлялись путем удалённой эксплуатации уязвимостей нулевого дня в сетевых сервисах Windows – SMBv1 и SMBv2. Нахождение и эксплуатация уязвимостей для удаленного выполнения кода – задачка явно не из легких. Однако лучшим из лучших специалистов по информационной безопасности всё по зубам!
В одном из заданий очного тура NeoQuest-2017 необходимо было найти уязвимости в доступной по сети программе-интерпретаторе команд, и с помощью их эксплуатации выполнить код на удаленном сервере. Для доказательства взлома нужно было прочитать содержимое файлового каталога на сервере – там, по условию, размещался ключ задания. Участникам был доступен бинарный файл интерпретатора. Итак, лёд тронулся!

Начинаем исследование


Для начала запустим бинарник и посмотрим, что он собой представляет. Становится ясно, что исполняемый файл интерпретатора формата PE и предназначен для архитектуры Intel x64. Также ясно, что он скомпилирован с поддержкой DEP/ASLR, но без CFG. Сторонние библиотеки также не подгружаются.



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



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

А что подавать на вход?


Первая промежуточная задача, которую необходимо решить – точное определение поверхности атаки. Уточним количество и формат команд, загрузив бинарник в IDA Pro. Функция main легко находится путем поиска выводимых на экран строк.

Анализ функции main позволяет утверждать следующее:

1. 1. Сначала адрес массива array на стеке функции main заносится в переменную array_base. В цикле ячейки массива инициализируются нулями. Условие выхода из цикла позволяет узнать размер массива – 100 (0x64) целочисленных ячеек.



2. 2. Происходит вывод на экран приветствия и считывание команды пользователя. Присутствие строк «cls» и «whoami» говорит о вызове функции system (в дальнейшем это нам сильно пригодится).



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



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





В результате анализа кода функции main выяснено, что недокументированных команд нет. Возможно влиять на следующие параметры:
  • индексы в командах set/get;
  • помещаемое значение в команде set;
  • размер и содержимое буфера для записи в массив.

В силу наличия защитных механизмов ASLR и DEP необходимо найти и реализовать 2 уязвимости:
  • уязвимость раскрытия адреса в исполняемой области памяти — для обхода ASLR и построения ROP-цепи с обходом DEP;
  • уязвимость перехвата потока управления по контролируемому нами адресу – для передачи управления на начало ROP-цепи и исполнения кода.

ROP (Return Oriented Programming) – современная техника эксплуатации, направленная на обход защитного механизма DEP. Суть этой техники заключается в переиспользовании маленьких фрагментов (гаджетов) исполняемой памяти перед инструкциями ret. Выстроенные в цепочку, адреса гаджетов последовательно снимаются со стека, выполняя команды в гаджете вплоть до команды ret. Она, в свою очередь, снимает со стека адрес следующего гаджета, и т.д.

Уязвимость №1


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



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



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

Почему так происходит? Уязвимость кроется в неверной обработке индекса в командах set/get. Численный индекс в массиве считывается как параметр команды set и переводится из строковой в численную форму с помощью вызова stoul. Эта функция возвращает беззнаковое целое.



Однако при передаче параметра в функции SET/GET это же значение ошибочно приводится к знаковому целому – оно сравнивается с размером массива и влияет на результат команды знакового сравнения jl. Команда GET выдает значение ячейки памяти, отсчитанное от начала массива.



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

С помощью отладчика экспериментально находим такие ячейки памяти перед буфером, где лежит исполняемый адрес – например, 4294967282 == -14 и 4294967283 == -13. Их значения мы далее используем при построении ROP-цепи.



Кроме того, в дальнейшем при эксплуатации нам понадобится адрес самого буфера на стеке. Как его найти? Взглянем на начало функции main и увидим, что переменная array_base хранит указатель на начало буфера.



На стеке эта переменная расположена по адресу rsp+0x358-0x328, а сам буфер начинается с адреса rsp+0x358-0x198.




Значит, необходимо отступить (0x328-0x198)/4 = 100 четырехбайтовых ячеек от начала массива, чтобы прочесть переменную array_base. Искомые смещения: 4294967196, 4294967197.



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

Уязвимость №2


До сего момента мы не исследовали функцию интерпретатора load. Посмотрим на неё повнимательнее. Очень скоро здесь обнаруживается классическое переполнение буфера на стеке. Введенная с клавиатуры строка — аргумент команды load — выделяется и передается как первый параметр функции-обработчика LOAD. Вторым параметром идет адрес искомого буфера.



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



Передав достаточно большое количество символов на вход команде load, возможно переписать адрес возврата на стеке и с выходом из интерпретатора передать управление по контролируемому нами адресу. С учетом размера и расположения буфера на стеке, адрес первичной передачи управления необходимо размещать со смещением 4 * (100 + 2) байта (дополнительные 8 байт переписывают сохраненное на стеке значение регистра rbp).

Поскольку переполненный буфер расположен на стеке, а не в куче, то ROP-цепь будем располагать там же целиком – начиная с смещения 4 * (100 + 2) во входном параметре команды load.



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

Pwn it!


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



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

Построим ROP-цепь, позволяющую это сделать. Последовательность операций следующая:
  1. Разместить строку «dir» по адресу, который известен на момент срабатывания уязвимости.
  2. Поместить в регистр rcx адрес этой строки.
  3. Передать управление в функцию system_func.




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

Теперь необходимо найти смещения нужных гаджетов в исполняемом файле интерпретатора. Первый необходим для помещения в rcx адреса строки «dir», второй — для вызова функции system_func. По смещениям 0x24c00 и 0x16ce6 соответственно в секции кода исполняемого файла интерпретатора находятся нужные участки кода.




Строку «dir» мы поместим после гаджетов. Её адрес, таким образом, будет на 4*(100 + 2) + 6*4 байт больше адреса буфера.

Ниже приведен наш вариант скрипта для генерации содержимого буфера:

from __future__ import print_function
import sys

n = 102
f=open("buf.txt", "w")

base_l = 0x2f150000 - 0x0 # get 4294967282
base_h = 0x7ff6           # get 4294967283

buffer_l = 0x0afcf6e0     # get 4294967196
buffer_h = 0xe8           # get 4294967197

def rev(x):
		return ((x << 24) & 0xff000000 | (x << 8) & 0x00ff0000 | (x >> 8) & 0x0000ff00 | (x >> 24) & 0x000000ff)

arr = [
base_l + 0x24c00,
base_h,                   # pop rcx ; ret
buffer_l + n*0x4 + 6*0x4,
buffer_h,                 # buffer ptr - in rdi
base_l + 0x16ce6,
base_h                    # &system in our binary
]

for i in range(0,n):      # dumb
print("%08x" % rev(0xdeadbeef), end='', file=f)
for i in arr:
print("%08x" % rev(i), end='', file=f)
                          
                          # "dir\0"
print("%08x" % 0x64697200, end='', file=f)
f.close()


Всё готово, пора идти за ключом!
  • Подключаемся к удалённому серверу, узнаем нужные адреса командой get.
  • Генерируем уязвимый буфер на их основе.
  • Выполняем команду load, переписываем адрес возврата из функции main.
  • Выполняем команду exit, что завершает функцию main и запускает эксплойт на выполнение.




Искомый ключ: fb520eb552747437c09f2770a9a282ea.

Что в итоге?


В NeoQUEST мы собираем самые разнообразные задания, требующие знаний из разных направлений ИБ и способные показать, чем чревато небрежное отношение к безопасности: слабые пароли, плохая реализация сервера (уязвимость в ней мы искали методом фаззинга и подробно описали в этой статье), нестойкие шифры. А на примере данного задания хорошо видно, как небрежности в программировании могут нанести критический урон безопасности информации.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335046/


Метки:  

[Перевод - recovery mode ] Где лучше всего жить и работать разработчику

Четверг, 10 Августа 2017 г. 10:00 + в цитатник
Алёна Лазарева, редактор-фрилансер, перевела для блога Нетологии статью Benjamin Martin о городах, в которых разработчиков ждут лучшие зарплаты.



Где лучше всего искать работу разработчику? В Нью-Йорке? Сан-Франциско?

Если судить по уровню заработной платы, Кремниевая долина явный победитель — среднегодовой доход для разработчика там составляет 110 554 $, согласно данным Glassdoor. Но стоимость аренды в области залива Сан-Франциско настолько высока, что не все разработчики могут позволить себе снимать там жильё.

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

Реальный доход = Средняя зарплата — Налоги — Социальное обеспечение — Стоимость жизни — Аренда

К каким выводам мы пришли




Если у вас нет времени на чтение всей статьи, то вот выводы, к которым мы пришли:
Сиэтл — явный победитель, зарплата там близка к той, что предлагают в Кремниевой долине, а арендная плата значительно ниже. В целом, за некоторым исключением в США результаты лучше, чем за их пределами. Интересно, что в рейтинге по городам США Сан-Хосе занимает 3-е место из 21, тогда как Сан-Франциско только на 19-м. Во всем виновата разница в арендной плате.

На Восточном побережье, в Нью-Йорке и Вашингтоне (округ Колумбия), дела обстоят еще хуже — они занимают последние два места соответственно. У Финикса второе место, а Остин и Хьюстон завершают первую пятерку. Если смотреть на международный рейтинг, советуем обратить внимание на Тель-Авив, крупные города в Канаде и Берлин. А вот в Лондоне, Сингапуре и Китае все не так хорошо, как мы ожидали.

Как мы проводили расчеты


Ранее мы прочитали статью на портале Glassdoor «25 городов с лучшими зарплатами для программистов». В их рейтинге Сан-Хосе занимает второе место, а Сан-Франциско третье. Glassdoor считает, что в Сан-Хосе более высокая стоимость жизни, чем в Сан-Франциско. Наши данные говорят об обратном.

Давайте поближе посмотрим на их формулу:

Масштабированный доход = ((средняя стоимость жизни) / (фактическая стоимость жизни)) * Базовый доход

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

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

Реальный доход = Средняя зарплата — Налоги — Социальное обеспечение — Стоимость жизни — Аренда

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

Как обстоят дела в США


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

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

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



Если вы задумали переезд, то Финикс, Остин и Хьюстон — отличный выбор, реальный доход там выше 30 000 $. Однако эти рынки все еще растут и вакансий там не так много, как у городов в конце списка. Роли (Северная Каролина) немного уступает Хьюстону, но опять же, рынок труда там на данный момент относительно невелик.

Выше мы уже обращали ваше внимание на разницу реальной прибыли в Сан-Хосе и Сан-Франциско. Города расположены близко друг к другу — в области залива Сан-Франциско, ситуация на рынке тоже очень похожа, так почему мы видим такую большую разницу в реальном доходе? Наши данные показывают, что зарплата и стоимость жизни почти идентичны, всё дело в дорогой аренде в Сан-Франциско.



Разброс величины повседневных расходов не такой большой, в отличие от арендной ставки. В нашем рейтинге городов США Финикс занимает третью строчку, там средняя стоимость аренды квартиры с одной спальней обойдется вам в 972 $ в месяц. В Сан-Франциско аналогичную квартиру вы можете снять за 3272 $, поэтому он только на 19-м месте.

За пределами области залива Сан-Франциско наиболее активно рынок труда для разработчиков сейчас развивается в Вашингтоне, Нью-Йорке и Бостоне, но из-за высокой аренды они опускаются в конец нашего списка. В Вашингтоне на данный момент открыто больше всего вакансий. Но высокая стоимость жизни и низкая средняя зарплата заставляют нас признать: Вашингтон — не самый удачный выбор из всех городов Америки.

Как обстоят дела в других странах


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



Осло возглавляет список с точки зрения прибыли, но мы не упоминали о нем раньше, поскольку рынок труда там самый маленький из 43 городов. Оценивайте свои шансы трезво: в Осло на данный момент открыто всего 106 вакансий, а, например, в Нью-Йорке — 22 554.

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

Торонто, Монреаль и Ванкувер занимают 3, 4 и 5 места в нашем списке реального дохода. Открытых вакансий в каждом из них больше, чем в Тель-Авиве. Шестое место в списке у Берлина, в котором расположен один из самых больших в Европе технопарков. Бангалор заслуживает отдельного упоминания — там вас ждет самое большое количество вакансий и очень, очень маленький реальный доход.



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

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

Также мы рассчитали коэффициент доходности для городов вне США: доход после налогообложения поделили на расходы, а затем проиндексировали к аналогичному результату для Сан-Франциско. Таким образом, у Сан-Франциско коэффициент будет равен 100, а значение 150 у другого города будет означать, что жить там на 50% выгоднее, чем в Сан-Франциско.

X = (Доход после уплаты налогов / расходы)
Коэффициент доходности города A = 100 * (X города А / (Х Сан-Франциско)




Полученные результаты по большей части повторяют график с реальным доходом. Наиболее интересным в данном случае является сравнение Сан-Франциско и городов вне Америки. Большинство городов США имеют значения коэффициента выше ста, около половины неамериканских городов имеют более низкий показатель.

Что еще стоит учитывать


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

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



В десятку лучших городов по качеству жизни вошли Мельбурн и еще 9 американских городов. Однако, за пределами Америки все не так плохо — 13 из 22 городов обходят Нью-Йорк. Запомните эти результаты: не думаем, что вы захотите жить в городе с плохой экологией.

Дисклеймер


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

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

В-третьих, некоторые расхождения могут возникнуть из-за источников, в которых мы брали данные для сравнения. Данные о зарплате и вакансиях из Glassdoor, стоимость жизни и аренды — от Numbeo, а налоговые расчеты — от IRS и KPMG. Примечательно, что в городах за пределами Америки было меньше данных об уровне зарплаты, поэтому в некоторых случаях мы использовали другие источники. Например, мы использовали китайские сайты для поиска данных по Пекину и Шанхаю.
Исходные данные, которые мы использовали, можно найти здесь.

От редакции


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

Формулу для расчета оставили прежнюю, среднюю заработную плату для всех городов подсказал Яндекс, сумму повседневных расходов — Numbeo. Самая высокая налоговая ставка в Украине — к 18% НДФЛ добавляйте 1,5% военного сбора. Самая низкая — в Минске, там резиденты технопарка отчисляют государству только 9% от своих зарплат.

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



Жить в центре города и не считать каждую копейку могут жители Киева. Накопить в год получится чуть больше 3000 $. Санкт-Петербург на втором месте, там реальный доход составит 2326,13 $. Реальный доход в Москве действительно в минусе; правда, у нас он получился не настолько большой, как в исследовании Codementor. Но если вы не против жить в спальном районе, то заработать все-таки получится.

Заключение


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

Акция от Нетологии


До конца августа Нетология проводит акцию: при покупке 1 программы обучения — 2-я в подарок.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335284/


Нереализованный потенциал Интернета вещей

Четверг, 10 Августа 2017 г. 10:00 + в цитатник
Однажды Томас Эдисон сказал: «У меня не было никаких неудач. Я с успехом нашел пять тысяч способов, которые никуда не годятся». Хотя неудачи и являются важным и естественным этапом при создании новых решений, все же мы стремимся к успеху и стараемся избегать ненужных поражений. К сожалению, в мире Интернета вещей сегодня мы наблюдаем слишком много промахов, которых можно бы было избежать.



Согласно новому исследованию, опубликованному компанией Cisco (“Cisco: Most IoT projects not a complete success”), эта тенденция становится все более выраженной. Согласно результатам опроса, три четверти всех IoT-проектов нельзя считать «полностью успешными». 60% застопорились на стадии проработки концепции, что свидетельствует об отсутствии у компаний необходимых инструментов для надлежащей реализации IoT-проектов. И это весьма досадно, ведь Интернет вещей сулит немалые возможности для предприятий, позволяя повысить эффективность, улучшить качество обслуживания заказчиков и увеличить выручку.

В ходе опроса были выявлены следующие основные факторы, препятствующие успешной реализации IoT-проектов:

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

К счастью, существуют способы, позволяющие преодолеть все эти сложности.

Ключ – в совместной работе


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

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

Построение доверия в экосистеме Интернета вещей


Обеспечение безопасности – это один из аспектов, который способен отдалить успешную реализацию IoT-проектов. Мы наблюдали немало нашумевших случаев, когда хакерам удавалось воспользоваться уязвимостями и получить доступ к конфиденциальным данным или даже останавливать работу целых сетей. Компании могут подготовиться к подобным сценариям путем реализации так называемого подхода «встроенной безопасности» («security by design»), с использованием строгой инфраструктуры безопасности, внедряемой на IoT устройства на самых ранних этапах. Инвестируя в грамотные практики и пользуясь консультациями экспертов, компании могут повысить безопасность всех участников проекта, а сами IoT-инициативы будут больше оправдывать их ожидания. Кроме того, безопасные инфраструктуры создают условия для развития IoT-устройств, поскольку обновления безопасности могут выпускаться на всем протяжении их порой довольно длительных жизненных циклов.

От сбора данных до качественного анализа


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

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

А на ваш взгляд, что является ключевым фактором, благодаря которому компании могут полностью реализовать потенциал своего IoT-проекта?
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334548/


Метки:  

Microsoft Office Automation: Еще одна лазейка для макровируса

Четверг, 10 Августа 2017 г. 09:39 + в цитатник
Пакет программ Microsoft Office — это не только фактический стандарт офисного ПО, но и весьма сложная и многофункциональная среда, позволяющая создавать решения, предназначенные прежде всего для применения возможностей Microsoft Office и автоматизации рутинных действий пользователя при работе с документами. Эта программная платформа, называемая Объектной Моделью Microsoft Office (Microsoft Office Object Model), или же Автоматизацией Microsoft Office (Microsoft Office Automation) основана на Объектной Модели COM и содержит обширный набор классов, предоставляющих доступ практически к любому элементу или действию, доступному пользователю при работе с Microsoft Office через графический интерфейс.

image
Объектная модель Microsoft Word (частично)

Говоря о программировании для Microsoft Office, часто подразумевают «внутренние» программы — макросы, написанные на VBA (Visual Basic for Applications, реализация Visual Basic в Microsoft Office) и встраиваемые непосредственно в документы.

image
Создание макроса для Microsoft Excel

Благодаря широким возможностям языка (за счет доступа к внешним dll и компонентам практически неограниченным) и удобной модели распространения (с файлами документов) макросы Microsoft Office использовались для создания зловредного ПО с момента появления VBA и получили собственное название — макровирусы. Несмотря на некоторое ужесточение настроек, связанных с макросами (на текущий момент актуальные версии Microsoft Office при настройках по умолчанию запрещают автоматическое выполнение макросов, уведомляя об этом пользователя), макровирусы активно применяются злоумышленниками и сейчас. Для эффективного использования этой технологии с двадцатилетней историей оказалось достаточно дополнить ее элементами социальной инженерии.

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

Объекты Microsoft Office доступны не только из макросов, но и из «внешних» программ на любых языках, поддерживающих COM. Последние могут быть компилируемыми программами на языках вроде C++ или Delphi, управляемыми приложениями на Java или .Net, или же скриптами на VBScript и PowerShell — COM технология доступна практически для всего, способного выполняться под Windows.

image
Доступ к объектной модели Microsoft Office из PowerShell

Объектная Модель Microsoft Office представляет приложения Microsoft Office в виде COM-объектов. Но существует также возможность добавлять в документы и другие COM-объекты — управляющие элементы ActiveX, не относящиеся к Microsoft Office, но присутствующие в операционной системе. Будучи включенными в документ, эти элементы могут взаимодействовать с кодом макросов, либо выполнять собственный код, основанный на добавляемых в документ «свойствах» — properties объекта. В умелых руках встраивание элементов ActiveX также может приводить к выполнению произвольного кода, поэтому в последних версиях Microsoft Office по умолчанию запрещен запуск встроенных ActiveX за исключением некоторого «белого списка» элементов. Впрочем, пользователь и в этом случае при желании может явно разрешить выполнение.

image
Предупреждение о встроенных ActiveX

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

Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add("e:\test\fax.dotx")
objDoc.SaveAs("e:\test\temp.docx")
objDoc.Close
objWord.Quit
Пример на VBScript

application = new Word.Application();
Object templatePathObj = "путь к файлу шаблона";;
try
{
    document = application.Documents.Add(ref  templatePathObj, ref missingObj, ref missingObj, ref missingObj);
}
catch (Exception error)
{
    document.Close(ref falseObj, ref  missingObj, ref missingObj);
    application.Quit(ref missingObj, ref  missingObj, ref missingObj);
    document = null;
    application = null;
    throw error;
}
_application.Visible = true;
Пример на C#

try {
        using namespace Word;
        _ApplicationPtr word(L"Word.Application");
        word->Visible = true;
        word->Activate();
        _DocumentPtr wdoc1 = word->Documents->Add();
        RangePtr range = wdoc1->Content;
        range->LanguageID = wdRussian;
        range->Tables->Add(range,5,5);
       wdoc1->SaveAs(&_variant_t("C:\\1test.doc"));
        wdoc1->Close();
 
    } catch (_com_error& er) {}
Пример на C++

$word = New-Object -ComObject Word.Application
$word.Visible = $True
$doc = $word.Documents.Add()
Пример на PowerShell

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

app.AutomationSecurity = 3

Что она означает, расскажет официальная документация:

Application.AutomationSecurity Property (Excel)

Returns or sets an MsoAutomationSecurity constant that represents the security mode Microsoft Excel uses when programmatically opening files.

MsoAutomationSecurity can be one of these MsoAutomationSecurity constants.

msoAutomationSecurityByUI. Uses the security setting specified in the Security dialog box.|
msoAutomationSecurityForceDisable. Disables all macros in all files opened programmatically without showing any security alerts.
msoAutomationSecurityLow. Enables all macros. This is the default value when the application is started.


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


Выполнение макроса при открытии документа через Автоматизацию

Эта неочевидная особенность, судя по всему, достаточно редко учитывается. К примеру, офисные программы других производителей применяют объектную модель Microsoft Office для импорта и экспорта данных в документы Word и Excel. Достаточно часто встречаются примеры для 1С:

MSWord = Новый COMОбъект("Word.Application"); 
    MSWord.Documents.Add(ИмяФайла);

    ActiveDocument = MSWord.ActiveDocument;
    Content = ActiveDocument.Content;
            
    //Добавляем строки в конец документа
    Content.InsertParagraphAfter();
    Content.InsertAfter("Добавляемая строка 1");
    Content.InsertParagraphAfter();
    Content.InsertAfter("Добавляемая строка 2");
    Content.InsertParagraphAfter();
            
    //Добавляем в конец текущего документа содержимое другого файла без ссылки на исходный
    //Вставим дополнительный абзац
    Content.InsertParagraphAfter();

    //На его место вставляем файл
    ActiveDocument.Range(Content.End - 1, Content.End).InsertFile(ИмяФайлаДляВставки, "", Ложь, Ложь);
    Content.InsertParagraphAfter();
Пример для 1С

Программы 1С, называемые «обработками», также могут использовать COM вообще и объектную модель Microsoft Office в частности. Некоторые полезные обработки предоставляются пользователям производителем, например, обработка «ЗагрузкаДанныхИзТабличногоДокумента.epf» позволяет загружать в базу данные из внешних табличных документов.


Выполнение макроса при открытии документа через обработку 1С

Как можно видеть, свойство AutomationSecurity было забыто и программистами 1С.
С одной стороны, это классический пример того, что необходимо думать о безопасности в процессе программирования, какой бы язык ни использовался. С другой стороны, какая причина заставила Microsoft при ужесточении настроек безопасности Microsoft Office оставить незащищенной объектную модель?




Небольшое видео, демонстрирующее то, как злоумышленник может захватить контроль над компьютером бухгалтерии при помощи Metasploit Framework и прайса на вареники. Макрос, содержащийся в документе Excel, запускает скрипт для PowerShell, открывающий атакующему доступ к командной строке на атакуемой системе.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335222/


Метки:  

CNCF предложила бесплатное облако Open Source-проектам для DevOps/микросервисов

Четверг, 10 Августа 2017 г. 09:30 + в цитатник


Во вторник организация CNCF (Cloud Native Computing Foundation) объявила о публичной доступности своей «инфраструктурной лаборатории» — CNCF Community Infrastructure Lab (CIL). Это означает, что Open Source-проекты, связанные с микросервисной архитектурой и «облачным» (cloud native) подходом, могут бесплатно получить в своё распоряжение инфраструктуру для тестирования функционирования и производительности своих наработок в облаке нужного масштаба.

CNCF — проект The Linux Foundation, созданный в конце 2015 года с целью способствовать широкому принятию подхода cloud native — «вычислительной парадигмы, оптимизированной для современных распределённых окружений, способных масштабироваться до десятков тысяч самовосстанавливающихся многопользовательских узлов». Подразумевается, что такие (cloud native) системы запускают приложения, разбитые по контейнерам, динамически управляются и являются ориентированными на микросервисную архитектуру. А поскольку всё это происходит с подачи Linux Foundation, речь идёт о проектах с открытым исходным кодом (Open Source). И сегодня среди поддерживаемых в CNCF проектов можно увидеть много знакомых DevOps-миру названий: Kubernetes, containerd, Prometheus, CNI, CoreDNS, Linkerd и др.

CNCF Cluster: первая версия


С самого своего появления CNCF организация стремилась обеспечивать инфраструктуру для Open Source-проектов. Со временем это вылилось в создание специального кластера — CNCF Cluster. Первую его реализацию представили около года назад, а его конфигурация была основана на процессорах Intel Xeon (и подарена компанией Intel), выглядела следующим образом:



Уже тогда CNCF Cluster назывался «крупнейшим в мире бесплатно доступным кластером из bare metal-серверов для развития cloud native computing». И за время существования его первой версии к облачным ресурсам CNCF успели обратиться такие проекты, как Kubernetes, Apache ZooKeeper, Elasticsearch на Mesos, СУБД TiDB и другие. Однако самым масштабным пользователем оказалась платформа OpenShift.

Инженеры Red Hat развернули две инсталляции OpenShift: один кластер на 100 узлах bare metal и второй — на 2048 узлах виртуальных машин на базе облака OpenStack (Red Hat OpenStack Platform 10).



Цели эксперимента заключались в тестировании различных компонентов Docker (драйвер overlay2 для OverlayFS) и Kubernetes/OpenShift (HAProxy + Ingress, Persistent Volumes на базе Red Hat Container-Native Storage, реестр контейнеров) на достаточно большом масштабе. Результаты их теста подробно описаны в блоге OpenShift, а итоговые впечатления от эксперимента были сформулированы так:
Проделана большая работа. Как мы можем быть уверены, что сообщество и потребители выиграют от неё? Во-первых, мы добавляем абсолютно все [полученные результаты] в upstream. Вдобавок, мы создаем настолько много настроек, лучших практик и оптимизаций конфигов для продукта, насколько это возможно… и документируем всё остальное. [..] CNCF Cluster — невероятно ценный актив для Open Source-сообщества. Второй этап тестирования производительности на кластере CNCF снова обеспечил нас полезной информацией, которую мы используем в грядущих релизах.

Одним из заметных ограничений первого CNCF Cluster было максимальное время его использования — до 2 недель. С ним столкнулись в своих запросах такие проекты, как Cilium и etcd. Но их не оставили без внимания: на помощь пришёл сотрудник американской компании Packet, специализирующейся на предоставлении ресурсов bare metal по запросу*… И вот пришло время, когда это предложение распространилось на весь кластер CNCF, который вместе с Packet получил вторую инкарнацию.

* Кстати, в Open Source-сообществе Packet была известна и ранее — благодаря своей безвозмездной помощи для kernel.org.

CNCF Cluster: новая версия


Итак, для нужд CNCF в Packet предлагают облако, финансово лимитированное 25 тысячами USD в месяц и географически распределённое по всему миру (включая США, Нидерланды, Японию).

Доступны серверные варианты 5 типов (7 конечных конфигураций) на базе:
  • Intel Atom C2550 (4 cores @ 2.4Ghz);
  • Intel Xeon E3-1240 v3 (4 cores @ 3.4Ghz);
  • Intel E3-1578L (4 Physical Cores @ 2.0 GHz base / 3.40 GHz burst);
  • 2 x Intel Xeon E5-2650 v4 (24 cores @ 2.2 GHz);
  • 2 x Cavium ThunderX ARMv8 SoC's;
  • 2 x Intel Xeon E5-2640 v3 (16 cores @ 2.6Ghz);
  • 2 x Intel E5-2620 v4 (16 total cores @ 2.1Ghz).


Типовая конфигурация сервера Packet, предлагаемая для развёртывания приложения

Среди официально поддерживаемых операционных систем для серверов с процессорами Intel упоминаются Ubuntu 14.04 и 16.04, Debian 8, CentOS 7, Scientific Linux, Container Linux, RancherOS, NixOS, FreeBSD, а для ARMv8 этот список гораздо короче, зато дополнен CoreOS. Сетевые возможности включают в себя анонсирование своего IP-пространства, BGP/Anycast и поддержку IPv6.

Взаимодействовать с предлагаемыми конфигурациями можно по специальному API, доступному по протоколу HTTP, а также с помощью готовых клиентов, уже реализованных на Ruby, Python, PHP, Go, Java, Node.js. Одна из особенностей Packet — интеграция предлагаемых ею ресурсов с популярными инструментами/сервисами для работы с облачными окружениями и контейнерами, такими как Rancher, Terraform, Mesosphere DC/OS, Kontena, Docker Machine и Docker Cloud, Apache jclouds и Apache Libcloud, а также системой управления конфигурациями Ansible и сетевым решением Project Calico.

Подача заявки на ресурсы


При получении ресурсов от CNCF CIL следует помнить, что приоритет отдаётся проектам, которые уже входят в официальный список CNCF, затем — компаниям-членам организации, а после этого — остальным разработчикам. Кроме того, проект должен удовлетворять следующим основным требованиям:
  1. запускаемый код должен быть Open Source (распространяться под лицензиями, одобренными OSI) на 100%;
  2. приложение должно позволять разработчикам тестировать или создавать непрерывно интегрируемые инфраструктуры с автоматизированным использованием крупного публичного облака и без принудительного применения виртуализации;
  3. в тестировании должны использоваться контейнеры, если это уместно.

Чтобы запросить ресурсы для своего проекта, необходимо создать issue в Git-репозитории CNCF Cluster. Для текста заявки заготовлен достаточно подробный шаблон, который просит рассказать о том, для кого из сообщества и конечных пользователей будут полезны проводимые тестирования и как они «помогут развить cloud native computing (в частности — контейнеризацию, оркестровку, микросервисы или любую их комбинацию)». Примеры уже реализованных запросов (правда, пока они относятся только к старому кластеру) можно увидеть в закрытых issues.

P.S.


Возможно, вам не нужны эти ресурсы прямо сейчас (и/или вы не разрабатываете Open Source-код), но полезно знать… возможно, даже не столько об этом конкретном предложении, сколько о самих примерах сотрудничества в индустрии на благо современным технологиям и, конечно, Open Source.

Читайте также в нашем блоге: «Linux Foundation представила бесплатный вводный онлайн-курс по Kubernetes».
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335218/


[Перевод] Как выбрать правильный лэптоп для программирования

Четверг, 10 Августа 2017 г. 09:24 + в цитатник

Выбор лэптопа, подходящего для программирования – задача непростая.

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

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

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

При написании статьи я исходил из следующего:

  • Вы — веб-разработчик
  • Ваш лэптоп – ваш основной инструмент разработки

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

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

Мобильность


Лэптоп можно подобрать любой формы и размера. Определитесь, насколько легким и портативным он должен быть.

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

Если вы работаете в нескольких местах или много путешествуете, то 13- или 14-дюймовые лэптопы — ваш выбор. Они более легкие, и батарея продержится дольше.

Если вы не покупаете лэптоп «два в одном», сенсорный экран не оправдывает дополнительные расходы на него. Я бы не рекомендовал приобретать лэптоп с сенсорным экраном.



Дисплей


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

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

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

В любом случае, не покупайте лэптоп с разрешением менее чем Full HD 1920 x 1080 (1080p). Если за разрешение 1080p надо немного доплатить — сделайте это.

Также убедитесь, что у дисплея достаточные углы обзора, экран не должен выполнять функции зеркала!

Процессор (CPU)


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

В общем и целом, процессор  Intel core i5 или  i7 с частотой  3GHz  и больше подойдет большинству.

ОЗУ (RAM)


Я не думаю, что можно серьезно заниматься программированием на лэптопе с ОЗУ менее, чем 4GB. Мои рекомендации по минимальному объему оперативной памяти — 8GB. И даже этого может оказаться недостаточно с появлением приложений Electron, которые используют большое количество ОЗУ. Если вы можете себе это позволить — инвестируйте в ОЗУ на 16GB.

Тип и объем памяти


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

Рекомендуемый минимальный объем SSD  — 256GB. Если у вас достаточно средств, то SSD на 512GB или 1TB — это лучший вариант. Если цена имеет значение, то приобретайте SSD с меньшим объемом, на котором будут находиться ваша операционная система, а также ваши приложения и наиболее часто используемые документы (такие как проектные файлы). Все остальное — например, музыка и видео — будет храниться на большем по объему жестком диске.

Клавиатура




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

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

Питание


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

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

Операционная система


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



Linux можно установить на большинство лэптопов, но лучше приобрести тот, который официально поддерживается Linux. Некоторые поставщики, такие как Dell and System 76, предлагают высококачественную продукцию с предустановленной ОС Linux. Рекомендую в первую очередь обратить внимание на эти варианты.

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

Дискретная или интегрированная видеокарта?


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

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


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

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

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

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

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

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

https://habrahabr.ru/post/335298/


Метки:  

О поддержке языковых фич C# в Visual Studio и в CodeRush for Roslyn

Четверг, 10 Августа 2017 г. 09:00 + в цитатник

C# постоянно развивается. Весной вышла уже седьмая версия. В этой статье будет обзор поддержки последних фич C# в CodeRush for Roslyn. Про C# 7.0 уже было несколько публикаций на хабре, поэтому основное внимание именно на то, как это поддерживается в CodeRush for Roslyn.


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



Task-like возвращаемые типы асинхронных методов


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


Во-первых, давайте проверим как работают фичи внутри асинхронного метода, который возвращает Task-like тип. Например, для метода с одним параметром попробуем вызвать Exit Method Contract:



Как видим, CodeRush for Roslyn корректно определил, что return-оператор должен быть пустым и не должен содержать никакого выражения, т.к. в данном случае возвращаемый тип не является универсальным (не содержит параметров типа). Другие фичи, которые генерируют return-операторы также работают корректно. В качестве примера, давайте посмотрим как отработает шаблон "r", который вызывает Smart Return, внутри асинхронного метода:



В этом случае CodeRush правильно распознал, что в return-операторе должно содержаться выражение типа ArgumentKind и вставил соответствующее значение по-умолчанию.


Второй момент — это фичи, которые используют await-выражения с вызовом асинхронного метода, возвращающего Task-like тип. Как видно на следующем скриншоте, CodeRush правильно определяет тип таких await-выражений:



Кортежи значений


Пожалуй, это нововведение в спецификациях языков претендует на роль самого востребованного. Теперь с помощью удобного синтаксиса можно объявлять типы, являющиеся кортежами нескольких значений. Можно задавать как просто типы элементов, так и их имена. Для будущих релизов у нас есть несколько идей по наиболее обширной поддержке кортежей: определять и удалять неиспользуемые пункты, менять пункты местами, использовать кортежи в рефакторинге Convert to Tuple и др. Пока же имеется поддержка кортежей в уже имеющихся фичах. Продемонстрируем это на примере рефакторинга Add Parameter:



Рефакторинг корректно распарсил введённое значение как кортеж из SortingKind и SortingOrder и в качестве дефолтного значения подставил кортеж из дефолтных значений этих типов.


В качестве ещё одного примера продемонстрируем работу фичи Smart Return, которая вызывается раскрытием шаблона r:



Как видим, CodeRush for Roslyn использует имена для переменных кортежа, если они были объявлены.


Вложенные локальные функции


Порой возникает необходимость написания вспомогательной функции использование, которой ограниченно определённым методом. В C# 7 возможно объявить локальную функцию прямо в теле метода. Локальные функции схожи с лямбда-выражениями, но зачастую код использование локальных функций является более наглядным и понятным.


Во-первых, мы обновили фичу Naming Assistant чтобы она работала с локальными функциями:



А еще, уже знакомый Add Parameter тоже теперь работает с новым синтаксисом:



Рефакторинг правильно нашёл декларацию и все ссылки и добавил параметр в нужные позиции.


Расширение использования expression-body и throw-expression


Думаю, что многим пришлось по душе использование expression-body в C# 6, теперь список элементов, где он может быть расширен акцессорами свойств, конструкторами и деструкторами. Рефакторинг Use Expression Body доступен на новых элементах:



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



Use Expression Body доступен теперь и в тех случаях, когда в теле метода/акcессора отсутствует имплементация и присутствует лишь вызов исключения. С появлением throw-expression запись таких методов можно сделать короче и нагляднее:



Ещё один случай, где throw-expression повышает наглядность кода — это тернарные операторы. Теперь if/else-выражение, в котором в зависимости от условия либо вызывается исключении, либо возвращается/присваивается какое-то значение, можно заменить одним выражение с тернарным оператором. Поможет в этом рефакторинг Compress to Ternary Expression:



Обратный рефакторинг Expand Ternary Expression конечно же также будет доступен на выражениях с throw-expression:



Сопоставление с образцом


Тоже очень мощное нововведение, которое, уверен, уже полюбилось многим пользователям. Оно позволяет в операторах if и case проверить, что переменная является объектом определённого типа и тут же объявить переменную этого типа, избегая лишнего кастинга. В case-операторах в дополнение к этому можно осуществить дополнительные проверки в when-выражении.


В данном разделе мы тоже пока не воплотили все свои идеи. В качестве примера того, что уже имеется, продумонстрируем работу фичи Declare Class на case-выражении, в котором использован новый синтакс:



В данном случае CodeRush for Roslyn корректно определил, что здесь используется шаблон типа, а также сразу задекларировал свойство, используемое в when-выражении. Давайте теперь отладим данный метод при этом включим CodeRush Debug Visualizer:



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


Возврат по ссылке


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


Возьмём связку из двух уже знакомых нам фич: Smart Return и Declare Method и посмотрим как они отработают в методе, который возвращает значение по ссылке:



Smart Return подставил ключевое слово ref, поскольку return-оператор должен содержать ref-выражение в данном случае. Declare Method, определив, что метод вызывается в ref-выражении, корректно объявил возвращаемый тип как ref int.


Бинарные литералы


Теперь значения каких-то констант в коде можно задавать, используя двоичный код. Это может быть удобным в перечислениях. CodeRush имеет в своём арсенале фичу, которая позволяет ускорить и упростить задачу добавления нового элемента — Smart Duplicate Line. Достаточно нажать Shift + Enter и CodeRush добавит новый элемент, выделив текстовыми полями те элементы, которые потребуют изменений:



И обещанный бонус


Мало кто знает, но на уровне проекта можно выбирать версию языка. CodeRush for Roslyn учитывает опцию Build | Advanced | Language Version.



Например, если поставить C# 4.0, то контекстное меню изменится, потому что интерполяцию строк придумали в C# 6.0.



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


Например, если в проекте стоит версия C# 6.0, то Declare Comparison members из Declare Menu сгенерит код таким образом:


// ...
Class1 other = obj as Class1;
if (other == null) {
   throw new ArgumentException(nameof(obj) + " is not a " + nameof(Class1));
}
// ...

А в C# 3.0, например, nameof() еще не было, и код будет таким:


// ...
Class1 other = obj as Class1;
if (other == null) {
    throw new ArgumentException("obj is not a Class1");
}
// ...

За счет использования штатных парсеров студии CodeRush for Roslyn одинаково хорошо поддерживает как новые возможности C#, так и старые. CodeRush значительно расширяет возможности Visual Studio не замедляя ее. Особенно это заметно на серьезных enterprise-проектах с большим объемом кода.


Скачать попробовать CodeRush for Roslyn можно на нашем сайте.

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

https://habrahabr.ru/post/334664/


Метки:  

Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1089 1088 [1087] 1086 1085 ..
.. 1 Календарь