Сообщество - Web-технологии

Web-технологии

534 поста 5 786 подписчиков

Популярные теги в сообществе:

6

11 инструментов для вашего IT бизнеса которые сделают его стабильнее в нестабильное время

Порой случаются события, которые не должны случаться. Мы в “Искусство Автоматизации” за 4 года создания digital-продуктов собрали все из них (ну или те, что касаются IT продуктов). Делимся опытом, инструментами и подходами, которые сделали нашу деятельность стабильнее.

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


1. Мониторинг


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


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


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


• валидности SSL-сертификата;


• доступности сервиса (HTTP 200);

• телеметрии сервера (свободное место, нагрузка на CPU, загрузка RAM).


И уже первым узнаете о падении вы, а не заказчик.


2. Бэкапы

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


Наши выводы:


• бэкапить проект у разных хостинг-провайдеров;


• скриптом проверять наличие бэкапов, нет бэкапа -> пуш в Telegram-бота;

• исходников в Git недостаточно, бэкапить не только базу, но и код с конфигами;

• шифровать бэкапы;

• раз в N-месяцев проверять сохранность данных, восстанавливаясь из бэкапов.

3. Доступы


Нам доставались проекты по наследству, архитектуру которых мы восстанавливали методом «археологических» раскопок. Кто-то хранит доступы в Google-таблицах, кто-то в Telegram-чатах, а кто-то даже пользуется менеджерами паролей. Мы используем bitwarden.


Для любого digital-проекта важно хранить доступы:


• к внешним сервисам (почты, домены, аккаунты в сторах, хостинг);


• к серверам (с описанием, какие сервисы запущены на какой машине).

4. Тестовые данные


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


• большинство современных веб-фреймворков имеют функцию наполнения БД (seeding), необязательно заполнять вручную данные, их можно сгенерировать;


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


• как выглядят интерфейсы при заполненных данных? Правильно ли отрабатывает пагинация, поиск, верстка на месте?


5. 4хх, 5хх, ххх страницы


Никто не застрахован от 500-х ошибок и падения сервера. Но что видит пользователь в этот момент? Debug-log фреймворка или красивую страницу с «мы знаем что-то сломалось, уже чиним» — зависит от разработчика. Наши рекомендации:


• на этапе макетирования позаботиться о дизайне 4хх и 5хх страниц;


• проверить не включен ли debug-мод на продакшене;

• на этапе тестирования сымитировать 4хх и 5хх ошибки и проверить, что будет видеть пользователь;


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

6. Как выглядит интерфейс под разными учетными записями


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


• когда в нем не будет ни одной записи (напр. пустая корзина, пустой список заказов);


• при частичном заполнении (напр. указаны фамилия, имя, но нет отчества);

• после валидации полей (в правильных ли местах всплывают подсказки).

7. Стресс-тест

Сделали digital-продукт, запустили трафик, проект упал. Было такое? У нас тоже. Как можно было это предусмотреть заранее: провести стресс-тест. Для несложных проектов можно использовать JMeter, для более сложных — поискать облачные решения, например, loader.io.


И вот уже вы знаете, что 500 одновременных подключений сервис выдерживает, 5000 — нет.


8. Ваш проект запустят на калькуляторе, вы готовы?

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


Необязательно покупать для тестов парк смартфонов, но запустить эмуляцию смартфона и открыть в браузере сервис или мобильное приложение — вполне. Мы так обнаружили, что в приложении на iphone 5s форму регистрации видно, а вот кнопку «Зарегистрироваться» — нет.


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


9. Откатываемся


Билд готов, протестирован, выкатили на продакшен, посыпались 500-е ошибки. Shit happens. О том, что делать в такой ситуации, можно задуматься заранее и предпринять меры:


• поддерживать stage-среду в актуальном состоянии;


сине-зеленый деплой;

• согласовать релизы на время минимальной нагрузки.


10. Логируемся


С чего начинается разбор полетов? Конечно, с просмотра логов. Слишком подробные логи — плохо, забивается место на диске; логи вида «500 internal server error(точка)» — заставляют грустить разработчика. Наши советы по этому вопросу:


• настроить ротацию логов (логи старше 1 месяца отгружаются на архивный сервер или удаляются);


• добавить в логи ID для каждой ошибки, это упростит общение по всем линиям технической поддержки;


• не выводить в явном виде пароли пользователей в логах;

• использовать инструменты менеджмента логов (ELK-стек, Sentry);

• не только логировать бэкенд, но и события на фронте (мы используем Sentry)


11. Дашборды со старта проекта


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


В стартовый набор метрик входит:


• количество пользователей;


• динамика регистраций;

• динамика business value actions (кол-во заказов, кол-во транзакции).

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


Для преобразований данных используем Airflow. Для построения дашбордов используем Metabase (благо поднимается одной строчкой кода в Docker).


Пишите в комментариях, какие уроки вы нашли полезными, а что я пропустил?

Показать полностью 4
4

Как перестать велосипедить или 4 self-hosted сервиса для начинающего СТО

