...

суббота, 21 сентября 2019 г.

[Перевод] Gap — светлое будущее для отступов в Flexbox (как в Grid)

Одна из моих любимых частей спецификации CSS Grid — это grid-gap. Они позволяют легко создавать отступы между элементами внутри сетки.

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

W3C порекомендовала отказаться от свойства grid-gap в пользу простого gap и его использования в Flexbox и Multi-Column.

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



Margins в обычной Flexbox-сетке


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

Начнём с базового HTML. Имеем flex-container и набор flex-item.

<div class="flex-container">
    <div class="flex-item"></div>
    <div class="flex-item"></div>
    <div class="flex-item"></div>
    <div class="flex-item"></div>
    <div class="flex-item"></div>
    <div class="flex-item"></div>
    <div class="flex-item"></div>
    <div class="flex-item"></div>
</div>


Благодаря поведению Flexbox, содержимое расположится друг рядом с другом. Отталкиваясь от значения ширины контейнера, определим размер дочерних элементов и затем позволим им переносится с помощью свойства flex-wrap.
.flex-container {
    display: flex;
    flex-wrap: wrap;
}
.flex-item {
    width: calc(100% / 3);
}



Это даёт нам блок блоки идеального размера, равные 1/3 ширины контейнера. Давайте зададим margins, чтобы добавить пространство по вертикали и горизонтали между каждым элементом.
.flex-item {
    width: calc(100% / 3);
    margin-right: 1rem;
    margin-bottom: 1rem;
}



Ой! Наши элементы, являющиеся 1/3 контейнера, больше не помещаются в ширину родительского элемента. Хотя margins между рядами получились вполне корректными и не вызвали проблем.

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

Теперь у нас остались два margins, равных 1rem и мы должны вычесть эти 2rem равномерно из ширины всех трёх элементов.

flex-item {
    // width: calc(100% / 3);
    width: calc((100% / 3) - (2rem / 3)); // one-third - two margins divided equally among 3 items
    margin-right: 1rem;
    margin-bottom: 1rem;
}
.flex-item:nth-child(3n) {
    margin-right: 0;
}


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

Когда свойство gap станет доступным для использования в Flexbox во всех браузерах, код станет намного чище. Мы можем также перейти от установки ширины для дочерних элементов, к использованию свойств flex-grow, flex-shrink и flex-basis.

Установка отступов с помощью Gap


Используя свойство gap, мы избавляемся от необходимости проделывать большинство ухищрений с шириной элементов. Это также позволяет нам вернуться к использованию значений flex-grow/fles-shrink.

Вы следующем примере мы всё ещё используем свойства display: flex и flex-wrap: wrap для нашего контейнера, но теперь также добавляем свойство gap. Это сокращенное свойство, которое объединяет в себе row-gap и column-gap. Ознакомьтесь с документацией MDN, чтобы узнать обо всех методах.

Теперь, вместо установки ширины для каждого flex-элемента, мы устанавливаем значения flex-grow, flex-shrink и flex-basis. Свойство flex-basis будет определять, какое количество колонок браузеры будут устанавливать в контейнере. Мы всё еще будем использовать функцию calc() для этого, но код в конечном счете станет чище

.flex-container {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
}
.flex-item {
    flex: 1 1 calc((100% / 3) - 2rem);
}


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

Бонус: Gap также облегчает достижение отзывчивости


В нашем изначальном примере, если мы хотели изменять количество колонок контейнера в определенных контрольных точках, приходилось пересчитывать ширину И изменять nth-child селекторы, чтобы избавиться от margins.

В примере с использованием gap, всё что нам нужно делать, это корректировать свойство flex-basis, и всё готово.

.flex-item {
    flex: 1 1 100%; // 1 across at mobile
}
@media (min-width: 640px) {
    .flex-item {
        flex-basis: calc((100% / 2) - 1rem); // 2 across at tabletish
    }
}
@media (min-width: 1024px) {
    .flex-item {
        flex-basis: calc((100% / 3) - 2rem); // 3 across at desktop
    }
}


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

Заглядывая в будущее


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

Дополнение от переводчика


Вроде всё же есть приём, позволяющий уже сейчас избавиться от необходимости с помощью, например nth-child(3n) убирать правые отступы у Flex-элементов, прилегающих к правому краю контейнера, да еще и корректируя каждый раз, когда меняется количество колонок во Flex-контейнере.

