Русский
Русский
English
Статистика
Реклама

Настройка

Простой способ отключения мерцания подсветки LCD мониторов и телевизоров, Flicker-Off

04.03.2021 16:23:55 | Автор: admin
''Свобода* лучше, чем несвобода*''
*от мерцания подсветки

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

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

КДПВ

На habr.com уже было несколько статей, посвященных как описанию этого явления, например Пульсация экранов телевизоров и Увидеть пульсацию, так и методам борьбы с ним, например за счет увеличения частоты ШИМ подсветки Разгон подсветки монитора, или даже полной переделке подсветки (ссылки внутри статьи Как оценить пульсацию светодиодных ламп).

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

Однако иногда можно добиться вполне удовлетворительного результата, не вставая с дивана компьютерного кресла, ограничившись лишь подстройкой монитора, буквально отключив мерцание его подсветки (ну, или по крайней мере существенно его уменьшив). Так сказать,Flicker-Off.
Подробности под катом:

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

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

Причина использования ШИМ регулирования яркости


Дело в том, что при изменении величины тока через светодиод помимо его яркости, меняется и цветовая температура при снижении тока она обычно уходит в синеву (в отличие от ламп накаливания, которые при работе вполнакала уходят в красноту). Но, в отличие от весьма инерционных ламп накаливания, LED светодиоды* практически безынерционные, время их включения и выключения менее миллисекунды, что позволяет регулировать их яркость за счет Широтно-импульсной модуляции (ШИМ, PWM).
  • С CCFL лампами ситуация аналогичная, кроме того они нестабильно работают при пониженном напряжении.

Т.о. часть времени (в зависимости от скважности ШИМ) светодиод работает на 100% ярости*, (условно говоря в полный накал), а часть времени выключен.
  • Существуют светодиоды, в которых за счет технических ухищрений удаётся поддерживать стабильную цветовую температуру при снижении яркости в некоторых пределах, но такие светодиоды существенно дороже, да и рабочий диапазон регулирования их яркости не бесконечен, так что на малой яркости с ними тоже вынуждены использовать ШИМ.

Обычно в мониторах и телевизорах с LED подсветкой используется частота ШИМ от немногим более 100 Hz и выше, вплоть и до нескольких тысяч Hz.* Очевидно, что чем выше частота ШИМ, тем менее она заметна для глаз.
  • Чем руководствуются изготовители, в одном случае выбирая частоту ШИМ например 120 Hz, а в другом 6 kHz оставим за рамками данной статьи.

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

ИМХО можно предположить, что при одинаковой рабочей яркости например 120 кд/м2, подсветка с частотой ШИМ 120 Hz и рабочей яркостью светодиодной подсветки 150 кд/м2 (коэффициент заполнения 80%) будет менее агрессивна для глаз, чем подсветка с частотой ШИМ 600 Hz и рабочей яркостью светодиодной подсветки 500 кд/м2 (коэффициент заполнения 25%).

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

Теперь несколько слов о

Flicker-Free


Казалось бы тут все предельно ясно. Любой лингвист, читающий Шекспира в подлиннике, скажет, что flicker-free это немерцающий, свободный от мерцания. Ну а раз нет мерцания, то и нет проблемы мерцанием от ШИМ.

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

Например wikipedia нам сообщает кучу общих слов о Flicker-free, что богатым и здоровым быть лучше, чем бедным и больным, и что свобода* лучше, чем несвобода* (*имеется в виду свобода от мерцания), при этом единственное имеющееся примечание идет на страничку о ШИМ, которую мы только что рассматривали. Никаких ссылок на внешние источники, например на отраслевые или международные стандарты. На wikipedia это совсем непохоже.

Причина этого в том, что общепризнанных стандартов по Flicker-Free до сих пор попросту нет. ВООБЩЕ НЕТ, Карл!

Ну, а На нет и суда нет(с), и каждый производитель вправе так называть все, что сочтет нужным, главное не забывать клеить соответствующий шильдик на видное место
Flicker-Free
Можно пойти ещё дальше, и сделать свою фирменную технологию свой фирменный шильдик, например Flicker-Safe.

Видимо имеется в виду, что с Flicker-Free просто нет мерцания, а с Flicker-Safe мерцания вообще нет. Любой каприз за ваши деньги ;-)
Flicker-Safe

При этом рабочий монитор как правило эксплуатируется при невысокой яркости, а отсутствие ШИМ мерцания подсветки может гарантироваться нормироваться в каком-то диапазоне, например 100%-70% от максимальной.

Иногда изготовитель это указывает, хотя обычно забывает это сделать.
Иногда об этом можно узнать из тестов и обзоров.
В качестве примера цитата из такого обзора:
Обзор 31,5-дюймового 4K-монитора Samsung U32J590UQI
Это единственная из известных на просторах Интернета полноценная 10-битная (без применения FRC) *VA-панель с диагональю 31,5 дюйма, разрешением 3840x2160 пикселей (стандарт 4K) и особой BGR-LED-подсветкой без мерцания (Flicker-free)
в диапазоне яркости 31-100 % ШИМ у U32J590uQI не используется, а при 0-30 % её частота составляет 250-260 Гц...
Если учесть, что максимальная яркость у этого монитора 225 кд/м2, а многие пользователи предпочитают выставлять на рабочем мониторе рабочую яркость менее 100 кд/м2, то уже на грани.

А если изготовитель забыл указать другой диапазон рабочей яркости без ШИМ, например если мерцание отсутствует только при 100% подсветке это Flicker-Free?
А если до 60%?
А до 30%? Впрочем, по поводу последнего мы уже знаем, что это Flicker-Free :-)

Частота ШИМ 10kHz это Flicker Free?
А 1kHz?
А 240Hz?
А 120Hz?

Коэффициент заполнения ШИМ 25% при 1 kHz и яркости менее 50% это Flicker Free?
А 50%?
А 90%? И даже если это только при 100% подсветке и 120Hz?

И вообще, Сколько орехов должно быть в куче?(c)

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

И в то же время отсутствие этой надписи на старом мониторе ни о чем не говорит, например если монитор появился на рынке еще до начала моды на шильдики Flicker-Free, то у него такого шильдика не будет, впрочем как и мерцания может не быть* (а может и быть).
  • Безусловно, свобода* лучше, чем несвобода* (*от мерцания подсветки), и при выборе монитора надпись Flicker-Free, Flicker-Safe и т.п. дает больше шансов, что монитор не будет мерцать, или будет, но не так сильно, как без такой надписи.

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

Как можно определить наличие ШИМ мерцания подсветки монитора


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

Но достаточно точно определить наличие ШИМ пульсации можно и подручными методами, без использования специального оборудования.

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

Некоторые люди могут достаточно точно определять наличие мерцания на глаз, даже без карандаша. Я, например могу увидеть ощутить мерцание до 100-150 Hz периферийным зрением. Для этого нужно встать сбоку от светящегося экрана так, чтобы экран был практически за пределами зрения, а впереди был более темный фон. Если при этом возникает ощущение, что глаза вываливаются и как бы сами поворачиваются в сторону экрана, то значит есть ШИМ с высокой скважностью и частотой до сотни герц. Конечно этот способ крайне субъективный и неточный, но иногда он может помочь, например на выставке или в торговом зале, когда более ничего недоступно.

Но ИМХО самый простой, объективный и весьма точный способ (вплоть до оценки частоты и скважности ШИМ) это тест с помощью любой фотокамеры с CMOS матрицей и электронным затвором.

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

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

Далее всё очень просто:
  • Если по изображению экрана монитора на дисплее смартфона бегут полосы, то значит его подсветка мерцает
  • Если изображение экрана монитора на дисплее смартфона без полос, то значит мерцания подсветки нет.
При желании можно сфотографировать экран монитора, тогда по фотографии можно оценить не только наличие или отсутствие мерцания подсветки, но и достаточно точно определить частоту ШИМ.

Samsung V32F390SIX 31.5 (2018)

Как это можно сделать я описывал в своей старой статье Метод самостоятельного определения времени отклика LCD экрана монитора или телевизора (статья посвящена определению времени отклика матрицы, но та же методика расчета годится и для определения частоты ШИМ его подсветки).

Ну а если при съемке экрана выставить минимально возможную выдержку (максимальное ISO), то помимо частоты ШИМ можно достаточно точно оценить и его скважность (коэффициент заполнения) по относительной ширине светлых и темных полос на снимке.
Чем короче будет выдержка, тем более четкими получатся границы полос на экране, и тем точнее будет определение скважности, ну а шум и другие артефакты в данном случае не важны.

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

Итак,

32" монитор-телевизор Samsung LT T32E310EX


Samsung LT T32E310EX

Несколько слов о причине, по которой был выбран 32" монитор-телевизор Samsung LT T32E310EX.

Тут всё просто на момент покупки в конце 2016 года это был единственный имеющийся в продаже 32" Full HD монитор*, который мне требовался, так что При всем богатстве выбора иной альтернативы не было (Рекламный слоган).
  • Правда был его сводный старший брат Smart-телевизор Samsung UE32J5500AU с такой же матрицей, но во первых Smart-TV функции мне были не нужны, а во вторых Samsung LT T32E310EX тогда позиционировался как монитор-телевизор (сейчас на сайте Samsung.ru эта страница протухла), а поскольку мне нужен был именно монитор, то я предпочел не рисковать, и взять именно его, а не чистый телевизор, рассчитывая, что свою титульную функцию монитор-телевизор будет выполнять лучше, чем просто телевизор.
    Хотя некоторые проблемы с его настройкой все-таки возникли, но их удалось успешно решить благодаря помощи зала.

Почему именно FullHD, а не 4k или хотя бы QHD (часто ошибочно называемый 2k)?

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

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

По поводу видимой пиксельной решетки FullHD процитирую себя с другого форума
Мониторы для чувствительных глаз (часть 2), #4702
...Samsung LT T32E310EX С рабочего расстояния порядка 55-65см (вытянутой руки) пиксель 0.36 вижу, но не замечаю*...
  • Eсли приглядываться, то на 32" экране 2k QHD я тоже могу разглядеть пиксельную решетку (впрочем, ее я тоже естественно не замечаю).


Также отмечу, что выбор Samsung LT T32E310EX для меня оказался насколько удачным, что после приобретения своего кабинетного рабоче-развлекательного монитора (о нем я уже писал на habr-е в обсуждении статьи Кабинет на квадратном метре, если будет интерес, то у меня есть материал на отдельную статью на эту тему) я приобрел еще два таких же монитора второй сейчас используется как телевизор в спальне, а третий взял в запас в начале пандемии (чёрт его знает, чем все закончится, да и мониторы эти исчезают из продажи, так что пусть пока полежит).
На этом мне бы хотелось закрыть данный вопрос в рамках этой статьи.

Итак, возвращаемся к теме статьи:

Мерцание LED подсветки экрана и как с этим бороться


Сразу после покупки Samsung LT T32E310EX выяснилось, что LED подсветка его экрана мерцает при настройке рабочей яркости 100-120 кд/м2 (ИМХО оптимальная яркость для рабочего кабинетного монитора), причем весьма заметно я это вижу чувствую боковым зрением (см. выше).

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

Впрочем, как я уже сказал выше, в данном случае это была не единственная проблема, вначале никак не удавалось разобраться с выводом изображения пиксель-в-пиксель (подробнее об этом в моей старой статье Тест для проверки цветового разрешения монитора или телевизора при подключении к компьютеру по цифровому видеоинтерфейсу)
444 vs 422

Я уже почти смирился с тем, что Samsung LT T32E310EX переедет в спальню в качестве телевизора, ну а к тому моменту, когда удалось решить проблему с интерфейсом, мне удалось разобраться и с ШИМ.

Поэтому сейчас монитор Samsung LT T32E310EX занял свое место на рабочем столе, а в спальню пришлось покупать еще один такой же телевизор Samsung LT T32E310EX :-)

work table

Как отказалось, у Samsung LT T32E310EX настройка режимов изображения несколько отличная от классической, идущей еще со времен CRT регулировки Яркости и Контраста.

В дополнение к регулировке Яркости и Контраста, здесь добавилась регулировка Подсветки.
picture

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

В данном же случае настройка Подсветка регулирует яркость подсветки (вполне логично),

Яркость управляет глубиной черного (так сказать, яркостью черного),
Brightness

а Контраст регулирует уровень белого (да, именно так!)
Contrast

Вначале немного непривычно, но потом становится чрезвычайно удобно, и уже кажется вполне логичным*
  • Подобная трехдвижковая настройка параметров изображения используется не только в Samsung LT T32E310EX, но и в других мониторах и телевизорах.
    Хотя названия параметров могут быть другими. Например это может быть Яркость, Контраст и Глубина чёрного. Главное, чтобы общие принципы сохранялись.

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

Более того, благодаря ИЛИ в данном случае как раз и появляется возможность устранить ШИМ мерцание подсветки при невысокой рабочей яркости экрана!

БИНГО!!!


Чтобы не снижать коэффициент заполнения ШИМ подсветки менее 85-95% (об этом чуть ниже), мы просто не будем уменьшать настройку Подсветка ниже 18-20 эээ попугаев (20 попугаев в данном случае её максимальное значение), а требуемую для офисной работы невысокую рабочую яркость экрана 100-125 кд/м2 получим за счет существенного уменьшения настройки Контраст.

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