Я знаю многое о велосипедах в Enterprise-разработке. Видел издали, катался на них, собирал сам, но наступают моменты, когда типичные задачи пора перевести на типичные решения. В статье расскажу о 4 self-hosted сервисах, которые освобождают уйму времени на действительно важные вещи.

Мы в "Искусство Автоматизации" занимаемся заказной разработкой MVP (мобильных приложений, веб-сервисов, чат-ботов) со средним сроком цикла разработки 2 месяца. Это срок, в который нужно уже запустить готовое решение для новых пользователей. Об общих подходах к стабильной разработке ИТ-продуктов рассказал в другой статье, а в этой статье расскажу про инструменты.


За 4 года ведения ИТ-продакшена ярко выделись следующие однотипные запросы к проекту:


• показывать метрики, что происходит с проектом;


• мониторить доступность сервисов;


• шарить статичные файлы (отчеты, сборки);


• интегрироваться с соседними сервисами.

Итак, переходим к самим сервисам.


Metabase


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


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


Вот уже два года в каждом нашем проекте мы используем BI-утилиту Metabase.


Вкратце о возможностях продукта:


• подключение к почти любым источникам данных (SQL/noSQL);


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


• шеринг дашбордов и показателей по ссылке, встраиваемые фреймы.


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

За 3 минуты можно собрать пульс-дашборд и показать его заказчику


Из минусов Metabase:


• довольно прожорлив к серверным мощностям (Java все-таки);


• скудноватая коллекция готовых виджетов


Сайт проекта | Docker-образ


Uptime Kuma


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


• мониторинга доступности сервисов;


• срока действия SSL-сертификатов;


• получаем уведомления в Telegram.

Не скрою, интерфейс нас тоже подкупил, выглядит по мне более приятно, чем Zabbix

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


Сайт проекта | Docker-образ


NextCloud


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

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


Из плюсов:


• шеринг файлов по ссылке;


• гибкая настройка прав доступа;


• приятный интерфейс.


Из минусов, обнаружили, что при большом количестве файлов в директории (больше 1000), интерфейс подлагивает. Видимо, не завезли lazy-load для списка объектов.


Сайт проекта | Docker-образ


Apache NiFi


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


По сути, это ETL-комбайн по построению data-pipelines. Из коробки 100+ коннекторов ко всем популярным источникам данных (шины, базы, HTTP etc). А если вдруг не найдется нужный, можно написать свой.

Настройка data-pipelines происходит в веб-интерфейсе

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


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


Сайт проекта | Docker-образ


Резюме


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


А какие сервисы используете вы при создании своих ИТ-продуктов?

Показать полностью 5
20

Нужна подработка. Есть чо?

Уважаемые! Нужна подработка. Пока машинка в ремонте и таксовать не могу. А могу взять вашу рутину для низкоквалифицированных падаванов.
Могу в разные панельки вирт хостинга, вордпресс, вукоммерс, поправить html/css по конкретным запросам, муторно и долго заполнять карточки товаров и т.п. Гуглю норм, решения нахожу.

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

Не уверен, туда ли я зашёл, если чо снесите.
тг @cccapwe11

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

4

На что способен Vue.js

Я, ведущий Денис Басковский, беру интервью у Vue.js разработчика Анастасии Егоровой. В этом подкасте мы поговорим про фреймворк Vue.js, который набирает популярность у Front-End разработчиков со всего мира.

32

Адаптивная вёрстка: что это, а главное зачем

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

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


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

Наш уютный канал в телеграме

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



Частичное решение: делаем всё гибким


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

Итан Маркотт (Ethan Marcotte) создал простой шаблон, демонстрирующий использование гибкой вёрстки:

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


- Hiding and Revealing Portions of Images;

- Creating Sliding Composite Images;

- Foreground Images That Scale With the Layout.


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

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


<h1 id="logo"> 
<a href="#"><img src="site/logo.png" alt="The Baker Street Inquirer"/>
</a> </h1>

Элемент h1 содержит изображение в качестве фона, а картинка выровнена относительно фона контейнера (заголовка).



Гибкие изображения


Работа с картинками — одна из самых главных проблем при работе с адаптивной вёрсткой сайтов. Существует много способов для изменения размера изображений, и большинство из них довольно просто реализовать. Одно из решений — использование max-width в CSS:


img {max-width: 100%;}

Максимальная ширина изображения равняется 100% от ширины экрана или окна браузера, поэтому чем меньше ширина, тем меньше картинка. Обратите внимание, что max-width не поддерживается в IE, поэтому используйте width: 100%.


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



Ещё один способ: отзывчивые изображения


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


Для этого нужно скачать файл picturefill.js, а затем написать следующий код, внутри тега head:


<script src="picturefill.js"></script>

Чтобы подгрузка этого файла не влияла на загрузку сайта, рекомендуем добавить в тег script атрибут async. Это позволит сайту загружаться не дожидаясь файла picturefill.js. Однако, для того чтобы старые браузеры распознавали элементы picture, вам нужно добавить строку, document.createElement( "picture" ); перед первым тегом script.


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


<img
sizes="(min-width: 40em) 80vw, 100vw"
srcset="examples/images/medium.jpg 375w,
examples/images/large.jpg 480w,
examples/images/extralarge.jpg 768w"
alt="…">