Конечно, он тоже не идеальный и заключается в следующем:

  1. В HTML-разметке Flex-контейнер обернуть в дополнительный тег-обертку
  2. Для дочерних элементов, например, вместо margin-right: 10px, задавать margin-left: 10px
  3. А чтобы компенсировать увеличивающийся левый отступ, необходимо задать для Flex-контейнера свойство с отрицательным значением margin-left: -10px;

Результат можно посмотреть на CodePen.

Let's block ads! (Why?)

[Перевод] Тренинг Cisco 200-125 CCNA v3.0. День 45. Настройка OSPF

На прошло видеоуроке мы изучили раздел 2.4 тематики ICND2, где я в очень доступной манере рассказал, как работает протокол OSPF, как формируются соседские отношения роутеров и создаются таблицы маршрутизации. Сегодня мы ещё немного рассмотрим теорию вопроса, после чего перейдём к Packet Tracer и займемся настройкой топологии сети.

Когда мы говорим об общей среде Shared medium, то чаще всего имеем в виду Интернет. Рассмотрим сеть, состоящую из 4-х роутеров, каждый из которых подключен к свитчу. Свитч представляет собой общую широковещательную среду, потому что благодаря свитчу сообщение, отправленное роутером R1, будут «слышать» все остальные устройства.

Все маршрутизаторы представляют собой OSPF-устройства, настроенные на восприятие мультикастового адреса. В этом заключается проблема, потому что в данной сети образуется слишком много трафика, ведь каждый роутер стремиться поделиться с остальными всеми маршрутами, которые ему известны. Синхронизация LSDB затрачивает огромный объем трафика, это крайне неэффективное использование каналов связи и пустая трата пропускной способности. OSPF решает эту проблему, выбрав в широковещательном домене один из роутеров в качестве выделенного маршрутизатора Designated router D.R, а другой – в качестве резервного выделенного маршрутизатора Backup designated router, B.D.R. При этом роутеры делятся базами не каждый с каждым, а передают свои LSDB только DR, а тот уже делиться ими с остальными устройствами. При этом сетевой трафик при использовании OSPF сокращается в разы.

Выбор DR осуществляется по критериям, одним из которых является идентификатор роутера Router ID. На последнем уроке я говорил о том, что для установления соседства параметры сообщений Hello роутеров должны совпадать. Так вот, к идентификатору процесса OSPF Process ID, которому принадлежит интерфейс роутера, это не относится – первый роутер R1 может иметь идентификатор 1, а второй роутер R2 – идентификатор 2, то есть два соседних маршрутизатора могут иметь разные идентификаторы.

Примечание переводчика: программное обеспечение Cisco IOS может запускать несколько процессов OSPF на одном маршрутизаторе, при этом идентификатор процесса OSPF Process ID просто отличает один процесс от другого.

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

Если эти два роутера будут участвовать в выборе выделенного роутера, то маршрутизатор с большим Process ID = 2 станет D.R, так как приоритетом обладает большее значение, а роутер с Process ID = 1 станет B.D.R. В большинстве случаев Process ID различны, но иногда могут совпадать. В этом случае для выбора D.R. используется второй параметр – идентификатор роутера Router ID, или RID. Роутер с большим значением RID становится D.R.

Необходимость резервного маршрутизатора объясняется тем, что роль D.R очень важна. Если выделенный роутер выходит из строя, B.D.R немедленно занимает его место, и происходит выбор нового B.D.R. При этом, если роль D.R перешла к роутеру R3, а бывший D.R роутер R4 снова становится работоспособным, ему тут же будет назначена роль B.D.R. Таким образом, если роутер вышел из строя и перегрузился, ему не будет автоматически возвращена предыдущая роль, потому что в его отсутствие в сети уже произошли новые «выборы» D.R. Даже если в сети появится роутер с характеристиками лучшими, чем имеет нынешний D.R роутер R3, например, это будет R1 или R2, то этот роутер станет B.D.R, а роутер R3 все равно будет играть роль «главного», пока сам не выйдет из строя. Если R4 вернется в сеть, роутер R3 не передаст ему роль D.R несмотря на то, что R4 обладает лучшими характеристиками. На прошлом уроке мы обсуждали полную смежность, или Full Adjacency. Отношения между D.R. и остальными устройствами всегда представляют собой полную смежность.