Собственно говоря это все. Дальше

Настройка, тесты и замеры


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

Для измерений использовались:
Осциллограф DSO-SHELL (DSO150)
-
фотодиод BPW34 DIP-2
(банан карта microSD для масштаба)
-
Фотографии тестов и примечания к результатам под спойлером
Исходная информация тестов
Уровень подсветки
0-из-20
(минимальное значение),
Коэффициент заполнения ШИМ 14,3%
(поскольку при этом яркость экрана очень небольшая, то несмотря на ISO 800 выдержка получилась очень длинной 1/120 сек, поэтому полосы от ШИМ не видны)
Уровень подсветки
6-из-20,
Коэффициент заполнения ШИМ 37,3%
(выдержка 1/241 уже достаточно короткая, чтобы были заметны полосы от ШИМ)
Уровень подсветки
10-из-20,
Коэффициент заполнения ШИМ 53,5%
Уровень подсветки
15-из-20,
Коэффициент заполнения ШИМ 73,1%
Уровень подсветки
18-из-20,
Коэффициент заполнения ШИМ 84,5%
(на фото полосы еще заметны, но карандашный тест мерцания уже не фиксирует)
Уровень подсветки
20-из-20
(максимальное значение),
Коэффициент заполнения ШИМ 91,3%
(несмотря на коэффициент заполнения чуть менее 100% мерцания практически нет, полосы на фото незаметны даже при короткой выдержке 1/323сек, карандашный тест уверено проходится)

Краткие результаты теста:

  • Уровень подсветки 0-из-20 (минимальное значение),
    Коэффициент заполнения ШИМ 14,3%
  • Уровень подсветки 6-из-20, Коэффициент заполнения ШИМ 37,3%
  • Уровень подсветки 10-из-20, Коэффициент заполнения ШИМ 53,5%
  • Уровень подсветки 15-из-20, Коэффициент заполнения ШИМ 73,1%
  • Уровень подсветки 18-из-20, Коэффициент заполнения ШИМ 84,5%
  • Уровень подсветки 20-из-20 (максимальное значение),
    Коэффициент заполнения ШИМ 91,3%

ИМХО можно считать, что при максимальном уровне подсветки экран практически не мерцает, и дальнейшую регулировку монитора будем производить при Подсветке 20-из-20 (хотя и 18-из-20 с Коэффициентом заполнения 85% тоже наверное вполне приемлемо)

Для начала произведем настройку

Уровни черного


Эту настройку можно произвести например по тестовой картинке Black level на сайте www.lagom.nl или другим аналогичным тестовым страничкам*
  • Я настраивался по тестовой картинке Настройка уровней на сайте www.mehanik99.ru, но сейчас этот сайт не работает из-за смерти его автора Александра Соколова. Скорее всего этот сайт умер вместе с ним, но оставлю ссылки на него как мемориальные

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

Я ограничился хорошей различимостью Level 3 и видимостью на уровне ощущений Level 2*
  • Так получилось, что для моего экземпляра Samsung LT T32E310EX оптимальное значение регулировки Яркость совпало с его значением по умолчанию, равным 45 (т.е. у меня Уровень черного был идеально настроен из коробки), но на других экземплярах оптимальные значения конечно могут оказаться другими.

Black level

Еще фотографии настройки Black level здесь и здесь

После этого настраиваем рабочую

Яркость белого


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

Для рабочего монитора для снижения утомляемости глаз желательно иметь небольшое значение яркости белого поля порядка 100-150 кд/м2, некоторые пользователи предпочитают еще меньше до 80 кд/м2 и даже менее. Но тут уже все индивидуально.

При наличии калибратора с возможностью оперативного контроля ярости белого поля, можно было бы сразу выставить желаемую яркость, например 120 кд/м2. Поскольку у меня калибратора нет, пришлось это делать на глаз, проверяя получившееся значение с помощью online теста, например Contrast ratio test на сайте www.lagom.nl.

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

Теперь можно проверить получившееся значение яркости экрана с помощью вышеупомянутого Contrast ratio test, ну а заодно и проверить, насколько сильно мы потеряли Contrast ratio из-за Подсветки, выставленной на 20-из-20.

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

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

Я все-таки сумел сделать требуемый комплект фотографий, и смог получить полноценный замер
Contrast ratio results for Samsung LT T32E310EX:
  • Contrast ratio 764:1 (edge: 916:1)
  • White Luminance 126 cd/m2

ИМХО вполне удовлетворительный результат для рабочего монитора. Яркость экрана 126 кд/м2 в рекомендуемых пределах, ну и не слишком большая потеря Contrast ratio из-за максимальной Подсветки.

Итого оптимальная рабочая настройка для моего экземпляра монитора Samsung LT T32E310EX:
  • Подсветка 20-из-20
  • Контраст 63%
  • Яркость 45%


Поставленная задача решена

Удалось добиться удовлетворительного значения рабочей яркости экрана при отсутствии мерцания его подсветки.

Осталось лишь проверить настройку

Уровни белого


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

Потребуется лишь вывести изображение теста, и убедиться, что все уровни белого вплоть до Level 254 хорошо различимы.
White saturation

На этом грубую настойку монитора можно считать законченной, и нам остается посмотреть и при необходимости подрегулировать Баланс белого, Резкость, Gamma, Gamma Shift, ColourShift и другие параметры и тонкие настройки.
Впрочем, Это уже совсем другая история, выходящая за рамки этой статьи.
Ну и в заключении ложка дегтя, которая может оказаться в бочке мёда некоторых мониторов с описываемой в статье тройной регулировкой параметров изображения Яркость / Контраст / Подсветка, а также ложка мёда, которая может хорошо подсластить некоторые мониторы с мерцающей подсветкой и с классической двойной регулировкой Яркость / Контраст.

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

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

К сожалению оказалось, у него подсветка мерцает в т.ч. и при максимальном значении сответствующей настройки.
Samsung V32F390SIX 31.5 (2018)

Не представляю, какое тут может быть рациональное объяснение.

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

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

Правда у этого монитора есть еще вход Display Port, но у меня все источники сигнала только HDMI или DVI выходами, а переходников с HDMI на DP не существует (бывают переходники с DP на HDMI, но в данном случае они бесполезны).

Интересно, что раньше и Samsung LT T32E310EX, и Samsung V32F390SIX на сайте Samsung.ru обозначались, как монитор-телевизоры, да и маркировка у них мониторная, то сейчас на их сайте они обозначаются как просто телевизоры (вопреки собственно маркировке).

В общем маркетологи Samsung такие маркетологи

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

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

Тут тоже важно не запутаться, что и куда двигать.

Для этого ИМХО стоит открыть в браузере упомянутые выше странички тестов Black level и White saturation, и в процессе изменения настройки следить, чтобы при этом не терялись максимальные и минимальные уровни черного и белого.

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

Надо иметь в виду, что при таком способе регулировки мы расплачиваемся не только снижением Contrast ratio, как при предыдущем способе, но и теряем часть яркостного диапазона HDMI интерфейса, поэтому по возможности ИМХО лучше все же использовать способ с настройками монитора, а не драйвера.
В заключении

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


Но к сожалению за все приходится платить, и как сказала Фаина Раневская Всё приятное в этом мире либо вредно, либо аморально, либо ведет к ожирению

Необходимо упомянуть и о нескольких побочных явлениях, недостатках данного способа отключения мерцания:
  • Существенное снижение Contrast ratio монитора на рабочем режиме.
    Это ИМХО главный недостаток подобного способа борьбы мерцанием.
    Тут мне нечего возразить, я об этом уже несколько раз говорил выше.
    Например для моего монитора Samsung LT T32E310EX измеренные с помощью Contrast ratio test значения Т.е. выигрыш по уменьшению рабочей яркости практически равен потере Contrast ratio. Что в общем-то неудивительно подсветка в обоих случаях одинаковая (максимальная), глубина чёрного соответственно тоже, а белый во втором случае существенно притушен, и как следствие снижение динамического диапазона и потеря Contrast ratio.
    Это может быть особенно заметно, если у Вас монитор с изначально невысоким Contrast ratio, например 700:1 (некоторые типы IPS матриц), тогда в результате мы получим Contrast ratio всего около 300:1
    Допустимо ли это решать только Вам.
  • Ускоренная деградация LED светодиодов подсветки.
    При обсуждении меня периодически об этом спрашивают.
    Гм Не знаю Может быть
    С одной стороны изготовитель вроде не запрещает включение подсветки на 20-из-20, да и при настройке из коробки она включена почти на полную (ЕМНИП на 17-из-20), но с другой стороны любые девайсы при высокой нагрузке изнашиваются больше, чем при малой. Это относится и к процессорам, и к SSD, и к автомобилям, и к утюгам, ну и к светодиодам тоже.
    Другое дело насколько существенным будет снижение ресурса, и повлияет ли как-то на время эксплуатации. Не могу сказать
    Хотя на своем мониторе около года начал замечать, что в паре мест несколько увеличилась неравномерность заливки белым. Пока это видно только на сплошной заливке, и например в браузере или документе с текстом это практически незаметно. В этом мониторе используется задняя подсветка, и похоже, что парочка светодиодов несколько деградировала. Связано ли это с максимальной подсветкой не могу сказать. Во всяком случае на втором таком же мониторе, купленном менее чем через полгода после первого пока подсветка такая же равномерная, как и была вначале (тьфу^3), так что возможно попался такой экземпляр (хотя 5 лет..., 12+ часов в день...).
    В общем пока попробовал снизить уровень подсветки до 18-из-20 (коэффициент заполнения ШИМ 85%), неравномерность заливки за год вроде бы не увеличивалась, для глаз вроде тоже нормально.
  • Увеличенный расход электроэнергии
    Об этом меня тоже периодически спрашивают.
    Ну, давайте прикинем:
    У Samsung LT T32E310EX максимальная потребляемая мощность 69 Ватт.
    Предположим, что из них 50 Ватт потребляет подсветка, а 19 Ватт вся остальная электроника.
    Если бы мы включили подсветку монитора не на 20-из-20, а допустим на 10-из-20 (половину мощности), то мы бы сэкономили 25 Ватт потребляемой мощности.
    За год в режиме 12/365 (~4000 часов) получим лишнее потребление 100 кВтч или около 500 рублей.
    Много это или мало судить вам (тем более что для вашего монитора цифры наверняка будут другими).
    Ну а сколько было сожжено тонн баррелей нефти, и уничтожено сотен гектаров леса оставим Грете Тумберг.
    .$. У меня вместе с монитором и компьютером (который кстати тоже потребляет энергию) автоматичеки включается 10-ваттная лампа задней подсветки стены за рабочим местом, дополнительная 5-ваттная USB LED-лента на на верхней кромке монитора для дополнительного освещения стены, а также 10-ваттная лампа сверху чуть правее головы для освещения клавиатуры и рабочего места. Слева окно с жалюзи и еще одна лампа, включаемая вручную при необходимости. Ну и общее комнатное освещение пять 10-ваттных ламп.
    Ужас-ужас Только Грете Тумберг об этом не говорите...

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

.$.

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

Это безусловно заслуживает отдельного разговора.

Но это уже совсем другая история...
Подробнее..

PXE-мультитул на базе Raspberry Pi

08.05.2021 12:05:15 | Автор: admin

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

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

В чем сложность


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

Проблема в том, что у каждого вендора свои собственные методы и собственные утилиты для обновления прошивок. Причем, не все они способны корректно работать под Linux. Какие-то компоненты, например, BIOS у серверов SuperMicro желательно шить из-под MS-DOS. Для каких-то компонентов, например, сетевых карт Mellanox в некоторых случаях нужно использовать Windows, а некоторые поддерживают прошивку непосредственно из Linux.

Таким образом нам нужно будет либо собирать мультизагрузочный образ и записать его на несколько десятков флешек, затем долго и упорно загружаться с них, либо придумать нечто более интересное и быстрое. И вот здесь приходит на ум использование сетевых карт серверов с поддержкой загрузки по PXE (Preboot eXecution Environment, произносится как пикси).

Берем малинку, разворачиваем там DHCP- и TFTP-сервер, готовим требуемые образы для загрузки. Чтобы массово загрузить несколько десятков серверов просто временно задействуем неуправляемый гигабитный свитч на 48 портов и вуаля. По-умолчанию большинство серверов возможность загрузки с PXE предусматривают без дополнительной настройки, поэтому такой вариант идеален.

За основу я взял прекрасную статью от Romanenko_Eugene, но с поправками на особенности Raspberry Pi и решаемые задачи. Приступаем!

Малиновое варенье


Когда я первый раз проделывал такое самой продвинутой версией Raspberry Pi была третья с сетевой картой на 100 Мбит/с. Этого откровенно говоря мало для массовой раздачи тяжелых образов, так что настоятельно рекомендую использовать доступную ныне Raspberry Pi 4 с портом на 1 Гбит/с. Еще одна рекомендация по возможности использовать быструю и емкую карту памяти.

Теперь о первоначальной настройке. Графический интерфейс для такой штуки абсолютно не требуется, поэтому можно скачать самую простую Lite-версию операционной системы Raspberry Pi OS. Распаковываем образ и заливаем образ на MicroSD-карту любым удобным способом, например с помощью dd:

sudo dd if=<имя_образа> of=/dev/mmcblk0 bs=1M