Атрибут sizes используется для того, чтобы указать сколько места будет занимать изображение. Подробнее о значениях sizes и srcset здесь.

Для более явного контроля над изображениями существует элемент picture.

Интересная фича для iPhone


В iPhone и iPod touch есть особенность: дизайн, созданный для больших экранов, просто сожмется в браузере с маленьким разрешением без скролла или дополнительной мобильной вёрстки. Однако изображений и текста не будет видно:

Для решения данной проблемы используется тег meta:

<meta name="viewport" content="width=device-width; initial-scale=1.0">

Если initial-scale равно единице, ширина картинок становится равной ширине экрана.

Настраиваемая структура макета страницы


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


Например, у вас есть главный файл со стилями, который задает #wrapper, #content, #sidebar, #nav вместе с цветами, фоном и шрифтами. Если ваши главные стили делают макет слишком узким, коротким, широким или высоким, вы можете это определить и подключить новые стили.


style.css (основной):

/* Основные стили, которые будут унаследованы дочерней таблицей стилей */
html,body{
background...
font...
color...
}
h1,h2,h3{}
p, blockquote, pre, code, ol, ul{}
/* Структурные элементы */
#wrapper{
width: 80%; 
margin: 0 auto; 
background: #fff; 
padding: 20px;
}
#content{
width: 54%; 
float: left; 
margin-right: 3%;
}
#sidebar-left{
width: 20%; 
float: left; 
margin-right: 3%;
}
#sidebar-right{
width: 20%; 
float: left;
}

mobile.css (дочерний):

#wrapper{
width: 90%;
}

#content{
width: 100%;
}

#sidebar-left{
width: 100%;
clear: both;

/* Дополнительные стили для нового дизайна */
border-top: 1px solid #ccc;
margin-top: 20px;
}

#sidebar-right{
width: 100%;
clear: both;

/* Additional styling for our new layout */
border-top: 1px solid #ccc;
margin-top: 20px;
}

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


О других особенностях адаптивной верстки в CSS в статье о нетривиальных моментах разработки фронтэнда на CSS.



Адаптивная вёрстка с помощью медиазапросов CSS3


Рассмотрим, как можно использовать CSS3-медиазапросы для создания адаптивного дизайна. min-width задает минимальную ширину окна браузера или экрана, к которой будут применены определенные стили. Если какое-нибудь значение будет ниже min-width, то стили будут проигнорированы. max-width делает противоположное.


Пример:


@Media screen and (min-width: 600px) {
.hereIsMyClass {
width: 30%;
float: right;
}
}
Медиазапрос заработает только когда min-width будет больше или равна 600 px.


@Media screen and (max-width: 600px) {

.aClassforSmallScreens {
clear: both; font-size: 1.3em;
}
}

В этом случае класс (aClassforSmallscreens) будет работать при ширине экрана меньше или равной 600 px.


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


@Media screen and (max-device-width: 480px) {
.classForiPhoneDisplay {
font-size: 1.2em;
}
}

@Media screen and (min-device-width: 768px) {
.minimumiPadWidth {
clear: both;
margin-bottom: 2px solid #ccc;
}
}

Специально для iPad у медиазапросов есть свойство orientation, значениями которого могут быть либо landscape (горизонтальный), либо portrait (вертикальный):

@media screen and (orientation: landscape) {
.iPadLandscape {
width: 30%;
float: right;
}
}

@media screen and (orientation: portrait) {
.iPadPortrait {
clear: both;
}
}

Также значения медиазапросов можно комбинировать:

@media screen and (min-width: 800px) and (max-width: 1200px) {
.classForaMediumScreen {
background: #cc0000;
width: 30%;
float: right;
}
}

Этот код будет выполнен только для экранов или окон браузеров шириной от 800 до 1200 px.

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

<link rel="stylesheet" media="screen and (max-width: 600px)" href="small.css"/>
<link rel="stylesheet" media="screen and (min-width: 600px)" href="large.css"/>
<link rel="stylesheet" media="print" href="print.css"/>



JavaScript

Если ваш браузер не поддерживает CSS3-медиазапросы, то замену стилей можно организовать с помощью jQuery:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

<script type="text/javascript">
$(document).ready(function(){
$(window).bind("resize", resizeWindow);
function resizeWindow(e){
var newWindowWidth = $(window).width();

// Если ширина меньше 600 px, используется таблица стилей для мобильного
if(newWindowWidth < 600){
$("link[rel=stylesheet]").attr({href : "mobile.css"});
} else if(newWindowWidth > 600){
// Если ширина больше 600 px, используется таблица стилей для десктопа
$("link[rel=stylesheet]").attr({href : "style.css"});
}
}
});
</script>


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

Показать полностью 5
0

Matches

matches

Предыдущие методы искали по DOM.

Метод elem.matches(css) ничего не ищет, а проверяет, удовлетворяет ли elem CSS-селектору, и возвращает true или false.

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

Telegram

Matches

Callback-функции

Callback-функции

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

Telegram

Callback-функции
Отличная работа, все прочитано!