Я исправлю ошибку на нижней линии – здесь должно быть не FULL/DR, а FULL/B.D.R, потому что показана полная смежность с резервным выделенным маршрутизатором. Каналы с роутерами R2 и R3 обозначены как линии связи с полной смежностью с остальными устройствами. Со стороны B.D.R топология выглядит таким образом: FULL/DR по отношению к DR, то есть полная смежность с DR, и FULL/DROTHER в отношении остальных роутеров.

С точки зрения роутера R2 отношения соседства строятся таким образом — извиняюсь за ошибки, сейчас я их исправлю. С D.R. установлены отношения FULL/DR, с резервным маршрутизатором FULL/BDR, а с роутером R1 – двусторонняя связь и DROTHER.

Замечу, что если устройства не являются DR или BDR, то по протоколу OSPF между ними всегда устанавливается двустороння связь 2WAY. Вид соединения 2WAY/DROTHER означает, что если роутер R2 будет выбран в качестве D.R или B.D.R, то параметры роутеров R1 и R2 все равно будут совпадать. Устройствам не нужно будет обмениваться LSA, как если бы осуществлялась простая двусторонняя связь, но при этом соединение сразу же перейдет в состояние полной смежности FULL. Аналогичная ситуация имеет место, если смотреть на топологию сети с точки зрения роутера R1.

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

OSPF создает 3 базы данных. Первая – это база данных о смежных устройствах Adjacency Database, которая содержит в себе таблицу соседей роутера Neighbor Table, то есть список всех устройств, с которым роутер установил двустороннее соединение. Эта база не нуждается в особом изучении, вы просто должны знать о её существовании. Это понятие больше относится к уровню курса CCNP, а не CCNA.

Вторая — это база данных канального уровня LSDB, которую мы рассматриваем последнее время. В ней содержится вся информация о состоянии каналов всех маршрутизаторов, то есть общая топология сети. Все маршрутизаторы имеют одинаковую LSDB, то есть одинаковую таблицу топологии сети Topology Table. Замечу, что в Packet Tracer команда проверки таблицы топологии не работает. Но вам не понадобится её проверять, вы просто должны знать о существовании этой базы данных.

Третья база данных Forwarding Database содержит таблицы маршрутизации Routing Table – списки маршрутов, сформированные каждым роутером с помощью алгоритма SPF. Таким образом, вы должны знать о существовании 3-х баз и трех таблиц OSPF.

Теперь давайте рассмотрим настройку роутера для работы с OSPF. Как вы помните из тематики RIP, ключевым словом в команде настройки любого протокола маршрутизации является слово «router». Любой динамический протокол маршрутизации начинается с этого слова.

Если у нас протокол RIP, то используется команда router rip, если OSPF – router ospf, а если EIGRP, то router eigrp. В режиме глобальной конфигурации нужно набрать команду router ospf <process #>, где параметр в скобках – это номер процесса Process ID. Как только вы введете эту команду, то сразу перейдете в режим подкоманд роутера. Далее, как и в случае RIP, мы используем ключевое слово network и указываем идентификатор сети network-id.

В RIP мы указывали полноклассный идентификатор типа 10.0.0.0. и маску подсети, здесь поступают аналогично, но вместо маски подсети указывают обратную маску wcm – wildcard mask. Затем добавляется ключевое слово area – зона и указывается её номер. Если сеть расположена в одной зоне, то её номер всегда равен 0. В случае мультизонирования одна из зон будет иметь нулевой номер, а другие – свои порядковые номера, причем все остальные зоны должны быть соединены с нулевой, поскольку это основная зона сети.

Давайте проведем настройку небольшой сети с помощью Packet Tracer.

Я заранее настроил интерфейсы роутеров R1-R4, присвоив им IP-адреса 192.168.1.1 – 192.168.1.4 и значения интерфейсов возвратной петли loopback interface 1.1.1.1, 2.2.2.2, 3.3.3.3 и 4.4.4.4. Из-за наличия интерфейсов loopback в качестве RID для каждого из роутеров принимается IP-адрес этих интерфейсов, то есть идентификатором первого роутера Router ID будет 1.1.1.1 и так далее.
Перейдем в режим глобальных настроек Router 2. Я набираю в командной строке router ospf, после чего нужно ввести идентификатор процесса Process ID. Система выдала подсказку, что это может быть любое число в диапазоне от 1 до 65535. Я выбираю значение 1 и ввожу команду router ospf 1. Затем нужно ввести команду network 192.168.1.0 0.0.0.255.

После этого нужно ввести номер зоны Area ID, и поскольку у нас одна единственная зона, я ввожу команду network 192.168.1.0 0.0.0.255 area 0. Мы также должны настроить интерфейс loopback, поэтому я набираю network 2.2.2.2.

В предыдущей команде мы указали обратную маску 0.0.0.255 – три нуля означают, что в нашем случае три первых октета любого IP-адреса должны быть 192.168.1, то есть совпадать у всех устройств, работающих по протоколу OSPF в данной сети. Таким образом, любое устройство с IP-адресом вида 192.168.1.х сможет участвовать в SPF-процессе.

Для настройки loopback я набираю network 2.2.2.2 0.0.0.0 – это означает, что у нас должны совпадать все 4 октета, и добавляю area 0. Теперь я перехожу к настройкам роутера R1 и последовательно набираю команды conf t, router ospf 1, network 192.168.1.0 0.0.0.255 area 0, network 1.1.1.1 0.0.0.0 area 0.

Поскольку мы начали настройку с роутеров R1 и R2, выборы DR уже состоялись – им стал R2, а R1 превратился в BDR. Далее я настраиваю R3, использовав аналогичные команды: conf t, router ospf 1, network 192.168.1.0 0.0.0.255 area 0, network 3.3.3.3 0.0.0.0 area 0, и роутер R4, введя команды conf t, router ospf 1, network 192.168.1.0 0.0.0.255 area 0, network 4.4.4.4 0.0.0.0, area 0. Теперь зайдем в настройки R1 и введем команду show ip route.

Здесь мы видим два маршрута для роутеров 2 и 3. Сейчас я введу команду show ip ospf neighbors, чтобы посмотреть на четвертый роутер. Как видите, здесь указано состояние SPF для каждого маршрутизатора, которое обновляется каждые 10с – например, для роутера 3.3.3.3 первая информация была получена в 00:00:30, а обновление в 00:00:39. Это означает, что таймер Hello равен 10с.

Каждый раз, как приходит Hello, Dead Time устанавливается на 30с. Мы видим, что 3.3.3.3 является BDR, 2.2.2.2 является DR, а с 4.4.4.4 роутер 1 имеет двустороннюю связь и считает его DROTHER. Я ввожу команду show ip route, чтобы взглянуть на таблицу маршрутизации.

Как видите, роутер 4.4.4.4 в ней так и не появился, поэтому я попробую использовать команду clear ip ospf process. Эту же команду я введу в настройках роутера R3 и роутера R2.

Так мы очистили данные и перезапустили процесс SPF. Давайте посмотрим, что произошло. Я вхожу в настройки R4 и ввожу команду show ip ospf neighbors. Как видите, роутер R4 не упоминает DR, потому что после перезагрузки процесса сам стал выделенным маршрутизатором, так как имеет наbвысший Router ID. Соответственно, роутер R3 стал BDR.

Давайте ещё раз используем команду show ip route. Мы видим, что роутер R4 изучил 3 новых маршрута к роутерам 1,2 и 3.

Теперь перейдем к консоли настроек R1 и введем команду show ip ospf neighbors.

Мы видим состояние 3-х остальных роутеров. Введя команду show ip route, можно увидеть, что роутер R1 изучил маршруты к своим соседям 2,3 и 4.

Как видите, настройка OSPF очень проста, как и проверка настроек, которая выполняется с помощью команды show ip ospf neighbors. Такая проверка позволяет узнать, сформировалось ли соседство маршрутизаторов.

Неполадки могут выражаться в том, что соседство сформировалось, роутеры находятся в состоянии full adjacency, но таблицы маршрутизации все еще не обновились. Лучший способ устранить такую проблему – это очистить процесс OSPF с помощью команды clear ip ospf process. Это вызовет запуск нового процесса и повторный обмен SPF –информацией, то есть обновление таблиц маршрутизации.


Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас оформив заказ или порекомендовав знакомым, 30% скидка для пользователей Хабра на уникальный аналог entry-level серверов, который был придуман нами для Вас:Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от $20 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле? Только у нас 2 х Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ от $199 в Нидерландах! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — от $99! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?

Let's block ads! (Why?)

[Из песочницы] Я пережила выгорание, или Как остановить хомячка в колесе

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

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

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

image

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

Таймлайн


Семь лет я работала в веб-студии. Когда начинала, HR видел во мне перспективного сотрудника: мотивированного, увлечённого, готового к большим нагрузкам, стрессоустойчивого, обладающего нужными soft skills, умеющего работать в команде и поддерживающего корпоративные ценности. Я только вышла из декрета, сильно соскучилась по нагрузке на мозг и рвалась в бой. Первые год-два мои желания воплощались: я активно развивалась, ездила на конференции и бралась за всякие интересные задачи. На работу уходило много времени и сил, но она и заряжала меня энергией.

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

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

image

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

Автоматизм и инерция


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

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

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

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

image

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

Как сварить лягушку


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

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

Ад перфекциониста


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

image

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

День, когда я сломалась


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

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

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

Техника спасения


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

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

  1. Если выгорание дошло до стадии, когда появились физические симптомы — сначала «маску на себя», то есть помогите себе выжить. Бессонница, отсутствие аппетита или неконтролируемое переедание, необъяснимые боли, скачки давления, тахикардия или другое ухудшение самочувствия — сейчас важно стабилизировать физическое состояние. Исходя из своих симптомов, я сразу обратилась к психотерапевту. Специалист предсказуемо спросил про отдых и выписал снотворное и транквилизаторы. Не обошлось и без очевидных рекомендаций: сделать передышку на работе, установить строгий режим рабочего дня (три раза ха). Тогда я была истощена настолько, что было менее энергозатратно оставить всё как есть (инерция, бессердечная ты…).
  2. Примите, что изменения неизбежны. Раз уж вы оказались там, где оказались, очевидно, что где-то был баг неверный паттерн, повторяющаяся ошибочная функция. Сразу бежать увольняться не стоит, но придётся пересмотреть как минимум режим дня и свои приоритеты. Изменения неизбежны, и нужно позволить им случиться.
  3. Осознайте, что моментального эффекта не будет. Скорее всего, вы не сразу дошли до того, до чего дошли. Восстановление тоже займёт какое-то время, и лучше не ставить себе планку, сроки или цели. Вообще дать себе время в постоянных дедлайнах, сместить приоритет с работы на собственное самосохранение — это было настолько очевидно, насколько и сложно. Но без этого никакие таблетки не помогли бы. Впрочем, если за месяц этого этапа не изменилось вообще ничего, стоит проконсультироваться со специалистом о смене тактики или найти другого специалиста.
  4. Откажитесь от привычки заставлять себя. Скорее всего, на одних морально-волевых вы дотянули до состояния, когда слово «хочу» исчезло из вашего лексикона, и ваша мотивация — давно уже дохлая лошадь. На этом этапе важно услышать в себе хоть какое-нибудь спонтанное желание и поддержать его. Недели через две регулярного приёма таблеток мне впервые захотелось зайти в магазин косметики по пути. Я провела там максимум минут десять, вспоминая, зачем вообще пришла, и разглядывая этикетки, но это было первое улучшение.
  5. Следуйте полученным рекомендациям и не отмахивайтесь от возможностей. Пока не очень понятно, что дальше и как строить планы на будущее. Поэтому оптимальная стратегия — просто выполнять рекомендации тех, кому доверяете, и быть открытым новым возможностям. Лично я очень боялась зависеть от медикаментозного лечения. Поэтому, как только почувствовала улучшение, отказалась от таблеток. Через несколько дней кровать и сон стали очень знакомо тянуть меня, и я поняла, что лучше пройти курс лечения целиком.
  6. Переключитесь или расширьте угол зрения. Это даст понимание, что одной работой (или одним стеком) жизнь не ограничивается. Подойдёт практически любая не рабочая, новая для вас деятельность, которая потребует внимания. Мне нужны были деньги, поэтому я продолжала работать и выбрала курсы, которые можно было не оплачивать при условии прохождения собеседования. Нечастые, но интенсивные оффлайн-сессии проходили в разных городах. Новые впечатления, новые люди, неформальная атмосфера — я смотрела и осознавала, что за пределами офиса есть жизнь. Ощущения были, как будто я оказалась на Марсе, не вылетая с Земли.

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

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

Как искать работу после выгорания?


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

И всё же на встрече с HR на предсказуемый вопрос «Почему вы ушли с прошлой позиции» я честно ответила, что выгорела.
— Почему вы думаете, что этого не произойдёт снова?
— К сожалению, от этого не застрахован никто, даже лучшие из ваших сотрудников. Мне понадобилось семь лет, чтобы дойти до этого состояния, думаю, за это время можно многое успеть. И у меня остались рекомендации :)

image

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

Let's block ads! (Why?)

В Chrome Canary добавили поддержку протокола HTTP/3


QUIC позволяет мгновенно установить повторное соединение (0-RTT) и обеспечивает минимальную задержку между отправкой запроса и получением ответа

Google Chrome Canary стал первым браузером, в который интегрирована (очень) экспериментальная поддержка протокола HTTP/3, где вместо TCP в качестве транспортного уровня используется протокол QUIC.

HTTP/3 — это новый синтаксис HTTP, который работает на IETF QUIC, мультиплексированном и безопасном транспорте на основе UDP. Хотя некоторые разработчики называют QUIC на UDP «дичайшим экспериментом», новый протокол сулит массу преимуществ.
С момента принятия стандарта HTTP/2 прошло три с половиной года: спецификация RFC 7540 опубликована в мае 2015-го, но пока не используется повсеместно. Протокол реализован во всех браузерах ещё с конца 2015 года, а спустя три года только 40,9% из 10 млн самых популярных интернет-сайтов поддерживают HTTP/2.


Несмотря на принятие HTTP/2 на основе SPDY в качестве стандарта RFC 7540, инженеры Google продолжили эксперименты с ускорением транспорта. До 2015 года они выпустили новые версии SPDY v3 и v3.1, а также начали работать над протоколом gQUIC, первый черновик которого опубликовали в начале 2012 года.

В ранних версиях gQUIC использовался синтаксис HTTP SPDY v3. Такой выбор имел смысл, потому что HTTP/2 ещё не утвердили. Бинарный синтаксис SPDY упакован в пакеты QUIC, которые отправляются в датаграммах UDP. Это отход от транспорта TCP, на который традиционно полагался HTTP. Вся система в сборе выглядела так:


Слоёный пирог SPDY по gQUIC. Иллюстрация из статьи «HTTP/3: от корней до кончиков»

Затем разработку передали в IETF для стандартизации. Здесь она разделилась на две части: транспорт и HTTP. Идея была в том, что транспортный протокол можно использовать также для передачи других данных, а не только эксклюзивно для HTTP или HTTP-подобных протоколов. Однако название осталось таким же: QUIC. Разработкой транспортного протокола занималась рабочая группа QUIC Working Group в Инженерном совета интернета (IETF).

В то же время Google продолжила работу над своей собственной реализацией — и внедрила её в браузер Chrome не дожидаясь стандартизации.

Разноголосицу в версиях и именованиях QUIC объясняет Дэниель Стенберг, ведущий разработчик curl, работающий в Mozilla, который давно следит за этой историей.

По его словам, до стандартизации HTTP/3 в кругу разработчиков получили распространения неформальные названия двух версий QUIC, поскольку варианты от IETF и Google значительно различаются в деталях реализации:

  • iQUIC (версия IETF)
  • gQUIC (версия Google)

Протокол для передачи HTTP по iQUIC (версия IETF) долгое время называли “hq” (HTTP-over-QUIC).

Объединить iQUIC и gQUIC под названием HTTP/3 в сентябре 2018 года предложил Марк Ноттингем, один из самых влиятельных инженеров IETF, соавтор нескольких веб-стандартов. По его словам, это поможет устранить путаницу между QIUC-транспортом и QUIC-оболочкой для HTTP.

Таким образом, HTTP/3 — это новая версия HTTP, которая будет использовать транспорт QUIC.


Основные преимущества QUIC, из документа QUIC Geek FAQ (в изложении Opennet):
  • Высокая безопасность, аналогичная TLS (по сути QUIC предоставляет возможность использования TLS поверх UDP).
  • Контроль за целостностью потока, предотвращающий потерю пакетов.
  • Возможность мгновенно установить соединение (0-RTT, примерно в 75% случаях данные можно передавать сразу после отправки пакета установки соединения) и обеспечить минимальные задержки между отправкой запроса и получением ответа (RTT, Round Trip Time).
  • Не использование при повторной передаче пакета того же номера последовательности, что позволяет избежать двусмысленности при определении полученных пакетов и избавиться от таймаутов.
  • Потеря пакета влияет на доставку только связанного с ним потока и не останавливает доставку данных в параллельно передаваемых через текущее соединение потоках.
  • Средства коррекции ошибок, минимизирующие задержки из-за повторной передачи потерянных пакетов. Использование специальных кодов коррекции ошибок на уровне пакета для сокращения ситуаций, требующих повторной передачи данных потерянного пакета.
  • Криптографические границы блоков выравнены с границами пакетов QUIC, что уменьшает влияние потерь пакетов на декодирование содержимого следующих пакетов.
  • Отсутствие проблем с блокировкой очереди TCP.
  • Поддержка идентификатора соединения, позволяющего сократить время на установку повторного соединения для мобильных клиентов.
  • Возможность подключения расширенных механизмов контроля перегрузки соединения.
  • Использование техники прогнозирования пропускной способности в каждом направлении для обеспечения оптимальной интенсивности отправки пакетов, предотвращая скатывание в состояние перегрузки, при которой наблюдается потеря пакетов.
  • Заметный прирост производительности и пропускной способности, по сравнению с TCP. Для видеосервисов, таких как YouTube, применение QUIC показало сокращение операций повторной буферизации при просмотре видео на 30%.

По словам Марк Ноттингема, переход от устаревшего TCP на новые протоколы просто неизбежен, поскольку сейчас очевидно, что TCP страдает от проблем неэффективности: «Поскольку TCP — протокол доставки пакетов по порядку, то потеря одного пакета может помешать доставке приложению последующих пакетов из буфера. В мультиплексированном протоколе это может привести к большой потере производительности, — объясняет Марк Ноттингем. — QUIC пытается решить эту проблему с помощью эффективной перестройки семантики TCP (вместе с некоторыми аспектами потоковой модели HTTP/2) поверх UDP».

Кроме того, любая версия требует обязательного шифрования: нешифрованного QUIC не существует вообще. iQUIC использует TLS 1.3 для установки ключей сессии, а затем шифрования каждого пакета. Но поскольку он основан на UDP, значительная часть информации о сессии и метаданных, открытых в TCP, шифруется в QUIC:

В статье «Будущее интернет-протоколов» Марк Ноттингем говорит о значительных улучшениях в безопасности с переходом на QUIC: «На самом деле текущий "короткий заголовок" iQUIC — который используется для всех пакетов, кроме рукопожатия — выдаёт только номер пакета, необязательный идентификатор соединения и байт состояния, необходимый для процессов вроде смены ключей шифрования и типа пакета (который тоже может быть зашифрован). Всё остальное зашифровано — включая пакеты ACK, что значительно повышает планку для проведения атак с анализом трафика. Кроме того, становится невозможна пассивная оценка RTT и потерь пакетов путём простого наблюдения за соединением; там недостаточно информации для этого».

Некоторые специалисты считают, что принятие стандарта HTTP/3 произошло бы и раньше, если бы компания Google не поспешила внедрить свою реализацию в браузер Chrome. Тем не менее, прогресс неизбежен — и в ближайшие годы можно ожидать дальнейшего распространения HTTP/3. Поддержка протокола в Chrome Canary — только начало. У Mozilla уже есть такие планы для браузера Firefox.

Для включения HTTP/3 требуется запустить Chrome Canary с опциями --enable-quic —quic-version=h3-23. Потом зайти на тестовый сайт quic.rocks:4433 — и вы увидите соответствующее уведомление.

В инструментах для разработчиков активность HTTP/3 отображается как "http/2+quic/99".

Let's block ads! (Why?)

Портативный GPS трекер BOXY. Следим за всеми и за всем…

Здравствуйте друзья.
Сегодня хочу рассказать о компактном GPS трекере BOXY.
Данный трекер предназначен для отслеживания через GPS всего, к чему он прикреплен. Это может быть собака, корова, радиоуправляемая машинка или квадрик, ребёнок, автомобиль и т.д. Сфера применения ограничена лишь вашей фантазией и потребностью.
Начну как и положено с характеристик:
GPS-трекер BOXY
Размеры, мм 40х26х11
Вес, г 21
Время автономной работы до 72 часов
Управление с моб. устройств со смартфона через мобильное приложение 365GPS
Позиционирование через системы GPS/LBS
Предназначен для работы в сетях 2G
Отслеживание устройства по запросу или через заданные интервалы времени
Для работы необходимо приобрести SIM карту с включенным пакетом передачи данных
Форм-фактор сим-карты nanoSim
Комплектация
BOXY GPS-трекер -1шт.
Шнурок на руку -1шт.
Кабель micro USB -1шт.
Руководство по эксплуатации -1 шт.

image
image
image
Данный трекер приобретался в интернет-магазине Даджет
Доставка осуществлялась транспортной компанией DPD лично в руки.
В полученной посылке находилась коробочка с GPS трекером:
image
image
image
Комплектация состоит из USB шнура, шнурка темляка, трекера и инструкции:
image
Инструкция, кстати, на русском языке, проблем с настройкой не возникает:
image
Шнур в комплекте с MicroUSB штекером.
Проблем с заменой не будет:
image
Шнурок темляк также может пригодиться:
image
Не скажу, что комплектация богатая, но всё что нужно есть.
Теперь о самом трекере.
Представляет он собой небольшую коробочку из пластика. С одной стороны надпись Boxy. Это крышка, которая снимается:
image
С другой стороны просто пластик.
Все торцы пустые, кроме одного. На одном находится порт microUSB:
image
Размеры трекера достаточно компактные:
image
image
Для того чтобы открыть трекер, нужно поддеть крышку ногтём или тонким предметом. Открываем крышку и видим QR-код для подключения трекера к программе, IMEI (по понятным причинам я его скрыл), слот для SIM карты, кнопку включения, отверстие для перезагрузки и три индикатора:
image
Для того чтобы поставить симку, нужно сдвинуть крышку и поднять её вверх:
image
Трекер готов к работе:
image
image
О работе трекера можно понять по поведению трех светодиодов. Первый, синий. На фото он не горит. Он информирует о GPS сигнале. Если моргает быстро, значит идёт поиск GPS спутников. Если моргает медленно, связь со спутниками налажена. Если горит постоянно, значит что-то не так.
Средний желтый светодиод отвечает за индикацию работы в сотовой сети. Моргает быстро-поиск сети и соединение. Моргает медленно, сеть найдена, подключено.
Ну и крайний красный светодиод это уровень батареи. На зарядке горит красным, во время работы моргает раз в несколько секунд. Если батарея имеет низкий заряд, моргает быстро.
Кстати про сотовую сеть.
Данный трекер работает ТОЛЬКО с сетями 2G. И для использования нужно найти оператора который 2G поддерживает.
Для РФ например хорошо подходят следующие операторы и тарифы:
МТС
Билайн
Sim2m
Кстати у меня с трекером в первый раз возникла проблема. Я поставил симку, но она не хотела подключаться к интернету. Я сперва думал, что у меня бракованный трекер, но всё оказалось гораздо проще. Просто в трекере не были прописаны настройки APN для моего сотового оператора. Если у вас возникнет такая же проблема, это легко решается.
Управление трекером производится не только через приложение, но и посредством СМС команд.
Просто посылаем СМС на номер который установлен в трекере, в самом смс пишем следующее:
APN#настройки APN вашего оператора#
В моем случае это выглядело вот так:
APN#internet.tele2.kz#
Я отправил, в ответ пришло сообщение о том что настройки успешно применены, и трекер сразу же подключился к сети 2G
image
Кстати через СМС можно не только добавлять APN, но и выполнять некоторые другие команды.
Команда для прописывания APN APN # параметр # учетная запись # Пароль #
Команда для того чтобы узнать IMEI: IMEI#
Команда для получения по смс текущих координат: 999
Теперь когда сеть настроена, GPS «поймался», трекер расположен в нужном месте, можно скачивать и устанавливать приложение.
Для этого с маркета нам нужно установить программу 365GPS
image
После установки заходим в программу. В качестве логина используем IMEI номер трекера. В качестве пароля по умолчанию цифры 123456
И всё. Спустя некоторое время получаем на телефон местоположение трекера.
Можно смотреть как текущее положение, так и маршрут. Для удобства используется карта гугл. Всё наглядно и понятно:
image
image
С программой разобрались. А теперь собственно зачем мне нужен этот трекер?
А всё просто. Есть у нас пёс. Той терьер.
Вот такой:
image
Он уже достаточно взрослый и достаточно самостоятельный. И вот любит он иногда убегать с поводка.
А потом начинаются поиски. Он бегает по всему кварталу, а моя мать бегает по кварталу и ищет его.
Теперь же мы просто взяли небольшой поводок с кармашком. Вкладываем в него трекер и идём гулять.
Правда за неделю использования пёс еще ни разу не сбежал. Поэтому мне самому конечно будет посмотреть на его путешествия. Но случая не предоставилось. Зато теперь при случае можно будет гораздо проще его найти и забрать домой.
Заключение:
Маленький компактный трекер BOXY может помочь в различных ситуациях. В моём случае — это слежение за псом. В вашем случае может быть и другой сценарий. В целом устройство получилось достаточно компактным, функциональным и полезным.
И действительно работающим.
Поэтому могу смело рекомендовать устройство к покупке.

Let's block ads! (Why?)