В процессе настройки можно либо настраивать традиционным способом, подключив клавиатуру и монитор, либо через SSH. Чтобы при запуске SSH-сервис заработал, создаем пустой файл с именем ssh в разделе /boot.

Поскольку сетевой порт будет задействован для работы DHCP, то для доступа в интернет можно либо использовать подключение к Wi-Fi, либо подключить к малинке еще одну сетевую карту по USB. Вот такую, например:


Теперь запускаем Raspberry Pi, подключаем ее к интернету и обновляем репозитории и пакеты ПО:

sudo apt update

sudo apt upgrade

Поскольку я задействую еще одну сетевую карту, то встроенной надо задать статический IP-адрес. Открываем конфиг:

sudo nano /etc/dhcpcd.conf

Добавляем следующие строчки:

interface eth0static ip_address=192.168.50.1/24

Здесь eth0 встроенная сетевая карта Raspberry Pi. Именно с помощью нее будет осуществляться и раздача IP-адресов, и сетевая загрузка. Теперь устанавливаем tftp-сервер:

sudo apt install tftpd-hpa

После установки открываем конфигурационный файл:

sudo nano /etc/default/tftpd-hpa

Приводим строку к следующему виду:

TFTP_OPTIONS="--secure -l -v -r blksize"

В целом можно было бы и оставить все как есть, но тестировать каждый раз на отдельной машине иногда не слишком удобно. Опции -l -v -r blksize позволяют без проблем тестировать все это на виртуальной машине VirtualBox, исправляя некоторую проблему совместимости. Теперь устанавливаем DHCP-сервер для раздачи IP-адресов:

sudo apt install isc-dhcp-server

Открываем первый конфигурационный файл isc-dhcp-server:

sudo nano /etc/default/isc-dhcp-server

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

INTERFACESv4="eth0"

Теперь открываем второй конфиг dhcpd.conf:

sudo nano /etc/dhcp/dhcpd.conf

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

default-lease-time 600;max-lease-time 7200;ddns-update-style none;authoritative;subnet 192.168.50.0 netmask 255.255.255.0 {        range 192.168.50.2 192.168.50.250;        option broadcast-address 192.168.50.255;        option routers 192.168.50.1;        filename "pxelinux.0";}

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

wget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-5.01.zip

Распаковываем:

unzip syslinux-5.01.zip

Теперь нам надо найти и извлечь модуль memdisk, умеющий подгружать в ОЗУ ISO-образы целиком, загрузчик pxelinux.0 и остальные модули comboot. Последовательно выполняем команды, которые отыщут и скопируют все найденное в директорию /srv/tftp:

find ./ -name "memdisk" -type f|xargs -I {} sudo cp '{}' /srv/tftp/

find ./ -name "pxelinux.0"|xargs -I {} sudo cp '{}' /srv/tftp/

find ./ -name "*.c32"|xargs -I {} sudo cp '{}' /srv/tftp/

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

cd /srv/tftp

Создаем директорию с именем pxelinux.cfg и переходим в нее:

sudo mkdir pxelinux.cfg

cd pxelinux.cfg

Создаем конфигурационный файл:

sudo nano default

В качестве примера давайте возьмем отличный live-дистрибутив GRML и загрузим его через PXE. Ниже готовый пример конфигурации:

UI vesamenu.c32                  PROMPT 0MENU TITLE Raspberry Pi PXE ServerMENU BACKGROUND bg.pngLABEL bootlocal   menu label Boot from HDD   kernel chain.c32   append hd0 0   timeout 0TEXT HELPBoot from first HDD in your systemENDTEXTLABEL grml   menu label GRML LinuxKERNEL grml/boot/grml32full/vmlinuzAPPEND root=/dev/nfs rw nfsroot=192.168.50.1:/srv/tftp/grml/ live-media-path=/live/grml32-full boot=live lang=us nomce apm=power-off noprompt noeject initrd=grml/boot/grml32full/initrd.img vga=791LABEL reboot    menu label Reboot    kernel reboot.c32TEXT HELPReboot serverENDTEXT

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

  • UI vesamenu.c32 используем модуль vesamenu.c32 для вывода меню;
  • PROMPT 0 подсвечиваем нулевой пункт меню;
  • MENU TITLE Raspberry Pi PXE Server задаем общее название меню;
  • MENU BACKGROUND bg.png элемент оформления, используем bg.png в качестве фонового изображения.

Фоновое изображение можно изготовить заранее. По-умолчанию подойдет картинка 640x480 с глубиной цвета не более 24 бит, в формате PNG или JPG. Ее надо заранее скопировать в /srv/tftp. Теперь разберем каждую секцию. Первая секция введена для удобства. Если надо загрузится с первого жесткого диска, то прописываем:

  • LABEL bootlocal внутреннее имя секции;
  • menu label Boot from HDD то, как будет отображено меню у пользователя;
  • kernel chain.c32 используем модуль chain.c32, умеющий выполнять загрузку с различных носителей;
  • append hd0 0 явным образом указываем, что загрузка должна быть с первого раздела первого жесткого диска;
  • timeout 0 тут можно либо задать таймаут в секундах, по истечении которого будет автоматически запущена загрузка, либо указав 0 убрать таймер.
  • TEXT HELP указываем начало текста подсказки для пользователя;
  • Boot from first HDD in your system текст подсказки;
  • ENDTEXT указываем конец текста подсказки.

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

Everything is a file


Сам ISO-образ доступен на сайте этого live-дистрибутива. Скачиваем его и переименовываем для удобства, в примере возьмем 32-битную версию:

wget https://download.grml.org/grml32-full_2020.06.iso

mv grml32-full_2020.06.iso grml.iso

Теперь надо этот образ каким-то образом заставить загружаться. С одной стороны можно применить модуль memdisk и заставить его вначале загрузить все сырое содержимое образа непосредственно в ОЗУ и потом передать управление загрузкой. Но этот метод хорош только для очень маленьких образов, например, так удобно загружать MS-DOS. Большие же образы долго загружаются в память и не всегда работают адекватно.

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

Выполняется элементарно:

sudo apt install nfs-kernel-server

Чтобы не устраивать кашу из файлов создаем отдельную директорию для grml:

sudo mkdir /srv/tftp/grml

Нам потребуется примонтировать ISO-образ, поэтому позаботимся о временной точке монтирования:

sudo mkdir /tmp/iso

Монтируем образ. Система предупредит, что образ смонтирован в Read-Only режиме:

sudo mount -o loop grml.iso /tmp/iso

Рекурсивно копируем содержимое образа в нашу отдельную директорию:

sudo cp -R /tmp/iso/* /srv/tftp/grml

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

sudo chown -R nobody:nogroup /srv/tftp/grml/

sudo chmod -R 777 /srv/tftp/grml/

Теперь дело за малым указать NFS-серверу, что ему следует предоставлять директорию /srv/tftp/grml любому IP-адресу из нашей подсети:

sudo nano /etc/exports

Прописываем строчку:

/srv/tftp/grml 192.168.50.0/24(rw,sync,no_subtree_check)

Обновляем список и рестартуем NFS-сервер:

sudo exportfs -a

sudo systemctl restart nfs-kernel-server

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

  • LABEL grml имя секции;
  • menu label GRML Linux отображение в меню;
  • KERNEL grml/boot/grml32full/vmlinuz указываем путь до ядра, относительно корня /srv/tftp;
  • APPEND root=/dev/nfs rw nfsroot=192.168.50.1:/srv/tftp/grml/ live-media-path=/live/grml32-full boot=live lang=us nomce apm=power-off noprompt noeject initrd=grml/boot/grml32full/initrd.img vga=791 тут мы говорим, что используем NFS, прописываем пути к условному корню, задаем некоторые дополнительные параметры, рекомендуемые в документации и указываем относительный путь до initrd.

Теперь остается только последовательно запустить TFTP и DHCP-сервер и можно пробовать выполнять загрузку в PXE. Если все сделано правильно, то вы увидите созданное меню:


Выбрав пункт GRML Linux нажимаем Enter и видим, что у нас происходит успешный процесс загрузки образа:


Таким образом мы получили возможность сетевой загрузки популярного среди системных администраторов дистрибутива GRML. Но что насчет того же самого MS-DOS и как можно самостоятельно подготовить образ для перепрошивки BIOS. Об этом поговорим дальше.

In DOS We Trust


Неужели в 21 веке все еще используется операционная система из 80-х годов прошлого тысячелетия. Каким бы странным это не казалось но для некоторых специфичных задач MS-DOS по прежнему актуальна и вполне себе находит применение. Одной из таких задач является обновления прошивки BIOS на серверах.

Возьмем для примера какую-нибудь материнскую плату, например, Supemicro X11SSL-F и скачаем обновление BIOS с официального сайта. Внутри видим приблизительно подобный набор файлов:

user@linux:~/Загрузки/X11SSLF0_B26> ls -lитого 16592-rw-r--r-- 1 user users   169120 фев  1  2015 AFUDOSU.SMC-rw-r--r-- 1 user users     5219 сен 20  2003 CHOICE.SMC-rw-r--r-- 1 user users    22092 апр 27  2014 FDT.smc-rw-r--r-- 1 user users     3799 дек 15  2016 FLASH.BAT-rw-r--r-- 1 user users     3739 мая 22  2019 Readme for UP X11 AMI  BIOS.txt-rw-r--r-- 1 user users 16777216 ноя 25 23:48 X11SSLF0.B26

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

Прежде всего нам надо подготовить небольшой raw-образ жесткого диска с операционной системой. Создаем новую виртуальную машину через Oracle VM VirtualBox с небольшим диском на 32 мегабайта. Формат выбираем QCOW, после всех манипуляций его можно будет легко сконвертировать в raw.

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


Дважды меняем образы дискет в виртуальном приводе и спустя буквально 20 секунд у нас есть qcow-образ со свеженькой ОС MS-DOS 6.22:


Самым простым способом теперь скопировать файлы на данный диск будет примонтировать его к любой другой виртуальной машине с Windows или Linux. После этой операции повторно монтируем диск к виртуальной машине с MS-DOS и проверяем, что файлы видны:


При желании можно даже настроить автозагрузку на выполнение BAT-файла, чтобы перепрошивка BIOS производилась автоматически. Но помните, что это потенциально опасная операция и делаете вы ее на свой страх и риск. Теперь выключаем виртуальную машину и переконвертируем ее в raw-образ с помощью qemu-img.

qemu-img convert -f qcow -O raw DOS.qcow dos.img

Полученный IMG-образ копируем в отдельную директорию нашего TFTP-сервера:

sudo mkdir /srv/tftp/dos

sudo cp dos.img /srv/tftp/dos

Теперь открываем конфигурацию /srv/tftp/pxelinux.cfg/default на редактирование и добавляем в меню еще один пункт:

LABEL DOS        kernel memdisk        initrd dos/dos.img        append raw

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


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

In Windows Veritas


Давайте теперь попробуем загрузить Live-образ c WinPE (Windows Preinstallation Environment). Загружать полноценный вариант часто просто не требуется, достаточно лишь ограниченного количества функций. Реальное применение эта штука находит при перепрошивке некоторых устройств.

Та же самая Mellanox, год назад поглощенная Nvidia, выпускает утилиту Mellanox Firmware Tools для перепрошивки своих сетевых карт в вариантах для WinPE различных версий. Разумеется сейчас доступны уже различные варианты MFT, но пару раз мы сталкивались именно с необходимостью шить через WinPE-версию.

Создание своего собственного образа WinPE и интеграция нужного ПО туда задача не слишком сложная, но ее объяснение выходит за рамки данной статьи. Чтобы детально освоить этот процесс можно посетить отличный ресурс winpe.ru. Мы же для примера возьмем какую-либо готовую сборку для демонстрации процесса запуска.

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

wimboot достаточно простой загрузчик, умеющий выполнять загрузку образов в формате wim (Windows Imaging Format). Его можно использовать либо в связке с syslinux, либо с более продвинутым собратом, iPXE. Создаем отдельную директорию в /srv/tftp:

sudo mkdir wimboot

cd wimboot

Cкачиваем сам загрузчик:

wget https://github.com/ipxe/wimboot/releases/latest/download/wimboot

Теперь пришло время подмонтировать образ. Создадим временную директорию в /tmp:

sudo mkdir winpe

Переходим в каталог со скачанным ISO-образом сборки и выполняем:

sudo mount -o loop <имя_образа> /tmp/winpe

Создаем директорию в /srv/tftp, куда положим нужные нам файлы:

sudo mkdir /srv/tftp/winpe

Теперь ищем в сборке и копируем 4 файла:

sudo cp BOOTMGR /srv/tftp/winpe

sudo cp bcd /srv/tftp/winpe

sudo cp boot.sdi /srv/tftp/winpe

sudo cp boot.wim /srv/tftp/winpe

Дело за малым в конфигурационный файл /srv/tftp/pxelinux.cfg/default дописываем следующую секцию:

LABEL WinPE        menu label WinPE        com32 linux.c32 wimboot/wimboot        append initrdfile=winpe/BOOTMGR,winpe/bcd,winpe/boot.sdi,winpe/boot.wim

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


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


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


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

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

Подробнее..

Статический анализ от знакомства до интеграции

06.08.2020 18:12:42 | Автор: admin
Устав от нескончаемого code review или отладки, временами задумываешься, как бы упростить себе жизнь. И немного поискав, ну или случайно наткнувшись, можно увидеть волшебное словосочетание: "Статический анализ". Давайте посмотрим, что это такое и как он может взаимодействовать с вашим проектом.

Evolution

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

issues

В этом выводе мы видим, что переменная var так и не была использована нигде в функции. Так что на самом деле вы почти всегда пользовались простеньким статическим анализатором кода. Однако, в отличие от профессиональных анализаторов, таких как Coverity, Klocwork или PVS-Studio, предоставляемые компилятором предупреждения могут указывать только на небольшой спектр проблем.

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

Зачем нужен статический анализ?


В двух словах: ускорение и упрощение.

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

auto x = obj.x;auto y = obj.y;auto z = obj.z;

Вы написали следующий код:

auto x = obj.x;auto y = obj.y;auto z = obj.x;

Как видите, в последней строке появилась опечатка. Например, PVS-Studio выдаёт следующее предупреждение:

V537 Consider reviewing the correctness of 'y' item's usage.

Если хотите потыкать в эту ошибку руками, то попробуйте готовый пример на Compiler Explorer: *клик*.

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

Однако это явная ошибка. А если разработчик написал неоптимальный код из-за того, что позабыл какую-либо тонкость языка? Или же вовсе допустил в коде undefined behavior? К сожалению, подобные случаи совершенно обыденны и львиная часть времени тратится на то, чтобы отладить специфично работающий код, который содержит опечатки, типичные ошибки или undefined behavior.

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

Больше интересных ошибок, которые может обнаружить анализатор, вы можете найти в статьях:


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

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

0. Знакомство с инструментом


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

Что вы узнаете на этом этапе:

  • Какие есть способы взаимодействия с анализатором;
  • Совместим ли анализатор с вашей средой разработки;
  • Какие проблемы есть сейчас в ваших проектах.

После того, как вы установили себе всё необходимое, то первым делом стоит запустить анализ всего проекта (Windows, Linux, macOS). В случае с PVS-Studio в Visual Studio вы увидите подобную картину (кликабельно):

list

Дело в том, что обычно на проекты с большой кодовой базой статические анализаторы выдают огромное количество предупреждений. Нет необходимости исправлять их все, так как ваш проект уже работает, а значит эти проблемы не являются критичными. Однако вы можете посмотреть на самые интересные предупреждения и исправить их при необходимости. Для этого нужно отфильтровать вывод и оставить только наиболее достоверные сообщения. В плагине PVS-Studio для Visual Studio это делается фильтрацией по уровням и категориям ошибок. Для наиболее точного вывода оставьте включёнными только High и General (тоже кликабельно):

list

Действительно, 178 предупреждений просмотреть значительно проще, чем несколько тысяч

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

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

1. Автоматизация


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

Что вы узнаете на данном этапе:

  • Какие варианты автоматизации предоставляет инструмент;
  • Совместим ли анализатор с вашей сборочной системой.

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

А теперь приступим к сервисам непрерывной интеграции (CI). Любой анализатор можно внедрить в них без каких-либо серьезных проблем. Для этого нужно создать отдельный этап в pipeline, который обычно находится после сборки и юнит-тестов. Делается это при помощи различных консольных утилит. Например, PVS-Studio предоставляет следующие утилиты:


Для интеграции анализа в CI нужно сделать три вещи:

  • Установить анализатор;
  • Запустить анализ;
  • Доставить результаты.

Например, для установки PVS-Studio на Linux (Debian-base) нужно выполнить следующие команды:

wget -q -O - https://files.viva64.com/etc/pubkey.txt \    | sudo apt-key add -sudo wget -O /etc/apt/sources.list.d/viva64.list \  https://files.viva64.com/etc/viva64.list  sudo apt-get update -qqsudo apt-get install -qq pvs-studio

В системах под управлением Windows отсутствует возможность установить анализатор из пакетного менеджера, однако есть возможность развернуть анализатор из командной строки:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes /norestart /nocloseapplications

Подробнее о развёртывании PVS-Studio в системах под управлением Windows можно почитать *тут*.

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

Так как способ запуска зависит от платформы и особенностей проекта, я покажу вариант для C++ (Linux) в качестве примера:

pvs-studio-analyzer analyze -j8 \                            -o PVS-Studio.logplog-converter -t errorfile PVS-Studio.log --cerr -w

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

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

Подробнее про настройку анализа на CI можно прочитать в статье "PVS-Studio и Continuous Integration" (Windows) или "Как настроить PVS-Studio в Travis CI" (Linux).

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

В целом настройка анализа pull request'а не сильно отличается от обычного запуска анализа на CI. За исключением необходимости получить список изменённых файлов. Обычно их можно получить, запросив разницу между ветками при помощи git:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Теперь нужно передать анализатору на вход этот список файлов. Например, в PVS-Studio это реализовано при помощи флага -S:

pvs-studio-analyzer analyze -j8 \                            -o PVS-Studio.log \                            -S .pvs-pr.list

Подробнее про анализ pull request'ов можно узнать *тут*. Даже если вашего CI нет в списке указанных в статье сервисов, вам будет полезен общий раздел, посвященный теории этого типа анализа.

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

Это всё безусловно хорошо, однако хотелось бы иметь возможность посмотреть все предупреждения в одном месте. Не только от статического анализатора, но и от юнит-тестов или от динамического анализатора. Для это существуют различные сервисы и плагины. PVS-Studio, например, имеет плагин для интеграции в SonarQube.

2. Интеграция на машины разработчиков


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

Как самый простой вариант разработчики сами могут установить необходимый анализатор. Однако это займёт много времени и отвлечёт их от разработки, поэтому вы можете автоматизировать этот процесс, используя установщик и нужные флаги. Для PVS-Studio есть различные флаги для автоматизированной установки. Впрочем, всегда есть пакетные менеджеры, например, Chocolatey (Windows), Homebrew (macOS) или десятки вариантов для Linux.

Затем нужно будет установить необходимые плагины, например, для Visual Studio, IDEA, Rider etc.

3. Ежедневное использование


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

В случае, если анализатор обнаружит в недавно измененном коде проблемы, то сообщит об этом самостоятельно. Например, PVS-Studio скажет вам об этом при помощи оповещения:

notification

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


Подобные статьи дают всю необходимую для повседневного использования информацию и не отнимают много времени. :)

Ещё на этапе знакомства с инструментом мы подавили очень много предупреждений во время одного из первых запусков. Увы, но статические анализаторы не идеальны, поэтому время от времени выдают ложные срабатывания. Подавить их обычно легко, например в плагине PVS-Studio для Visual Studio достаточно нажать на одну кнопку:

suppress

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

После интеграции


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

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

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



Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Maxim Zvyagintsev. Static Analysis: From Getting Started to Integration.
Подробнее..

Перевод SRE Анализ производительности. Способ настройки с использованием простого вебсервера на Go

02.08.2020 22:16:32 | Автор: admin

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


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


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



Стратегия


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


  • Определяем границы оптимизации (требования);
  • Рассчитываем транзакционную нагрузку для системы;
  • Выполняем тест (создаем данные);
  • Наблюдаем;
  • Анализируем все ли требования соблюдаются?
  • Настраиваем по-научному, делаем гипотезу;
  • Выполняем эксперимент для проверки этой гипотезы.


Архитектура простого сервера HTTP


Для этой статьи мы будем использоват маленький сервер HTTP на Golang. Весь код из этой статьи можно найти здесь.


Анализируемое приложение HTTP-сервер, который опрашивает Postgresql на каждый запрос. Дополнительно есть Prometheus, node_exporter и Grafana для сбора и отображения метрик приложения и системы.



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



Определяем цели


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


В Google SRE Book подробно рассмотрены способы выбора и моделирование. Поступим так же, построим модели:


  • Задержка: 99% запросов должны выполнятся меньше чем за 60мс;
  • Стоимость: сервис должен потреблять минимальную сумму денег, которая нам покажется разумно возможной. Для этого максимизируем пропускную способность;
  • Планирование мощностей: требуется понимание и документирование того, сколько экземпляров приложения потребуется запустить, включая общую функцию масштабирования, а также сколько экземпляров потребуется для удовлетворения начальных требований по нагрузке и обеспечению избыточности n+1.

Задержка может потребовать оптимизации в довесок к анализу, но пропускную способность явно надо проанализировать. При использовании процесса SRE SLO требование о задержке исходит от клиента и\или бизнеса, представленных владельцем продукта. И наш сервис будет выполнять это обязательство с самого начала без каких-либо настроек!


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


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


Транзакционная нагрузка


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


$ make load-test LOAD_TEST_RATE=50echo "POST http://localhost:8080" | vegeta attack -body tests/fixtures/age_no_match.json -rate=50 -duration=0 | tee results.bin | vegeta report

Наблюдение


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


Профилирование


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



Эти данные можно использовать во время анализа, чтобы получить представление о бесполезно потраченном процессорном времени и выполняемой ненужной работе. Go (pprof) может генерировать профили и визуализировать их в виде flame graph, используя стандартный набор инструментов. Я расскажу об их использовании и руководстве по настройке чуть ниже в статье.


Выполнение, наблюдение, анализ.


Проведём эксперимент. Мы будем выполнять, наблюдать и анализировать, пока производительность нас не устроит. Выберем произвольно низкую величину нагрузки, чтобы применить её для получения результатов первых наблюдений. На каждом последующем шаге будем увеличивать нагрузку с некоторым коэффициентом масштабирования, выбранным с некоторым разбросом. Каждый запуск нагрузочного тестирования выполняется с регулировкой числа запросов: make load-test LOAD_TEST_RATE=X.


50 запросов в секунду



Обратите внимание на два верхних графика. Верхний левый показывает, что наше приложение обрабатывает 50 запросов в секунду (по его мнению), а верхний правый продолжительность каждого запроса. Оба параметра помогают нам смотреть и анализировать: влезаем ли в наши границы производительности или нет. Красная линия на графике HTTP Request Latency показывает SLO в 60мс. По линии видно, что мы намного ниже нашего максимального времени ответа.


Посмотрим со стороны стоимости:


10000 запросов в секунду / на 50 запросов на сервер = 200 серверов + 1


Мы все еще можем улучшить этот показатель.


500 запросов в секунду


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



Опять же на левом верхнем графике видно, что приложение фиксирует обычную нагрузку. Если это не так есть проблема на сервере, на котором запущено приложение. График с задержкой ответа расположен сверху справа, показывает, что 500 запросов в секунду привели к задержке ответа в 25-40мс. 99 перцентиль все еще шикарно влезает в SLO 60мс, выбранный выше.


С точки зрения стоимости:


10000 запросов в секунду / на 500 запросов на сервер = 20 серверов + 1


Все еще можно улучшить.


1000 запросов в секунду



Отличный запуск! Приложение показывает, что обработало 1000 запросов в секунду, однако граница по задержке была нарушена со стороны SLO. Это видно по линии p99 на верхнем правом графике. Несмотря на то, что линия p100 намного выше, реальные задержки выше максимума в 60мс. Давайте нырнем в профилирование, чтобы узнать, что на самом деле делает приложение.


Профилирование


Для профилирования мы ставим нагрузку в 1000 запросов в секунду, затем используем pprof для снятия данных, чтобы узнать, где приложение тратит процессорное время. Это можно сделать активируя HTTP endpoint pprof, после чего при нагрузке сохранить результаты с помощью curl:


$ curl http://localhost:8080/debug/pprof/profile?seconds=29 > cpu.1000_reqs_sec_no_optimizations.prof

Результаты могут быть отображены так:


$ go tool pprof -http=:12345 cpu.1000_reqs_sec_no_optimizations.prof


График показывает, где и сколько приложение тратит процессорного времени. Из описания от Brendan Gregg:


По оси X заполнение профиля стека, отсортированное в алфавитном порядке (это не время), ось Y показывает глубину стека, считая от нуля в [top]. Каждый прямоугольник кадр стека. Чем шире кадр тем чаще она присутствует в стеках. То что сверху работает на CPU, а ниже дочерние элементы. Цвета, как правило, не означают ничего, а просто выбираются случайным образом для различения кадров.

Анализ гипотеза


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


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



Если навести курсор на имя функции на графике отобразится общее время, сколько она была в стеке во время отладки. Функция HTTPServe находилась там 65% времени, другие функции runtime, runtime.mcall, mstart и gc, заняли остальное время. Интересный факт: 5% общего времени потрачено на запросы в DNS:



Адреса, которые программа ищет, принадлежат Postgresql. Щелкаем по FindByAge:



Занятно, программа показывает, что в принципе есть три основных источника, которые добавляют задержки: открытие\закрытие соединений, запрос данных и соединение с базой. На графике видно, что запросы в DNS, открытие и закрытие соединений занимают порядка 13% всего времени выполнения.


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


Настройка приложения эксперимент


Обновляем исходный код, пробуем убрать соединение с Postgresql на каждый запрос. Первый вариант использование пула соединений на уровне приложения. В этом эксперименте мы настроим пул соединений с помощью драйвера sql для go:


db, err := sql.Open("postgres", dbConnectionString)db.SetMaxOpenConns(8)if err != nil {   return nil, err}

Выполнение, наблюдение, анализ


После перезапуска теста с 1000 запросами в секунду видно, что p99 по задержкам пришел в норму со SLO 60мс!


Что по стоимости?


10000 запросов в секунду / на 1000 запросов на сервер = 10 серверов + 1


Давайте сделаем еще лучше!


2000 запросов в секунду



Удвоение нагрузки показывает то же самое, левый верхний график демонстрирует, что приложение успевает отработать 2000 запросов за секунду, p100 ниже чем 60мс, p99 удовлетворяет SLO.


С точки зрения стоимости:


10000 запросов в секунду / на 2000 запросов на сервер = 5 серверов + 1


3000 запросов в секунду



Здесь приложение может обработать 3000 запросов с задержкой p99 меньше 60мс. SLO не нарушается, а стоимость принята так:


10000 запросов в секунду / на 3000 запросов на сервер = 4 сервера + 1 (автор округлил до большего, прим. переводчика)


Давайте попробуем еще один раунд анализа.


Анализ гипотеза


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



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


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


Настройка приложения эксперимент


Пробуем установить MaxIdleConns равным размеру пула (также описано здесь):


db, err := sql.Open("postgres", dbConnectionString)db.SetMaxOpenConns(8)db.SetMaxIdleConns(8)if err != nil {   return nil, err}

Выполнение, наблюдение, анализ


3000 запросов в секунду



p99 меньше 60мс с значительно меньшим p100!



Проверка flame graph показывает, что установка соединения больше не заметна! Проверяем детальнее pg(*conn).query также не замечаем установки соединения здесь.



Заключение


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

Подробнее..

Танцуем с cl-build-

11.11.2020 14:20:14 | Автор: admin

Начало

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

Железо купили новенькое, хоть и не мощное, однако имеющийся дистрибутив Calculate в самой своей последней инкарнации CDS на момент сего действа оказался не слишком-то способен распознать новое железо, а именно сетевые интерфейсы. Локальный видит, а вот ethN - нет, постучались в "Телегу" техподдержки, - результат маловнятный. Ну да ладно, решили проверить на других дистрибутивах, из имеющихся был свежий CentOS и gentoo, первый - не смог, второй железо увидел, из чего сделали вывод, что проблема в ядре, в техподдержке намекнули, что ждите дистрибутива или...

...и мы выбрали "или"

Собственно всё нижеследующее - фактически просто протокол работы, то есть то, что мы сделали для того, чтобы создать средствами Calculate Scratch Server (далее CSS) дистрибутив под собственные нужды. Забегая вперёд, скажу, что всё оказалось не так уж и сложно, хоть и не с первого раза, и именно для того, чтобы у нас в последующем и у вас, читатель буде такая нужда возникнет, получилось с первого.

Сходили за образом на https://mirror.lautre.ru/nightly/20201105/ забрали css-20201105-x86_64.iso в вашем случае возможно будет иначе, не суть важно.

Подцепили образ к виртуалке на старом сервере:

qemu-system-x86_64 \-smp 4 \-vnc 192.168.1.240:7 \-m 8192 \-enable-kvm \-boot order=cd,menu=on,reboot-timeout=20 \-hda /mnt/8tb/CSS/CSS-gradient.raw \-cdrom /mnt/8tb/CSS/css-20201105-x86_64.iso

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

qemu-img create -f raw CSS-gradient.raw 40G

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

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

cl-builder-prepare -d /dev/sda1 --id CSS-Gradient

Система нас оповестила, что подготовка завершена:

Затем выполнили:

cl-builder-update

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

Подтвердили введя "Yes" и система обновила образ до последнего, в нашем случае - по минимуму, если образ CSS с которого выполнена загрузка был бы старый, cl-builder подтянул бы необходимое.

После чего:

chroot /run/calculate/mount/CSS-Gradient/ /bin/bash

...и для удобства:

export PS1="(new) ${PS1}"

Просматриваем наличие ядер в системе:

cl-kernel --kver list

* 5.4.57-calculate *

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

eix calculate-sources

В наличии из ветки 5.4 только 5.4.74 как наиболее свежее, поэтому маскируем более ранние, для чего создаём каталог /etc/portage/package.mask и записываем туда файл масок.

mkdir /etc/portage/package.mask

echo "> /etc/portage/package.mask/custom

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

eix calculate-sources

Собственно вот скриншот виртуалки:

Обновляем систему:

cl-update

...и проверяем доступные ядра:

cl-kernel --kver list

* 5.4.72-gentoo

* 5.4.57-calculate *

Но нам нужно ядро calculate, поэтому проверяем доступное ядро:

emerge -s sys-kernel/calculate-sources

По умолчанию предлагается последнее 5.9.3,

которое мы не проверяли на работоспособность, а gentoo-шное 5.4.72 работает без проблем, поэтому в /etc/portage/package.mask/custom добавляем >sys-kernel/calculate-sources-5.4.74, чтобы ограничить выбор одной версией:

nano /etc/portage/package.mask/custom

получилось, что в файле /etc/portage/package.mask/custom содержится вот это:
>sys-kernel/calculate-sources-5.4.74
<sys-kernel/calculate-sources-5.4.74

Нужная версия стала доступной, далее выполняем повторно

cl-update

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

Осталось сгенерировать образ и записать его на флешку. Для этого выходим из окружения создаваемого образа (Ctrl+D) и уже из основной системы выполняем:

cl-builder-image --compress xz --isohybrid ON

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

Поскольку всё действо творится в виртуалке, а ISO-шник с которого мы сию виртуальную машину запустили автоматом не обновляется, да и флешку мы забыли подмонтировать к виртуальной машине, постольку копируем образ на виртуальный диск в какой-нибудь из каталогов, да например /root/, который после перезагрузки останется неизменным. Для этого просто копируем его из оперативки на образ диска, который создал cl-builder-prepare. Ну лентяй я:

cp /var/calculate/linux/css-20201111-x86_64.iso /run/calculate/mount/CSS-Gradient/root/

А потом перезагрузив виртуалку с подцепленной флешкой

qemu-system-x86_64 \-smp 4 \-vnc 192.168.1.240:7 \-m 8192 \-enable-kvm \-boot order=cd,menu=on,reboot-timeout=20 \-hda /mnt/8tb/CSS/CSS-gradient.raw \-hdb /dev/sdd \-cdrom /mnt/8tb/CSS/css-20201105-x86_64.iso

пишем при помощи dd образ на неё (помните флешку /dev/sdd, которая после загрузки виртуалки стала в ней /dev/sdb) из подмонтированного образа сборки, в который ранее мы записали ISO-шник:

mount /dev/sda1 /mnt

cd /mnt/root

dd if=css-20201111-x86_64.iso of=/dev/sdb bs=8MB;sync

Гасим виртуалку (halt -p), вставляем флешку в рабочую машину, которая не хотела работать со штатным диструбутивом CSS и наслаждаемся доступом в сеть.

Финиш

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

Использованные источники

https://old.calculate-linux.org/main/ru/calculate-builder

https://wiki.calculate-linux.org/ru/kernel

https://wiki.gentoo.org/wiki/Handbook:X86/Full/Portage/ru

https://wiki.gentoo.org/wiki/Handbook:X86/Full/Installation/ru#Chrooting

Подробнее..

Мониторинг Virtuozzo Hybrid Server с помощь Prometheus

01.06.2021 14:09:01 | Автор: admin

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

Схожие сервисы доступны и в VHS, но только если вы используете графические интерфейс для управления кластером Virtuozzo Storage. Если же у вас нет кластера Storage, или вы не используете GUI для его администрирования (либо работаете с OpenVZ, где подключение Virtuozzo Storage является возможным, но редко встречающимся сценарием), то для мониторинга приходится обращаться к сторонним решениям.

Анализ предпочтений пользователей (публично доступный для OpenVZ здесь) показывает следующее: как и для мониторинга серверов с Linux и основанных на нем решениями, для продуктов Virtuozzo популярны Zabbix и Prometheus.

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

Непосредственно Prometheus занимается сбором данных от подвластных ему экспортеров - в репозиториях VHS доступны node_exporter (для сбора общих характеристик сервера, таких как использование ресурсов и состояние дисков) и libvirt_exporter (для сбора информации о виртуальных машинах, управляемых libvirt). Экспортеры основаны на соответствующих стандартных проектах, но содержат ряд специфичных для Virtuozzo изменений.

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

Готовим плацдарм

Prometheus, Grafana и Alertmanager можно развернуть на отдельной машине, не обязательно физической. Раз уж мы говорим о Virtuozzo Hybrid Server, то логично развернуть их внутри контейнера на одной из машин VHS. Например, внутри контейнера с Virtuozzo Linux 8; для функционирования вполне достаточно двух ядер ЦПУ и пары гигабайт памяти:

# prlctl create promct --vmtype=ct --ostemplate=vzlinux-8-x86_64# prlctl set promct --cpu 2# prlctl set promct --memsize 2G

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

Внутри контейнера не помешает выставить правильный часовой пояс:

# timedatectl set-timezone 'Europe/Moscow'

А также настроить firewall порт 9090 для веб-интерфейса Prometheus, 9093 для AlertManager и 3000 для Grafana. Обратите внимание, что веб Prometheus и Alertmanager доступны без пароля, так что выставляйте их только в ваши внутренние сети.

# firewall-cmd --zone=public --permanent --add-port=9090/tcp# firewall-cmd --zone=public --permanent --add-port=9093/tcp# firewall-cmd --zone=public --permanent --add-port=3000/tcp# firewall-cmd --reload

Устанавливаем Prometheus & co.

Prometheus входит в репозитории многих дистрибутивов, в том числе и Virtuozzo Linux 8, поэтому можно его установить штатными средствами:

# yum install prometheus

Если вас не устраивает версия из дистрибутива (например, хочется самую свежую, либо наоборот - свежая имеет какие-то раздражающие вас проблемы), то можно просто скачать бинарные файлы с GitHub и положить их в директорию /opt (или в другую на ваш выбор). Например, для версии 2.21.0:

# cd /opt# wget https://github.com/prometheus/prometheus/releases/download/v2.21.0/prometheus-2.21.0.linux-amd64.tar.gz# tar -xzf prometheus*.tar.gz

Единственный нюанс при ручной установке - не забыть создать (либо скорректировать) service-файл для systemd, чтобы там были правильные пути:

# cat /lib/systemd/system/prometheus.service[Unit]Description=PrometheusWants=network-online.targetAfter=network-online.target[Service]Type=simpleWorkingDirectory=/opt/prometheus-2.21.0.linux-amd64Restart=on-failureExecStart=/opt/prometheus-2.21.0.linux-amd64/prometheus[Install]WantedBy=multi-user.target

Аналогично с Alertmanager - можно установить из репозиториев:

# yum install alertmanager

... А можно и с сайта, точно также не забыв service-файл:

# wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz# cd /opt# tar -xzf alertmanager*.tar.gz# cat /usr/lib/systemd/system/alertmanager.service[Unit]Description=AlertmanagerWants=network-online.targetAfter=network-online.targetAfter=prometheus.service[Service]Type=simpleWorkingDirectory=/root/alertmanager-0.21.0.linux-amd64Restart=on-failureExecStart=/root/alertmanager-0.21.0.linux-amd64/alertmanager --config.file=alertmanager.yml[Install]WantedBy=multi-user.target

Grafana сразу предоставляет собранные rpm-пакеты, так что можно, опять же, поставить либо из дистрибутива:

# yum install grafana

либо с сайта проекта:

# yum install https://dl.grafana.com/oss/release/grafana-7.1.5-1.x86_64.rpm

Подготавливаем машины с Virtuozzo Hybrid Server

На каждом сервере VHS, который предполагается мониторить, необходимо установить пакеты с экспортерами:

# yum install node_exporter libvirt_exporter

Чтобы экспортеры могли отдавать данные в Prometheus, необходимо открыть соответствующие порты - 9177 для libvirt_exporter и 9100 для node_exporter. Доступ к ним желательно ограничить адресом машины с Prometheus, чтобы посторонние люди не делали попыток снять метрики с ваших серверов:

# firewall-cmd --permanent --zone=public --add-rich-rule=' rule family="ipv4" source address="1.2.3.4/32" port protocol="tcp" port="9177" accept'# firewall-cmd --permanent --zone=public --add-rich-rule=' rule family="ipv4" source address="1.2.3.4/32" port protocol="tcp" port="9100" accept'# firewall-cmd --reload

Здесь "1.2.3.4" необходимо поменять на реальный адрес Prometheus.

Наконец, смело включаем и запускаем сервисы экспортеров:

# systemctl enable node_exporter# systemctl enable libvirt-exporter# systemctl start node_exporter# systemctl start libvirt-exporter

Дело за малым - надо сообщить Прометею, откуда ему собирать информацию.

Настройка Prometheus

Конфигурация самого Prometheus содержится в наборе Yaml-файлов. Писать их с нуля, даже с помощью примеров из документации то еще развлечение. Именно этот процесс и решили улучшить в Virtuozzo, положив в репозитории VHS 7 пакет vz-prometheus-cfg с шаблонами файлов конфигурации. Его можно установить на любой машине VHS 7, а если вы развернули Prometheus внутри VzLinux 8 то можно его поставить прямо на сервере из репозиториев этого дистрибутива:

# yum install vz-prometheus-cfg

После чего изучать директорию /usr/share/vz-prometheus-cfg/, начав с файла prometheus-example.yml.

Этот файл необходимо отредактировать под ваши нужды и под именем prometheus.yml сохранить в машину или контейнер, где у вас расположен Prometheus. Главное, что там необходимо изменить это местоположение файлов *rules.yml и *alerts.yml, которые также можно скопировать из директории /usr/share/vz-prometheus-cfg/ на сервер Prometheus. Можно их изучить и даже отредактировать, однако они вполне работоспособны и в исходном варианте.

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

Непосредственно машины, с которых надо собирать информацию, указываются в target-файлах. В первом приближении достаточно одного такого файла со списком машин для каждого экспортера (напомним, node_exporter отдает информацию на порту 9100, а libvirt - 9177):

# cat my-vz-libvirt.yml- labels: group: my-vz-deployment targets: - my.node1:9177 - my.node2:9177# cat my-vz-node.yml- labels: group: my-vz-deployment targets: - my.node1:9100 - my.node2:9100

Пути к этим файлам необходимо указать в соответствующих разделах секции scrape_configs в prometheus.yml:

scrape_configs: ... - job_name: node ... file_sd_configs: - files: - /root/prometheus-2.21.0.linux-amd64/targets/my-vz-node.yml - job_name: libvirt ... file_sd_configs: - files: - /root/prometheus-2.21.0.linux-amd64/targets/my-vz-libvirt.yml

Пример полного файла конфигурации можно посмотреть в документации: https://docs.virtuozzo.com/virtuozzo_hybrid_server_7_users_guide/advanced-tasks/monitoring-via-prometheus.html. Обратите внимание, что важными параметрами являются job_name на них идет отсылка в файлах с правилами и алертами. Так что если задумаете менять эти имена не забудьте пройтись и по другим файлами конфигурации и провести соответствующие замены.

Как только все необходимые файлы отредактированы - пора стартовать сервисы:

# systemctl start prometheus# systemctl start alertmanager# systemctl start grafana-server

После чего продолжать уже с настройкой двух других инструментов

Grafana и Alertmanager

Конфигурация Grafana осуществляется через ее веб-интерфейс по адресу http://<ваш-сервер>:3000. Логин-пароль по умолчанию - "admin" / "admin".

Настройка достаточно проста и стандартна - сначала необходимо указать "Prometheus" как источник данных, пройдя в Configuration -> Data Sources -> "Add data source", выбрав "Prometheus" и указав http://localhost:9090 в качестве его адреса.

Далее можно импортировать готовые json-файлы, опять же поставляемые с пакетов vz-prometheus-cfg - grafana_hn_dashboard.json и grafana_ve_dashboard.json - служащие соответственно для отображения информации о серверах и о виртуальных окружениях. Импорт осуществляется в меню "Dashboards" -> "Manage" -> "Import", в качестве источника данных необходимо добавить настроенный ранее Prometheus.

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

Наконец, настройка оповещений Alertmanager тут все на ваше усмотрение, готовых рецептов а-ля отправить отчет в саппорт Virtuozzo не предусмотрено. Так что можно, например, просто настроить типичные оповещения по email в /etc/alertmanager/alertmanager.yaml:

route:   receiver: 'email'  group_by: ['alertname', 'cluster']   group_wait: 30s   group_interval: 5m   repeat_interval: 3h   receivers:  - name: 'email'   email_configs:   - to: 'admin@myserver.com'   from: 'vz-alert@myserver.com'   smarthost: smtp.myserver.com:587

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

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

Подробнее..

Ставим Ubuntu из другого LinuxLiveCD

29.03.2021 04:05:11 | Автор: admin

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

Итак, постановка задачи: есть голая виртуальная машина с выходом в интернет и EFI BIOS, есть некий линукс (в нашем случае это SystemRescue LiveCD), нужно получить установленную Ubuntu. И все действия должны быть легко автоматизированы, что их можно оформить в виде скрипта.

Прежде всего загружаемся в наш SysRCD. Работать мы будем по SSH, и что он заработал, нужно установить пароль root и разрешить SSH в iptables (изначально запрещены любые входящие соединения):

iptables -I INPUT -p tcp --dport 22 -j ACCEPTpasswd

И подключаемся по SSH:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@192.168.56.110

Теперь нужно подготовить разделы на жёстком диске. Так как система у нас EFI, то таблица разделов будет GPT, нужен EFI FAT-раздел, а сама система будет находится на разделе с ext4-разделе. EFI-раздел может очень небольшим - буквально 10 МБ, но для стабильной работы обновлений системы лучше делать его хотя бы 32 МБ. И важное замечание! Во всех инструкциях написано, что раздел должен быть в формате FAT32, но на практике VirtualBox отказывается работать с EFI-разделом в таком формате! Плюс, есть нюансы с размером диска, размером кластера и совместимостью с EFI биосами. Поэтому форматировать будем в FAT16 - только там удаётся добиться стабильной работы с VirtualBox. Разбивать будем при помощи parted.
Для того, чтобы пометить раздел как служебный EFI в parted ему нужно выставить флаг "esp".

partedunit KiBmktable gptmkpart fat16 1024KiB 32MiBname 1 EFI  set 1 esp onmkpart ext4 32MiB -1sПредложит выравнять - соглашаемся.name 2 LINUXquit

Теперь форматируем вновь созданные разделы. Ещё раз обращаю внимание, что EFI-раздел форматируем в FAT-16, иначе будут проблемы с VirtualBox.

mkfs.fat -F 16 -n EFI /dev/sda1FAT32 не работает!mkfs.ext4 -O ^64bit -L LINUX /dev/sda2

Разворачивать систему будем при помощи утилиты debootstrap. В нашем Linux её нет, поэтому просто скачаем deb-пакет и репозитория Debian и развернём содержимое прямо в наш LiveCD.

mkdir /tmp/1cd /tmp/1wget http://ftp.ru.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.123_all.debar -p *.deb data.tar.gz | tar -xz -C /

Ставить будем Ubuntu 20.04 "Focal" - имя релиза указывается при вызове deboostrap. там же указывается репозиторий, откуда будут скачаны файлы.
Для разворачивания системы, нам естественно, нужно сначала примонтировать её корень в какую-то папку. Не мудрствуя лукаво используем для этого папку "/tmp/".

mkdir /tmp/newrootcd /tmpmount -o relatime /dev/sda2 newroot/usr/sbin/debootstrap --arch=amd64 --include=wget,nano focal /tmp/newroot https://mirror.linux-ia64.org/ubuntu/

Теперь нам нужно настроить список репозиториев, откуда будут браться устанавливаемые и обновляемые пакеты. Список находится в файле /etc/apt/sources.list

( RELEASE=focal ; echo "deb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} main restricted# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} main restricteddeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates main restricted# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates main restricteddeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} universe# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} universedeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates universe# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates universedeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} multiverse# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE} multiversedeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates multiverse# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-updates multiversedeb http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-backports main restricted universe multiverse# deb-src http://ru.archive.ubuntu.com/ubuntu/ ${RELEASE}-backports main restricted universe multiversedeb http://archive.canonical.com/ubuntu ${RELEASE} partner# deb-src http://archive.canonical.com/ubuntu ${RELEASE} partnerdeb http://security.ubuntu.com/ubuntu focal-security main restricted# deb-src http://security.ubuntu.com/ubuntu ${RELEASE}-security main restricteddeb http://security.ubuntu.com/ubuntu ${RELEASE}-security universe# deb-src http://security.ubuntu.com/ubuntu ${RELEASE}-security universedeb http://security.ubuntu.com/ubuntu ${RELEASE}-security multiverse# deb-src http://security.ubuntu.com/ubuntu ${RELEASE}-security multiverse" >newroot/etc/apt/sources.list )

Теперь настраиваем chroot-окружение и входим в нашу новую систему:

mount --bind /dev newroot/devmount --bind /dev/pts newroot/dev/pts mount -t sysfs sys newroot/sys mount -t proc proc newroot/procLANG=C.UTF-8 chroot newroot

Первым делом настраиваем поддерживаемые локали. Обратите внимание, что добавляется CP866 (на самом деле она "IBM866"), которая до сих пор бывает актуальной при работе со windows-legacy данными.
Список поддерживаемых кодировок хранится в /etc/locale.gen Ещё раз обращаю внимание, что CP866/IBM866 по-умолчанию там нет. Пос

locale-gen en_US.UTF-8echo "en_GB ISO-8859-1en_GB.UTF-8 UTF-8en_US ISO-8859-1en_US.UTF-8 UTF-8ru_RU.CP1251 CP1251ru_RU.IBM866 IBM866ru_RU.KOI8-R KOI8-Rru_RU.UTF-8 UTF-8" >/etc/locale.gen# Генерируем файлы выбранных кодировок и локалей.locale-gen

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

apt-get updateapt-get upgradeapt-get install -y aptitude mc man# Ставим базовый языковой пакет.apt-get install -y language-pack-en

EFI раздел будет примонтирован в /boot/efi. Монтируем и настраиваем /etc/fstab.

echo " <file system>                           <mount point>          <type>  <options>                    <dump> <pass># / was on /dev/sda2 during installationUUID=`blkid -o value -s UUID /dev/sda2`   /                      ext4    errors=remount-ro,relatime      0     2# /boot/efi was on /dev/sda1 during installationUUID=`blkid -o value -s UUID /dev/sda1`   /boot/efi              vfat    umask=0033                      0     1" >/etc/fstab# Монтируем EFI-раздел.mount /boot/efi

Настраиваем локаль.

echo 'LANG="C"LANGUAGE="en_US:C:ru_RU"LC_CTYPE="ru_RU.UTF-8"LC_MESSAGES="en_US.UTF-8"LC_COLLATE="ru_RU.UTF-8"LC_NUMERIC="C.UTF-8"LC_TIME="C.UTF-8"LC_MONETARY="en_US.UTF-8"LC_PAPER="ru_RU.UTF-8"LC_NAME="en_US.UTF-8"LC_ADDRESS="en_US.UTF-8"LC_TELEPHONE="ru_RU.UTF-8"LC_MEASUREMENT="ru_RU.UTF-8"LC_IDENTIFICATION="en_US.UTF-8"' >/etc/default/locale

Настраиваем часовой пояс. То же самое можно выполнить вызовом "dpkg-reconfigure tzdata". Но нам же нужно, чтобы это можно было заскриптовать. Просмотреть спиcок часовых поясов можно вызовом "timedatectl list-timezones".

ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtimeecho "Europe/Moscow" >/etc/timezoneecho "test" >etc/hostname# Но сейчас принято делать так:timedatectl set-timezone "Europe/Moscow" # Просмотреть варианты можно вызовом timedatectl list-timezones

Указываем, что аппаратные часы у нас хранят время в UTC. Обратите внимание, что "0" означает время в UTC.

timedatectl set-local-rtc 0

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

apt-get install -y linux-image-virtual-hwe-20.04-edge linux-image-extra-virtual-hwe-20.04-edge linux-headers-virtual-hwe-20.04-edge

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

apt-get install -y console-setup console-common sshapt-get install -y net-tools bind9utils build-essential pixz pigz pv htopapt-get install -y grub-efi-amd64

Настраиваем клавиатуру:

# Consult the keyboard(5) manual page.XKBMODEL="pc105"XKBLAYOUT="us,ru"XKBVARIANT=","XKBOPTIONS="grp:rctrl_toggle,lv3:ralt_switch,grp_led:scroll"BACKSPACE="guess"' >/etc/default/keyboardecho '# CONFIGURATION FILE FOR SETUPCON# Consult the console-setup(5) manual page.ACTIVE_CONSOLES="/dev/tty[1-6]"CHARMAP="UTF-8"CODESET="guess"FONTFACE="Terminus"FONTSIZE="8x16"VIDEOMODE=" >/etc/default/console-setup

Это так же можно сделать в интерактивном режиме выполнив:
dpkg-reconfigure console-common
dpkg-reconfigure console-data
dpkg-reconfigure keyboard-configuration

Ставим GRUB на EFI-раздел:

grub-install --target=x86_64-efi --recheck --efi-directory=/boot/efi /dev/sda

Если нужно, то правим настройки GRUB в файле /etc/default/grub и обновляем конфигурацию GRUB вызовом:

update-grub2

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

update-initramfs -u

Задаём пароль root и разрешаем авторизацию root в SSH по паролю. Это нужно для того, чтобы можно было подключиться первый раз и залить SSH-ключи. Затем авторизацию root по паролю нужно не забыт запретить.
Для этого в файле настроек SSH-сервера /etc/ssh/sshd_config нужно добавить строку:
PermitRootLogin yes

# Задаём пароль rootpasswdecho "PermitRootLogin" >>/etc/ssh/sshd_config
echo "test1">/etc/hostname

Задаём настройки сетевых подключений. У нас netplan и networkd. Не забываем ставить актуальные значения MAC-адресов адаптеров. На первом адаптере ставим статический адрес, а на второй работает DHCP (это NET-подключение к интернет). Обратите внимание, что IPv6 отключается указанием "link-local: [ ]" в настройках подключения.

echo "network:  version: 2  renderer: networkd  ethernets:    eth0:      match:        macaddress: 08:00:27:2e:69:24      addresses:        - 192.168.56.10/24      gateway4: 192.168.56.1" >/etc/netplan/eth0.yamlecho "network:  version: 2  renderer: networkd  ethernets:    eth1:      match:        macaddress: 08:00:27:e4:46:31      # Let's disable IPV6 for this interface.      link-local: [ ]       dhcp4: yes" >/etc/netplan/eth1.yaml

Создаём пользователя и добавляем его в административные группы:

adduser userusermod -G 'adm,dialout,sudo,cdrom,dip,plugdev,users' user

Чистим кэш apt:

apt-get clean

Всё! Можно перегружаться и при загрузке с жёсткого диска загрузится уже наша свежеустановленная система.

Если это виртуальная машина VirtualBox, то после перезагрузки нужно ещё поставить дополнения, подключаем "Guest Additions CD Image" и выполняем из-под нашей новой системы:

sudo mkdir /cdromsudo mount -o loop,ro /dev/cdrom /cdromsudo /cdrom/VBoxLinuxAdditions.runsudo umount /cdrom

На этом всё. Дальше нужно подключиться по SSH и залить SSH ключи пользователей. После чего удалить настройку "PermitRootLogin yes" из /etc/ssh/sshd_config.

Если кому-то интересно, то вот такой образ Ubuntu 20.04 занимает 2.2 ГБ дискового пространства.

Подробнее..

Настройка собственного почтового сервера

26.02.2021 20:18:58 | Автор: admin

Есть три основных шага, чтобы установить и настроить собственный почтовый сервер.

  • Настройка IP и DNS

  • Выбор и запуск приложения почтового сервера

  • Добавление своего почтового сервера в белые списки

Настройка IP и DNS

Обеспечение внешнего статического IP-адреса, публичного домена и записи PTR

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

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

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

  • IP указывает на доменное имя
    Самое главное, обратная DNS-запись (именуемая PTR) должна указывать на доменное имя почтового сервера по IP-адресу. Можно попросить своего хостинг-провайдера или поставщика интернет-услуг настроить его. Его можно легко проверить по IP-адресу онлайн (например, тут), или с помощью команды nslookup в Windows и команды host в системах на основе UNIX.

Настройка MX записи в DNS

Запись почтового обмена (MX) указывает почтовый сервер, ответственный за прием сообщений электронной почты от имени домена.

Например, если наш домен - mycompany.com, почтовый сервер - mail.mycompany.com, то запись DNS для mycompany.com будет:

Type

Host

Value

Priority

TTL

MX

@

mail.mycompany.com

10

1 min

где:

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

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

Настройка DKIM записи в DNS

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

Понадобятся приватный и открытый ключи. Их можно создать с помощью онлайн-инструментов, например Power DMARC Toolbox - DKIM Record Generator, или с помощью команд OpenSSL (приведен пример для Windows):

  • Создать приватный ключ
    openssl.exe genrsa -out private.key 2048

  • Создать публичный ключ из приватного
    openssl.exe rsa -in private.key -pubout -outform der 2>nul | openssl base64 -A > public.key.txt

И запись DNS будет выглядеть так:

Type

Host

Value

TTL

TXT

selector._domainkey

v=DKIM1; k=rsa; p=public_key

1 min

где:

  • selector - самостоятельно выбранный идентификатор (например, mysrv), который будет использоваться в приложении почтового сервера (смотрите ниже).

  • public_key - открытый ключ, закодированный алгоритмом base64 (содержимое public.key.txt).

  • TTL (время жизни) имеет то же значение, что и в предыдущем разделе.

Настройка SPF записи в DNS

Инфраструктура политики отправителя (SPF) это стандарт проверки подлинности электронной почты, который проверяет IP-адрес отправителя по списку авторизованных IP-адресов владельца домена для проверки входящей электронной почты.

Тут запись DNS будет выглядеть так:

Type

Host

Value

TTL

TXT

@

v=spf1 a mx include:relayer_name -all

1 min

где:

  • relayer_name - имя необязательного внешнего почтового сервера-ретранслятора (смотрите ниже). Если не нужно - убирается вместе с "include:".

  • TTL (время жизни) имеет то же значение, что и в предыдущем разделе.

Можно использовать удобный онлайн-генератор записи SPF.

Дополнительные записи DNS

Некоторые поля не обязательны, но желательно иметь.

  • DMARC
    Запись доменной проверки подлинности сообщений, отчетов и соответствия (DMARC) позволяет собственному почтовому серверу декларировать политику того, как другие почтовые серверы должны реагировать на недостоверные сообщения от него.

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

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

Все эти записи могут быть созданы с помощью Power DMARC Toolbox.

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

Конечно, хостинг должен позволять устанавливать программное обеспечение. Можно использовать любое подходящее приложение для почтового сервера. Например, есть бесплатный hMailServer для Windows, который предоставляет все необходимые функции с минимальным использованием ресурсов. Для систем на базе UNIX существует множество бесплатных почтовых серверов, таких как Exim Internet Mailer или iRedMail.

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

Инициализация

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

  • Домен и пользователи
    Нужно добавить домен и начальный набор пользователей почтового сервера.

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

  • Подпись сообщений
    Далее, следует настроить DKIM. Нужно указать полученные выше приватный ключ и селектор. Кроме того, методы заголовка и тела должны быть установлены на расслабленный, алгоритм подписи должен быть установлен на SHA256, иначе на некоторых SMTP серверах не проходит проверка (например, google).

  • Защита от спама
    Наконец, нужно настроить антиспам-проверку специальными узлами черных списков, такими как spamhaus.org, чтобы защитить пользователей почтового сервера от нежелательных сообщений.

Протоколы электронной почты

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

SMTP

SMTP используется для приема входящей и исходящей почты с/на другие почтовые серверы. И это позволяет пользователям домена отправлять свои сообщения.

  • 25 порт
    Этот порт необходим для управления входящими подключениями от других почтовых серверов. Метод безопасности следует установить в STARTTLS.

  • 587 порт
    Он нужен для почтовых клиентов собственного почтового сервера. Метод безопасности следует установить в STARTTLS.

  • 465 порт
    Он не является официальным и может потребоваться для старых почтовых клиентов. И метод безопасности следует установить в SSL/TLS.

POP3, IMAP

POP3 и IMAP используются отдельными почтовыми клиентами, такими как Outlook на ПК или любой почтовый клиент на мобильных телефонах. Это позволяет пользователям домена управлять своими сообщениями.

Порт 993 следует использовать для защищенных соединений IMAP, а порт 995 - для POP3. Для обеспечения совместимости с большинством клиентов метод безопасности следует установить в SSL/TLS (не STARTTLS).

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

Проверка

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

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

Аккаунт Gmail.com

Если есть учетная запись Gmail.com (что наверняка), можно отправить тестовое письмо на свой адрес Gmail. Затем открываем свою электронную почту в браузере и нажимаем Показать подробности.

Если есть подписано: домен, подпись DKIM настроена правильно. Если есть отправлено по почте: домен, SPF в порядке.

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

Также, в Outlook можно видеть те же заголовки в свойствах сообщения.

Специальные онлайн-сервисы

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

  • AppMailDev
    Этот сервис позволяет тестировать конфигурацию почтового сервера, такую как DKIM и SPF, отправляя электронное письмо на указанный сгенерированный почтовый адрес. Нужно просто следовать инструкциям на экране и результаты теста будут отображены там же.

  • DKIMValidator
    Предоставляет те же функции, что и предыдущая служба. Результаты тестирования будут отправлены на адрес отправителя.

  • HAD Email Auth Tester
    Чтобы проверить отправку сообщения здесь, нужно отправить специальное сообщение на tester@email-test.had.dnsops.gov. Результаты тестирования будут отправлены на адрес отправителя.

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

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

Добавление почтового сервера в белые списки

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

Внесение в белый список в публичных источниках

Итак, сначала проверим IP (и, если необходимо, домен) онлайн на наличие в каких-либо черных списках. Его можно проверить в любом онлайн-чекере, который можно найти через поиск. Например, MXToolBox проверяет самые популярные черные списки. Также, multirbl.valli.org показывает много источников черного списка и доверие к каждому из них.

Затем нужно последовательно просмотреть каждый элемент в результатах и прочитать рекомендации о том, как внести IP-адрес в белый список в конкретном источнике черного списка. Но не все из них могут позволить это сделать бесплатно, например, немецкий UCEPROTECT-Network.

Кстати, на тут на habr обсуждалась автоматизация мониторинга IP в блэклистах.

Внесение в белый список определенных почтовых серверов

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

Обход черных списков

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

  • MailerSend
    Один из самых дешевых - позволяет бесплатно отправлять 20 тысяч писем в месяц и имеет низкую стоимость дополнительной отправки. Но есть особенность: поля CC и BCC пока не поддерживаются.

  • SendInBlue
    Это еще один хороший сервис, который позволяет бесплатно отправлять 9 тысяч писем в месяц с лимитом 200 в день. Но есть нюансы: встроенное отслеживание электронной почты нельзя отключить и высоковатая цена сверх бесплатного лимита.

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

Заключение

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

Подробнее..

Все на панель! или несколько полезных приемов настройки панелей Xwiki

11.04.2021 14:15:43 | Автор: admin

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

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

В первой статье мы погорим о простых вещах, которые не отнимут у нас много времени, а именно:

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

Весь материал статьи я проверял в версиях Xwiki 12.10.5 и 13.2 с установленной Demo Flavor. Также в статье подразумевается, что вы обладаете правами администратора.

Оглавление страницы в боковой панели

В админ-панели переходим в раздел Настройки интерфейса -> Мастер панелей и внизу страницы находим ссылку "Перейти к панелям". Ну или просто введите в адресную строку
{ваш домен с Xwiki}/bin/view/Panels/
В разделе "Создать новую панель"
Введите название панели (например, SideTOC}
и нажмите кнопку "Создать"
Тип панели оставьте - "View"
Описание - на ваше усмотрение.
В поле Содержимое введите код:

{{velocity}}{{context document="$services.model.serialize($doc.documentReference)" transformationContext="document"}}#set ($hasHeaders = [])#set ($mydoc = $doc.getDocument())#foreach ($block in $mydoc.getXDOM().getBlocks('class:HeaderBlock', 'DESCENDANT')) #set ($discard = $hasHeaders.add($block))#end#if($hasHeaders.size()>0) #panelheader('Table of Contents') {{box cssClass="sidetoc"}}{{toc/}}{{/box}}#end{{/context}}{{/velocity}}

Поясню для тех, кто только начал знакомство с данной Вики.

В Xwiki для автоматизации используется различные средства автоматизации и одно из них Appache Velocity. В данном случае весь код между тегами {{velocity}} {{/velocity}} будет обрабатываться как код на данном языке шаблонов.

В макросе {{context}} мы указываем контекст для которого будет выполнятся наш код.
В нашем случае это контекст основного содержимого страницы. Таким образом, наш скрипт будет думать, что он не внутри сквозной боковой панели, а внутри блока с текстом статьи. Это необходимо для того, чтобы получить заголовки из которых формируется оглавление.
блок
#if($hasHeaders.size()>0)
#panelheader('Table of Contents')
#panelheader('Table of Contents') {{box cssClass="sidetoc"}}{{toc/}}{{/box}}
#end

Выводит нам заголовок для панели и сами ссылки на разделы статьи, только в том случае если на странице есть заголовки из которых можно собрать оглавление.
Макрос {{toc/}} - непосредственно создает оглавление. Мы обрамим его в макрос
{{box cssClass="sidetoc"}}, чтобы иметь возможность удобной стилизации блока. Но об этом немного позже.

Теперь необходимо вставить нашу панель в верстку страницы.
Я решил разместить блок слева.
Чтобы сделать также в админ-панели перейдите на страницу Мастер панелей -> вкладка "Список панелей" и просто перетащите панель с названием SideTOC на панель слева (справа).
Если перетаскивание не сработает, вы можете добавить панель в ручную
На вкладке "Макет страницы" в поле "ПАНЕЛИ СЛЕВА" (или справа) добавив "Panels.SideTOC".
например, Panels.Applications,Panels.Navigation,Panels.SideTOC

Не забудьте нажать кнопку "Сохранить".
Выглядеть будет примерно так:

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

Но прежде убедимся, что у нас включен расширенный режим редактора.
Перейдите на страницу вашего профиля. Нажмите кнопку "Редактировать"
В разделе "Настройки" найдите пункт "Тип пользователя" и выберите значение : "Продвинутый" (Advanced). Теперь нам точно будет доступен редакторов объектов.

Откройте страницу созданной ранее панели, вы можете найти её на странице списка панелей или просто перейдя по адресу {домен}/bin/view/Panels/SideTOC.
Теперь у кнопки "Редактировать" доступен список с дополнительными вариантами.
Выберите пункт "Объекты".

В поле "Новый объект" выберите StyleSheetExtension и нажмите кнопку "Добавить"

Xwiki очень функциональна и позволяет поменять css стили практически для любого элемента. В данном случае мы поменяем стиль класса siidetoc, который был указан в макросе {box}.
Введите любое название например sidetoc, а затем CSS код:

.sidetoc {  border:0px;  margin:0px;  padding:0px;  width:100%;}.sidetoc ul {  padding-left:2px;  list-style-type:disc;  font-size:1em;  padding:0px;  margin-left:0px;}.sidetoc li {  padding-left: 0px;  margin-left:5px;  list-style-type:disc;}

В поле "Использовать это расширение" обязательно выберите "В этой вики" ,

Не забудьте сохранить страницу.
Проверяем нашу главную.
Теперь панель выглядит немного по другому:

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

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

Cвоя панель навигации справа / слева

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

Сейчас информация о нашей любимой пицце отображается в разделе "Навигация".

Мы хотим убрать эти страницы из раздела "Навигация" и перенести в свою собственную панель.
Для начала уберем ссылки на пиццу из стандартной панели навигации.
В админ-панели откройте раздел "Настройки интерфейса" - > "Панель навигации".
Перетащите раздел "Моя любимая пицца" в раздел "Исключенные страницы".

Теперь перейдите в соседний раздел "Меню" и нажмите кнопку "Добавить новую запись".
Введите название панели, например, PizzaMenu.
Удаляем заглушку. Если у вас WYSIWIG редактор нажмите кнопку "Источник" и вставьте следующий код:

{{documentTree root="document:xwiki:Моя любимая пицца.WebHome" compact="true"/}}

Ну или вы можете просто вставить макрос "Дерево страниц" и добиться также настроек.

В поле "root" первая половина значения - document:xwiki: - это особенность структуры адресов Xwiki, Вы со временем разберетесь в тонкостях, а вот вторую часть: "Моя любимая пицца.WebHome", можно легко узнать перейдя на страницу "Моя любимая пицца.WebHome" и открыв внизу вкладку "Информация".

В поле "МЕСТО ОТОБРАЖЕНИЯ МЕНЮ" выберите - "Внутри левой панели".
В поле "ОБЛАСТЬ ВИДИМОСТИ МЕНЮ" выберите - "Current Wiki".
Не забудьте сохранить.

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

Перейдите на страницу Админ-панель -> Мастер панелей.
И добавить в левую панель строку: Menu.PizzaMenu.WebHome

Например, вот так:

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

Осталось немного навести марафет.

Давайте заменим заголовок панели.
Перейдите на страницу меню. Через админ-панель или просто по адресу:{домен}/bin/view/Menu/PizzaMenu/

Аналогично прошлому разделу откройте редактор объектов.
Разверните "UIExtensionClass" и в тег {{menu}} добавьте: id="PizzaMenu".
Замените значение в "#panelheader("PizzaMenu"), на то что вам больше по душе. Например так:

Если хотите можете аналогично примеру с оглавлением подредактировать CSS стиль блока (именно для этого мы и добавили id="PizzaMenu").
Создайте объект для настройки стилей и введите:

#PizzaMenu ul.jstree-children{  padding-left:0px !important;}

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

Добавляем свои советы в панель подсказок

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

Для этого надо в любом месте создать страницу.
Я создам пустую страницу Tips в разделе Xwiki чтобы она не "мозолила" глаза.

Откройте редактор объектов и добавьте объект расширения интерфейса.

В поле "Extension Point ID" вставьте: "org.xwiki.platform.help.tipsPanel".
В поле "Extension ID" введите любое название, например, "grammarHelp".
В поле "Extension Scope" выберите "Current Wiki".
В поле "Extension Parameters" введите:

tip = Чтобы воспользоваться исправлением опечатки нажмите Ctrl+ПКМ

Аналогичным образом создайте на странице еще одно расширение. См. скриншот.

Остается только сохранить изменения и дождаться появления советов.

Если честно я хотел добавить еще примеров, но статья итак получилась объемной.
Впереди у нас интеграция с Figma, GitLab, Swagger и кастомные DocumentThree!
Постараюсь не затягивать со следующим материалом.

Подробнее..

Как сделать CRM систему управления продажами надежной и простой как автомат Калашникова

16.04.2021 12:14:51 | Автор: admin

Несколько лет назад у меня был бизнес по размещению indoor-рекламы на световых панелях в торговых центрах. Однажды, мы заключили контракт с крупным федеральным клиентом и решали для него задачу масштабирования адресной программы. Нужно было за месяц подключить 100+ торговых центров в 10+ городах, договориться о размещении рекламного инвентаря, все смонтировать, напечатать и установить рекламные креативы. Времени на раскачку, найм и обучение персонала, внедрение систем управления и другие организационные мероприятия не было. Нужно было стартовать за два дня. Тогда то и появилась CRM система, которую мы внедрили за 5 часов, обучили аутсорсинговых сотрудников ей пользоваться и закрыли бизнес задачу в срок.

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

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

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

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

Решение, которое подойдет для всех этих задач - CRM-система, состоящая из онлайн таблицы и календаря. Открывается с компьютера и смартфона. Располагается в облаке. Делать записи и вносить изменения могут одновременно несколько пользователей. Настройки позволяют разграничить доступ и права, видеть календари и задачи команды, или только свои. Информация никуда не исчезает, можно посмотреть изменения и откатить систему до последней корректной версии, если что-то пошло не так. Делаю допущение о том, что любой человек, выполняющий обязанности менеджера по продажам в IT умеет пользоваться MS офисом и ведет список своих встреч с клиентами. Сотрудникам не придется разбираться в новых интерфейсах и логике, ведь они уже используют Excel для других задач и у каждого в смартфоне есть знакомый предустановленный календарь или приложение со списком дел. Подойдут любые таблицы и календари, в том числе общедоступные. Большое распространение имеют инструменты от гугл, поэтому рассмотрим пример такой CRM-системы, собранной на паре от гугл таблицы + гугл календарь.

Таблица с шагами по сделкам

Календарь задач

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

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

Не стоит торопиться перекрашивать базу клиентов в красный, если получен первый отказ, особенно в бизнесах с продажами сложных решений, средними и длинными циклами сделок, или на рынках с ограниченным количеством клиентов. Помните: 80% сделок совершается после 5-го предложения купить.

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

Вот ссылка на шаблон таблицы с примерами заполнения:https://docs.google.com/spreadsheets/d/1RxqmG5NvXuurHga5KYH5g15j_104shPcncl6xX_7pNM/edit#gid=2012797147

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

Подробнее..

Лучшие флаги Google Chrome для повышения удобства пользователей

29.03.2021 00:13:50 | Автор: admin
Веб-браузер Google Chrome, на сегодняшний день, наиболее востребованный среди пользователей. Он по праву занимает лидирующее положение в списке бесплатного программного обеспечения.

image

Введение


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

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

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

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

Данные флаги были протестированы в приложении Google Chrome 78 в ноябре 2019 года. Но даже если пользователи загрузили и используют уже более новую версию Google Chrome, многие из них, вероятно, все еще будут так же доступны.

Примечание. Некоторые экспериментальные функции, которые доступны на странице флагов не проходят проверку и при следующем обновлении веб-приложения исчезают из списка предлагаемых образцов. Например, флаг enable-reader-mode, который сокращает веб-страницу до минимума, упрощая ее отображение, и позволяет пользователям прочесть статью без отвлекающих факторов, рекламы и дополнительного всплывающего содержимого, теперь недоступен в новой версии Google Chrome. Но если потребность в данной функции существует, то мы рекомендуем установить расширение Reader Mode из Интернет-магазина Google Chrome или переключиться на другой браузер со встроенным режимом чтения, такой как Mozilla Firefox, Microsoft Edge или Apple Safari.

Как включить флаги в Google Chrome?


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

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

Кроме того, необходимо помнить, что разработчики Google могут удалить какую угодно произвольную функцию из представленных вариантов в любое время, поэтому лучше не использовать их на постоянной основе. Существует вероятность, что какой-либо конкретный флаг может просто исчезнуть после следующего обновления веб-браузера. Это случается не часто, но все же происходит. Например, функция Filesystem API in Incognito, которая была доступна в семьдесят восьмой версии веб-браузера Google Chrome уже отсутствует в следующем выпуске. В определенных случаях отдельные сайты блокируют отображение своего содержимого для тех пользователей, которые используют режим инкогнито. И данный флаг создает временную файловую систему в памяти, которая обычно отключена в безопасном анонимном режиме. Такая операция заставляет сайты думать, что пользователи используют обычный вариант Google Chrome, поэтому блокировка снимается и отображается вся представленная информация без ограничений. Возможно, подобный флаг появится вскоре в новом обновленном варианте и будет доступен для тестирования в следующих сборках, так как его способности довольно востребованы и интересны.

Если интерес к экспериментальным функциям не пропал, то откройте новую вкладку веб-браузера Google Chrome и в строке состояния введите (или скопируйте и вставьте) следующий адрес страницы флагов chrome://flags:

image

Затем нажмите на клавиатуре клавишу Ввод, чтобы непосредственно завершить переход на искомую страницу. Каждый флаг содержит подробную информацию о том, с какими операционными системами он работает: Windows, Mac, Linux, Chrome OS, Android или одновременно поддерживает все из перечисленных систем. Обязательно обратите внимание на перечень систем и убедитесь, что используемая на конкретном компьютерном устройстве операционная система присутствует в указанном списке.

image

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

image

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

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

image

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

Функция группирования вкладок


image

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

Скопируйте и вставьте следующую ссылку chrome://flags/#tab-groups или вручную введите ее в соответствующей строке веб-браузера, а затем нажмите клавишу Ввод на клавиатуре, чтобы перейти непосредственно к флагу:

image

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

Функция очистки значков расширений с панели инструментов Google Chrome


image

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

Вероятно, данная функция будет уже доступна в скором времени и включена изначально по умолчанию в набор стандартных приложений Google Chrome, но в настоящий момент пользователи могут с ней ознакомиться, только включив соответствующий флаг. Введите в строке адреса или скопируйте и вставьте следующую фразу chrome://flags/#extensions-toolbar-menu, а потом нажмите клавишу Ввод:

image

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

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

Функция автоматического отображения содержимого любого сетевого ресурса в темной теме


image

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

В флагах Google Chrome есть готовое решение для принудительного перехода на темный цвет. Включите экспериментальную функцию Force Dark Mode for Web Contents, и Google Chrome наложит темную тему на загружаемые веб-сайты, превратив светлый фон в темный, а текст представит в белом цвете. Действительно, полученный вариант итогового представления не идеален, не так хорош и не настолько оптимален, как темный режим, закодированный разработчиками сайтов, но он совсем не плох и пользователи могут выбрать несколько разных вариантов для его настройки.

Скопируйте и вставьте фразу chrome://flags/#enable-force-dark или вручную наберите ее в строке перехода Google Chrome и нажмите на клавишу Ввод, чтобы отыскать востребованный флаг:

image

Обновление: данный флаг, по-видимому, вызывает серьезные проблемы в Chrome OS начиная с Chrome 78. Не включайте его в Chromebook, иначе может потребоваться выполнить перезагрузку Chrome OS.

Функция вывода кнопки Воспроизведение / Пауза для музыки и видео


image

Многие пользователи регулярно слушают музыкальные произведения и просматривают различные видео композиции в сети Интернет. Часто они не ограничиваются только одной вкладкой, а открывают сразу несколько разных тематических сайтов. И когда подобных мультимедийных сетевых ресурсов запущено на разных окнах веб-браузера довольно много, то поиск нужной вкладки может оказаться непростой задачей. Небольшой активный индикатор Google Chrome на вкладках конечно помогает немного, но наличие скрытой кнопки Воспроизведение / Пауза способно помочь пользователям гораздо лучше.

Поэтому для облегчения управления музыкальным и видео содержимым включите функцию Global Media Controls. На панели управления веб-браузера Google Chrome появиться дополнительная кнопка Управляйте воспроизведением музыки, видео и других медиафайлов, нажатие на которую вызывает отображение вложенной всплывающей панели, где пользователи могут видеть название воспроизводимых композиций, а также регулировать, запускать и останавливать их исполнение.

Чтобы найти ответственный флаг, скопируйте и вставьте следующий фразу chrome://flags/#global-media-controls или самостоятельно осуществите ее набор в строке Google Chrome и нажмите клавишу Ввод для непосредственного перехода к указанной искомой функции:

image

Функция плавной прокрутки


image

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

Скопируйте и вставьте следующий адрес chrome://flags/#smooth-scrolling или вручную его наберите в ответственной строке Google Chrome и перейдите непосредственно к флагу, нажав на клавишу Ввод:

image

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

Функция повышения скорости взаимодействия с протоколом QUIC



image

Протокол QUIC (HTTP/3), разработанный корпорацией Google, позволяет веб-браузерам и веб-серверам быстрее общаться и передавать информацию друг другу, обладает большей устойчивостью к ошибкам и включает в себя шифрование TLS 1.3, что позволяет значительно повысить безопасность протокола. QUIC предлагает меньше накладных расходов при организации сетевого соединения и обеспечивает более быструю передачу данных при подключении. В отличие от предыдущих распространенных образцов протоколов, наличие ошибки, такой как потерянная в процессе передачи часть данных, не приведет к остановке соединения и ожиданию окончания устранения проблемы. QUIC будет продолжать передавать другие данные, пока существующая неполадка устраняется.

Несмотря на то, что поддержка протокола QUIC уже включена в Opera и Chrome Canary, пользователи могут активировать флаг Google Chrome и начать использовать его в стабильном канале непосредственно перед выпуском. Конечно, данная функция ускорит общее взаимодействие только в том случае, если пользователи обращаются к веб-сайту, размещенному на сервере с поддержкой QUIC.

Чтобы воспользоваться преимуществами протокола HTTP/3, введите следующую ссылку chrome://flags/#enable-quic или скопируйте и вставьте ее непосредственно в связанную строку Google Chrome, а затем нажмите на клавишу Ввод, чтобы включить флаг:

image

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

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru