Category: Инструменты

06
Апр
2021

Стек технологий, используемый в работе с Java Virtual Machine

Подборка технологий, инструментов, фреймворков и библиотек для создания утилит и интеграционных решений на Java/Scala.
— Читать дальше «Стек технологий, используемый в работе с Java Virtual Machine»

16
Мар
2021

🐧 16 опций grep, которые помогут вам в реальном мире

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

Перевод публикуется с сокращениями, автор оригинальной статьи Abhishek
Nair.

Название утилиты расшифровывается как Globally search for a REgular expression and Print matching lines. Grep в основном ищет заданный шаблон или регулярное выражение из стандартного ввода или файла и печатает соответствующие заданным критериям строки. Он часто используется для фильтрации ненужных деталей при выводе только необходимой информации из больших файлов журналов.

Мощь регулярных выражений в сочетании с поддерживаемыми опциями в grep делает это возможным.

Начнем!

Синтаксис команды

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

        $ grep [options] pattern [files]
    

Пример:

        $ grep my file.txt
my_file
$
    

1. Поиск в нескольких файлах

Grep позволяет искать
заданный шаблон не только в одном, но и в нескольких файлах с помощью масок (например, знака «*»):

        $ sudo grep -i err /var/log/messages*
    

Вывод:

        $ sudo grep err /var/log/messages*
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
$
    

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

2. Поиск без учета регистра

Grep предлагает искать
паттерн, не глядя на его регистр. Используйте флаг -i, чтобы утилита игнорировала регистр:

        $ grep -i [pattern] [file]
    

Вывод:

        $ grep -i it text_file.txt
This is a sample text file. It contains
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$
    

3. Поиск всего слова

Зачастую вместо
частичного совпадения необходимо полное соответствие поисковому слову. Это можно
сделать, используя флаг -w:

        $ grep -w [pattern] [file]
    

Вывод:

        $ grep -w is text_file.txt
This is a sample text file. It contains
This is a sample text file. It's repeated two times.
$
    

4. Проверка количества совпадений

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

        $ grep -c [pattern] [file]
    

Вывод:

        $ grep -c is text_file.txt
2
$
    

5. Поиск в подкаталогах

Часто требуется выполнить
поиск файлов не только в текущем рабочем каталоге, но и в подкаталогах.
Grep позволяет это сделать с помощью флага -r:

        $ grep -r [pattern] *
    

Вывод:

        $ grep -r Hello *
dir1/file1.txt:Hello One
dir1/file2.txt:Hello Two
dir1/file3.txt:Hello Three
$
    

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

6. Инверсивный поиск

Если вы хотите найти
что-то несоответствующее заданному шаблону, grep и это умеет при помощи флага -v:

        $ grep -v [pattern] [file]
    

Вывод:

        $ grep This text_file.txt
This is a sample text file. It contains
This is a sample text file. It's repeated two times.
$ grep -v This text_file.txt
several lines to be used as part of testing grep
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
$
    

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

7. Печать номеров строк

Если хотите напечатать
номера найденных строк, чтобы узнать их позицию в файле, используйте
опцию -n:

        $ grep -n [pattern] [file]
    

Вывод:

        $ grep -n This text_file.txt
1:This is a sample text file. It contains
7:This is a sample text file. It's repeated two times.
$
    

8. Ограниченный вывод

Для больших файлов вывод может быть огромным и тогда вам понадобится
фиксированное количество строк вместо всей простыни. Можно использовать –m[num]:

        $ grep -m[num] [pattern] [file]
    

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

        $ grep It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$ grep -m2 It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
$
    

9. Отображение дополнительных строк

Иногда необходимо
вывести не только строки по некоторому шаблону, но и дополнительные строки выше
или ниже найденных для понимания контекста.
Можно напечатать строку выше, ниже или оба варианта, используя флаги -A, -B или -C со значением num (количество дополнительных строк, которые будут напечатаны). Это применимо ко всем совпадениям, которые grep находит в указанном файле или в списке файлов.

        $ grep -A[num] [pattern] [file]
    

или

        $ grep -B[num] [pattern] [file]
    

или

        $ grep -C[num] [pattern] [file]
    

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

  • с флагом A1 выведется 1 строка, следующая за основной;
  • B1 напечатает 1 строку перед основной;
  • C1 выведет по одной строке снизу и сверху.
        $ grep numbers text_file.txt
It supports numbers like 1, 2, 3 etc. as well as
$ grep -A1 numbers text_file.txt
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
$ grep -B1 numbers text_file.txt
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
$ grep -C1 numbers text_file.txt
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
$
    

10. Список имен файлов

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

        $ grep -l [pattern] [file]
    

Вывод:

        $ grep -l su *.txt
file.txt
text_file.txt
$
    

11. Точный вывод строк

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

        $ grep -x [pattern] [file]
    

В приведенном ниже
примере file.txt содержится слово «support», а строки без точного совпадения
игнорируются.

        $ grep -x support *.txt
file.txt:support
$ 
    

12. Совпадение по началу строки

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

        $ grep [options] "^[string]" [file]
    

Пример:

        $ grep It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$ grep ^It text_file.txt
It supports numbers like 1, 2, 3 etc. as well as
$
    

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

13. Совпадение по концу строки

Эта полезная регулярка
способна помочь найти по шаблону конец строки:

        $ grep [options] "[string]$" [file]
    

Пример:

        $ grep "\." text_file.txt
This is a sample text file. It contains
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
This is a sample text file. It's repeated two times.
$ grep "\.$" text_file.txt
kind of data but it works best with text data.
alphabets and special characters like - + * # etc.
This is a sample text file. It's repeated two times.
$
    

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

14. Файл шаблонов

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

        $ grep -f [pattern_file] [file_to_match]
    

В примере мы создали файл
шаблонов pattern.txt с таким содержанием:

        $ cat pattern.txt
This
It
$
    

Чтобы это использовать,
применяйте ключ -f:

        $ grep -f pattern.txt text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$
    

15. Указание нескольких шаблонов

Grep позволяет указать
несколько шаблонов с помощью -e:

        $ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]
    

Пример:

        $ grep -e is -e It -e to text_file.txt
This is a sample text file. It contains
several lines to be used as part of testing grep
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$
    

16. Расширенные выражения

Grep поддерживает
расширенные регулярные выражения или ERE (похожие на egrep) с использованием флага -E.

Использование ERE имеет
преимущество, когда вы хотите рассматривать мета-символы как есть и не хотите
заменять их строками. Использование -E
с grep эквивалентно команде egrep.

        $ grep -E '[Extended RegEx]' [file]
    

Вот одно из применений
ERE, когда необходимо вывести строки, например, из больших конфигурационных
файлов. Здесь использовался флаг -v,
чтобы не печатать строки, соответствующие шаблону ^(#|$).

        $ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile      .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem       sftp    /usr/libexec/openssh/sftp-server
$
    

Заключение

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

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

Дополнительные материалы:

16
Мар
2021

🎨 Руководство для начинающих по созданию и анимации изображений SVG

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

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

Создание SVG

Самый простой способ создать SVG – написать код:

        <svg width="100" height="100">
  <circle cx="50" cy="50" r="40" fill="black" />
</svg>

    
Если вы хотите делать более сложные формы, лучше всего взять приложение для работы с векторной графикой, а затем экспортировать изображения в файлы SVG. Для этих целей, большинство разработчиков использует Adobe Illustrator или Sketch. Можно также отметить InkScape и онлайн-инструменты vectr.com или editor.method.ac.

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

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


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


Важное практическое правило: чем меньше параметров, тем лучше! Так ваш код SVG будет чище и легче. Вы сделаете меньше ошибок, если не будете пытаться построить слишком сложные формы или рисованные иллюстрации.

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


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

Экспорт и оптимизация SVG-файлов

Когда значок будет готов, нужно экспортировать его в SVG. Для этого перейдите в: Файл -> Экспорт -> Экспортировать как.


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

Затем перед вами появится окно с параметрами для кода SVG:


В первом раскрывающемся списке необходимо выбрать способ создания CSS. Если у вас всего несколько элементов, лучше поставить «Inline style». Для более сложных иллюстраций есть «Internal CSS». Если вы не хотите использовать имена слоев и групп в качестве идентификаторов, измените раскрывающееся меню «Object IDs» на «Minimal». Это нужно для минимизации кода SVG перед отправкой в production. Если вы работаете над анимацией и хотите иметь более чистый код, снимите этот флажок.

После выбора опций экспортированный код значка выглядит примерно так:

        <svg id="my-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 290 290">
  <title>svg-icon</title>
  <circle id="circle" cx="145" cy="145" r="124.67" style="fill: none;stroke: #cfd8dc;stroke-miterlimit: 10;stroke-width: 20px"/>
  <polyline id="checkmark" points="88.75 148.26 124.09 183.6 201.37 106.32" style="fill: none;stroke: #21b587;stroke-linecap: round;stroke-linejoin: round;stroke-width: 25px"/>
</svg>

    

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

        <svg id="my-icon" aria-labelledby="svg-my-icon-title" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 290 290">
<title id="svg-my-icon-title">Checkmark Icon</title>
<circle class="circle" cx="145" cy="145" r="124.67" style="fill:none;stroke:#cfd8dc;stroke-miterlimit:10;stroke-width:20px"/>
<polyline class="checkmark" points="88.75 148.26 124.09 183.6 201.37 106.32" style="fill:none;stroke:#21b587;stroke-linecap:round;stroke-linejoin:round;stroke-width:25px"/>
</svg>

    

Файлы SVG не занимают много места, что может улучшить скорость загрузки страницы. Если вы хотите еще больше их оптимизировать, попробуйте отличный инструмент – SVGOMG.


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

Анимация и манипуляции с CSS

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

        #my-icon .circle {

  stroke: #21b587;

}
    

Вы без труда найдете множество библиотек JavaScript (Svg.js, SnapSVG) для создания сложных анимаций, однако в большинстве случаев добиться интересного эффекта можно, используя только свойства opacity, scale, translate и colors.

Далее создадим простую анимацию для круга:

         #my-icon .circle {
           	animation: circle-animation 0.5s ease-out forwards;
           	opacity: 0;
           	transform: scale(0.9);
           	transform-origin: center;
}
 
@keyframes circle-animation {
           	100% {
                           	opacity: 1;
                           	transform: scale(1);
           	}
}

    

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

Теперь посмотрим на анимацию значка галочки:

        #my-icon .checkmark {

            stroke-dasharray: 400;

            stroke-dashoffset: 400;

            stroke: #cfd8dc;

            transform-origin: center;

}

@keyframes checkmark-animation {

            40% {

                            transform: scale(1);

            }

            55% {

                            stroke: #cfd8dc;

                            transform: scale(1.2);

            }

            70% {

                            transform: scale(1);

            }

            100% {

                            stroke-dashoffset: 0;

                            transform: scale(1);

                            stroke: #21b587;

            }

}
   animation: checkmark-animation 1s ease-out forwards;
    

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

                    .icon-box {

                            padding: 100px;

                            position: relative;

                            width:200px;

            }

            .icon-box:before {

                            content: 'Hover to see animation.';

                            bottom: 5px;

                            display: block;

                            left: 0;

                            position: absolute;

                            text-align: center;

                            width: 100%;

            }

            .icon-box:hover .circle {

                            animation: circle-animation 0.5s ease-out forwards;

            }

            .icon-box:hover .checkmark {

                            animation: checkmark-animation 1s ease-out forwards;

                            animation-delay: 0.25s;

            }     

            #my-icon .circle {

                            opacity: 0;

                            transform: scale(0.9);

                            transform-origin: center;

            }

            #my-icon .checkmark {

                            stroke-dasharray: 400;

                            stroke-dashoffset: 400;

                            transform-origin: center;

                            stroke: #cfd8dc;

            }

            @keyframes circle-animation {

                            100% {

                                           opacity: 1;

                                           transform: scale(1);

                            }

            }

            @keyframes checkmark-animation {

                            40% {

                                           transform: scale(1);

                            }

                            55% {

                                           stroke: #cfd8dc;

                                           transform: scale(1.2);

                            }

                            70% {

                                           transform: scale(1);

                            }

                            100% {

                                           stroke-dashoffset: 0;

                                           transform: scale(1);

                                           stroke: #21b587;

                            }

            }
                        border: 1px solid #eee;
    
        <div class="icon-box">                                   	
<svg id="my-icon" aria-labelledby="svg-my-icon-title" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 290 290">
<title id="svg-my-icon-title">My Icon</title>
<circle class="circle" cx="145" cy="145" r="124.67" style="fill:none;stroke:#cfd8dc;stroke-miterlimit:10;stroke-width:20px"/>
<polyline class="checkmark" points="88.75 148.26 124.09 183.6 201.37 106.32" style="fill:none;stroke:#21b587;stroke-linecap:round;stroke-linejoin:round;stroke-width:25px"/>
</svg>
</div>

    

Результаты наших экспериментов можно увидеть здесь.

***

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

Удачи вам в обучении и в создании красивых сайтов!

11
Мар
2021

Python-библиотеки, которые пригодятся каждому разработчику на Python

Узнаём у экспертов-питонистов, какие Python-библиотеки они используют и могут посоветовать другим разработчикам.
— Читать дальше «Python-библиотеки, которые пригодятся каждому разработчику на Python»

07
Мар
2021

🕸 Самые удобные браузеры для веб-разработчиков

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

Если какое программное обеспечение разработчики…

05
Мар
2021

🕸 Как найти утечки памяти на сайтах и в веб-приложениях

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

Перевод публикуется с сокращениями, автор оригинальной статьи
Rafal Kuć.

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

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

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

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


Что такое утечка памяти

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

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

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

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

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

  • Замыкания – внутренние функции, имеющие ссылки на переменные внешних. Таким образом внутренняя функция не позволяет сборщику мусора освободить память.
  • Случайные глобальные переменные – ранее необъявленные переменные станут глобальными и не будут освобождены.
  • Несвязанные коллекции – массивы, мапы и наборы позволяют хранить данные в каком-то виде, но с багами в коде они могут привести к утечке памяти из-за вечного хранения ссылок. Такой пример будет рассмотрен ниже.
  • Отсоединенный DOM – элемент Document Object Model, который больше не используется, но на него продолжают ссылаться.
  • Несвязанные таймеры – работающие вечно и сохраняющие объекты таймеры могут привести к утечке памяти.

Как обнаружить утечки памяти: пример приложения

Чтобы
проверить фактическую утечку памяти, создадим простое веб-приложение, имитирующее мониторинг поведения пользователей e-commerce. Страница отслеживает продукты,
с которыми пользователи взаимодействуют при просмотре магазина. Каждое показанное объявление, возвращенный товар из поиска и т. д. – все помещается
в массив. Код выглядит следующим образом:

        function(product, timestamp, page) {
 visited.push({product, timestamp, page})
}
    

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

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

Интеграция Sematext Experience с веб-приложением

Первый шаг – настроить
приложение на использование
Sematext
Browser SDK
для отправки данных в облако Sematext.

Для этого
добавим скрипт перед закрывающим тегом </head>:

        <script type="text/javascript">
 (function(e,r,n,t,s){var a=[];e[s]=function(){a.push(arguments)};e[s].queue=a; var o=[];var i=[];var c=true;var p=void 0;if(window.PerformanceObserver&& window.PerformanceObserver.supportedEntryTypes&&( PerformanceObserver.supportedEntryTypes.indexOf("longtask")>=0|| PerformanceObserver.supportedEntryTypes.indexOf("element")>=0)){ p=new PerformanceObserver(function(e){e.getEntries().forEach(function(e){ switch(e.entryType){case"element":i.push(e);break;case"longtask":o.push(e);break; default:break}})});p.observe({entryTypes:["longtask","element"]})}e[s+"lt"]={ longTasks:o,timingElements:i,inPageLoad:c,observer:p};if(t){var u=r.createElement(n); u.async=1;u.src=t;var f=r.getElementsByTagName(n)[0];f.parentNode.insertBefore(u,f)}})
 (window,document,"script","//cdn.sematext.com/experience.js","strum");
</script>
    

Второй шаг
зависит от типа вашего веб-приложения и используемого фреймворка – нужно сообщить Browser SDK, как ему себя настроить. Например, для стандартного развертывания
нескольких веб-страниц вы бы использовали перед закрывающим тегом </head>
что-то вроде этого:

        <script type="text/javascript">
 strum('config', { token: '<token>', 'receiverUrl': 'https://rum-receiver.sematext.com' });
</script>
    

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

Выявление утечки памяти

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


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


Можно
наблюдать скачкообразные сегменты, но в более длительном периоде использование
памяти остается между максимумом и минимумом и не растет бесконечно. Мы видим,
что в нашем гипотетическом примере e-commerce это не так. Если перейти к
просмотру одной сессии, виден постоянный рост использования памяти с менее
чем 2 МБ до 12 МБ, и нет никакого падения в течение этого времени. Обычно это
означает, что где-то в приложении произошла утечка памяти. Глядя на данные сессии, мы можем видеть загрузку страниц и
HTTP-запросы:


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

Поддерживаемые браузеры

Возможности
измерения памяти Sematext Browser SDK зависят от используемого браузером API для предоставления связанных с памятью метрик. Поддерживается он только в Chrome и проходил испытания Chrome Origin для
Chrome 82-87. Начиная с Chrome 89 API будет полностью доступен — это означает, что пользователям потребуется новейший веб-браузер Google.

Заключение

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

Дополнительные
материалы:

03
Мар
2021

🎨 50 онлайн-инструментов для дизайна: веб-сайты и мобильные приложения

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

25
Фев
2021

Топ 10 Python-библиотек для Data Science

Изучающий data science сталкивается с огромным разнообразием возможностей. Я хочу поделиться с вами своим топом Python библиотек, которые широко используются в data science.
— Читать дальше «Топ 10 Python-библиотек для Data Science»

28
Янв
2021

Создаём собственные правила для ESLint

Опыт написания своих правил для ESLint — инструмента, который позволяет выявлять ошибки и поддерживать единый стиль кода.
— Читать дальше «Создаём собственные правила для ESLint»

07
Янв
2021

Веб-скрейпинг на Python: запускаем парсинг сайтов за 1 час

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

30
Дек
2020

📊 Что такое Big Data простыми словами

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

О тенденция развития больших данных мы писали в статье «Почему Big Data так быстро развивается?». В новой статье расскажем о применениях больших данных простыми словами.

Что такое большие данные?

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

<a href="https://thinkandsell.com/wp-content/uploads/2017/07/big-data-marketing.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

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

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

Как классифицируются большие данные?

Выделим три категории:

  • Структурированные данные, имеющие связанную с ними структуру таблиц и отношений. Например, хранящаяся в СУБД информация, файлы CSV или таблицы Excel.
  • Полуструктурированные (слабоструктурированные) данные не соответствуют строгой структуре таблиц и отношений, но имеют другие маркеры для отделения семантических элементов и обеспечения иерархической структуры записей и полей. Например, информация в электронных письмах и файлах журналов.
  • Неструктурированные данные вообще не имеют никакой связанной с ними структуры, либо не организованы в установленном порядке. Обычно это текст на естественном языке, файлы изображений, аудиофайлы и видеофайлы.
<a href="https://www.google.com/url?sa=i&amp;url=https%3A%2F%2Fwww.msab.com%2F2020%2F03%2F09%2Fbig-data-in-digital-forensics-the-challenges-impact-and-solutions%2F&amp;psig=AOvVaw3LtOCEJLprXk_tb1j89SAW&amp;ust=1609341125999000&amp;source=images&amp;cd=vfe&amp;ved=0CAIQjRxqFwoTCPjK6oS98-0CFQAAAAAdAAAAABAD" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Характеристики больших данных

Большие данные характеризуются четырьмя правилами (англ. 4 V’s of Big Data: Volume, Velocity, Variety, Veracity):

  1. Объем: компании могут собирать огромное количество информации, размер которой становится критическим фактором в аналитике.
  2. Скорость, с которой генерируется информация. Практически все происходящее вокруг нас (поисковые запросы, социальные сети и т. д.) производит новые данные, многие из которых могут быть использованы в бизнес-решениях.
  3. Разнообразие: генерируемая информация неоднородна и может быть представлена в различных форматах, вроде видео, текста, таблиц, числовых последовательностей, показаний сенсоров и т. д. Понимание типа больших данных является ключевым фактором для раскрытия их ценности.
  4. Достоверность: достоверность относится к качеству анализируемых данных. С высокой степенью достоверности они содержат много записей, которые ценны для анализа и которые вносят значимый вклад в общие результаты. С другой стороны данные с низкой достоверностью содержат высокий процент бессмысленной информации, которая называется шумом.

Традиционный подход к хранению и обработке больших данных

При традиционном подходе данные, которые генерируются в организациях, подаются в систему ETL (от англ. Extract, Transform and Load). Система ETL извлекает информацию, преобразовывает и загружает в базу данных. Как только этот процесс будет завершен, конечные пользователи смогут выполнять различные операции, вроде создание отчетов и запуска аналитических процедур.

По мере роста объема данных, становится сложнее ими управлять и тяжелее обрабатывать их с помощью традиционного подхода. К его основным недостаткам относятся:

  • Дорогостоящая система, которая требует больших инвестиций при внедрении или модернизации, и которую малые и средние компании не смогут себе позволить.
  • По мере роста объема данных масштабирование системы становится сложной задачей.
  • Для обработки и извлечения ценной информации из данных требуется много времени, поскольку инфраструктура разработана и построена на основе устаревших вычислительных систем.
<a href="https://www.d3vtech.com/assets/images/insights/what-is-data-science.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Термины

Облачные Вычисления

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

Прогнозная Аналитика

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

Описательная Аналитика

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

Базы данных

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

Хранилище Данных

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

Бизнес-аналитика

Бизнес-аналитика (BI) – это набор инструментов, технологий и концепций, которые поддерживают бизнес, предоставляя исторические, текущие и прогнозные представления о его деятельности. BI включает в себя интерактивную аналитическую обработку (англ. OLAP, online analytical processing), конкурентную разведку, бенчмаркинг, отчетность и другие подходы к управлению бизнесом.

Apache Hadoop

Apache Hadoop – это фреймворк с открытым исходным кодом для обработки больших объемов данных в кластерной среде. Он использует простую модель программирования MapReduce для надежных, масштабируемых и распределенных вычислений.

Apache Spark

Apache Spark – это мощный процессорный движок с открытым исходным кодом, основанный на скорости, простоте использования и сложной аналитике, с API-интерфейсами на Java, Scala, Python, R и SQL. Spark запускает программы в 100 раз быстрее, чем Apache Hadoop MapReduce в памяти, или в 10 раз быстрее на диске. Его можно использовать для создания приложений данных в виде библиотеки или для выполнения специального анализа в интерактивном режиме. Spark поддерживает стек библиотек, включая SQL, фреймы данных и наборы данных, MLlib для машинного обучения, GraphX для обработки графиков и потоковую передачу.

Интернет вещей

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

Машинное Обучение

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

Интеллектуальный Анализ Данных

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

<a href="https://cdn.datafloq.com/cache/blog_pictures/878x531/big-data-analytics-paving-path-businesses-decision.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Где применяются большие данные

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

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

Если вы хотите освоить новую профессию или повысить квалификацию в сфере Big Data, стоит обратить внимание на курс факультета аналитики Big Data онлайн-университета GeekBrains. Программа включает основательную математическую подготовку, изучение языка Python и получение навыков практической работы с базами данных. Также изучаются Hadoop и Apache Spark – востребованные инструменты для работы с большими данными. Курс ориентирован на применение машинного обучения в бизнесе и построен по принципам практической работы над проектами с ведущими специалистами отрасли и личным помощником-куратором.

27
Дек
2020

😢 Дорогостоящие ошибки: почему нам пришлось отказаться от Firebase

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

Статья публикуется в переводе, автор оригинального текста – Mohammad Faisa…

16
Дек
2020

Интенсив «Станьте хакером на Python за 3 дня»

Освойте базовые принципы работы на языке Python и создайте утилиту для автоматического подбора паролей.
— Читать дальше «Интенсив «Станьте хакером на Python за 3 дня»»

11
Дек
2020

Изучение Vue.js в 2021 году: дорожная карта разработчика

Хотите начать изучение Vue.js в 2021 году? В этом поможет дорожная карта с включёнными в неё этапами изучения и необходимыми инструментами.
— Читать дальше «Изучение Vue.js в 2021 году: дорожная карта разработчика»

10
Дек
2020

👨‍🔧️ API для QA: учимся тестированию ПО без доступа к коду

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

Инженерам QA (Quality Assurance – обеспечение качества) и QC (Quality Control – контроль качества) нередко приходится проверять работу программного обеспечения и веб-сайтов, не имея доступа к программному коду. Для организации работы и безопасности продукта такой подход проще, ведь не нужно настраивать дополнительные доступы для пользователей или отслеживать отсутствие изменений после каждого тестирования. Для упрощения работы тестировщики используют дополнительные инструменты.

Для проверки коммуникации между установленными на разных устройствах системами используют специальный API (Application Programming Interface). При этом обмен информацией между программами осуществляется в обход пользовательского интерфейса, т. е. идёт функциональное тестирование. При помощи API проверяют функции регистрации нового пользователя, точность передачи и удаления данных, а также другие возможности продукта.

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

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

Возможности продукта:

· Создание и отправка запросов

· Изменение параметров запросов.

· Сохранение созданных запросы в коллекции и папках.

· Запуск автоматических тестов на основе коллекций при помощи Collection Runner.

· Изменение окружения для одинаковых запросов.

· Добавление контрольных точек к вызову API.

Создание метода Postman

Стоит отметить, что тестирование при помощи API возможно только при наличии самого API и документации от разработчика. Это позволит точно понимать функции продукта без противостояния инженера QA и программиста на вечную тему: «Это баг!» & «Нет, это фича!».

В статье для начинающих мы рассмотрим ручное тестирование по 4 основным запросам:

· POST – создание ресурса на сервисе, т. е. отправку данных на сервер.

· GET – получение ресурса с сайта.

· PUT – обновление данных на сервере.

· DELETE – удаление ресурса с сайта.

Речь пойдёт об архитектуре REST, часто использующейся для взаимодействия сайтов и приложений. При этом активно применяется JSON (JavaScript Object Notation – текстовый формат обмена данными на языке JavaScript). Практиковать составление запросов можно, используя ресурс reqres.in. Здесь представлены разные Request и ожидаемые результаты (Response). Это и будет тренировочным API с документацией.

При работе с Postman стоит знать о статусах и классах состояний сервера:

Классы состояний сервера
Классы состояний сервера

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

Примеры запросов в Postman для быстрого обучения тестировщика

После запуска в Postman стоит создать папку с коллекцией запросов. Для этого нужно во вкладке Collections нажать на New Collection.


Указываем название коллекции.


Создаем запрос нажатием на Add requests.


POST

Рассмотрим регистрацию пользователя, поэтому указываем соответствующее название и нажимаем на Save to [Collections name].


Выбираем POST.


Указываем url тестируемого сайта.


Прописываем название соответствующего API, в данном случае api/register.


Во вкладке Body выбираем raw.


Далее выбираем формат текста JSON.


Нажатием на Send отправляем данные.


В соответствующем поле видим ожидаемый результат, указанный в документации и статус 200 ОК.


GET

Выполним запрос на получение данных о созданном пользователе, выбираем GET.


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


PUT

Попробуем обновить данные пользователя, для этого создаём update_user.


Выбраем PUT.


Указываем ссылку с url и API, открываем окно для кода.


Отправляем новые данные.


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


DELETE

Создаём запрос на удаление пользователя.


Выбираем DELETE.


Указываем полную ссылку на страницу пользователя и отправляем.


Получаем от сервера в ответ статус 204 No Content, информирующий об успешности запроса, но без содержимого, т. е. данные были успешно удалены.


Документация, необходимая тестировщику для обучения

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

***

Разобраться с нюансами профессии QA и QC, а также получить необходимые знания и изучить инструменты можно на курсе по тестированию ПО от GeekBrains. Вебинары проводят практикующие специалисты, которые не только помогут студентам стать тестировщиками с нуля, но и подскажут, как составить резюме и получить работу.

07
Дек
2020

🎥 Создаём рекомендательный алгоритм для YouTube, чтобы не тратить время зря

YouTube API и Amazon AWS Lambda можно использовать для создания собственного алгоритма выбора видео, чтобы не тратить время на просмотр предложенного мусора. Рассказываем как.

Создаем собственный алгоритм YouTube (чтобы не тратить время зря)

Я люблю смотреть на YouTube видео, которые существенно улучшают мою жизнь. К сожалению, алгоритм YouTube на это не согласен: он обожает подсовывать мне “ловушки кликов” и прочий мусор.

Здесь нет ничего удивительного – алгоритм ставит на первое место количество кликов и время просмотров.

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

И вот чего я добился.

Самый лучший план

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

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

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


Я знал, что мне потребуется YouTube API для получения информации о видео. Затем я создал бы процедуру, обрабатывающую эту информацию для ранжирования видео. В качестве последнего шага я планировал установить автоматическую рассылку списков самых лучших видео самому себе с помощью AWS Lambda.

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

Путешествие по YouTube API

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

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

Увидев все это, я получил уверенность, что смогу применить эту информацию для определения метрик и ранжирования видео.

Я получил код API через консоль разработчика и скопировал его в свой скрипт Python. Это позволяет инициализировать вызов API и получать результаты следующими строками кода:

        api_key = 'AIzpSyAq3L9DiPK0KxrGBbdY7wNN7kfPbm_hsPg'  # Введите свой ключ API вместо этого

youtube_api = build('youtube', 'v3', developerKey = api_key)

results = youtube_api.search().list(q=search_terms, part='snippet', type='video', 
                                order='viewCount', maxResults=50).execute()
    

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

        publishedAt = results['items'][0]['snippet']['publishedAt']
    

Здесь можно найти полезную серию видео, демонстрирующих весь процесс использования YouTube API.

Находим полезные видео: определение формулы

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

Это был сложный вопрос. Что делает видео хорошим? Количество просмотров? Количество комментариев? Количество подписчиков канала?

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

Однако, есть несколько моментов, которые общее количество просмотров не учитывает:

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

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

Мне нужно было встроить другие метрики. Следующей метрикой было количество подписчиков.

Я протестировал ранжирование, основанное исключительно на отношении просмотров к подписчикам (т.е. делим количество просмотров на количество подписчиков).

        # Функция для подсчета количества просмотров по отношению к подписчикам
def view_to_sub_ratio(viewcount, num_subscribers):
    if num_subscribers == 0:
        return 0
    else:
        ratio = viewcount / num_subscribers
        return ratio
    

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

Первое видео выглядит потенциально интересным, а вот второе и третье – совсем не то, что я искал
Первое видео выглядит потенциально интересным, а вот второе и третье – совсем не то, что я искал

Я предпринял кое-какие попытки устранить подобные крайние случаи:

  • Установил минимальное количество просмотров в 5000.
  • Установил максимальное значение соотношения количества просмотров к количеству подписчиков в 5.
        # Убираем крайние случаи (низкое количество просмотров или подписчиков
def custom_score(viewcount, ratio, days_since_published):
    ratio = min(ratio, 5)
    score = (viewcount * ratio)
    return score
    

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

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

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

        def get_start_date_string(search_period_days):
    """Returns string for date at start of search period."""
    search_start_date = datetime.today() - timedelta(search_period_days)
    date_string = datetime(year=search_start_date.year,month=search_start_date.month,
                           day=search_start_date.day).strftime('%Y-%m-%dT%H:%M:%SZ')
    return date_string

date_string = vf.get_start_date_string(7)
results = youtube_api.search().list(q=search_terms, part='snippet',
                              type='video', order='viewCount', maxResults=50,
                              publishedAfter=date_string).execute()
    

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

        def custom_score(viewcount, ratio, days_since_published):
    ratio = min(ratio, 5)
    score = (viewcount * ratio) / days_since_published
    return score
    

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

videoValue=Views∗min(ViewToSubscriberRatio,5)DaysSincePublished

Тестирование моего нового инструмента

Сначала я протестировал его с запросом термина “medical school” и получил следующие результаты:


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

Я протестировал с другим условием поиска, “productivity”, и результаты снова меня порадовали.


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

Несколько месяцев назад OpenAI выложила действительно интересную новую нейронную сеть, называемую “GPT-3”. Я решил протестировать мой поисковик видео, передав в качестве критерия поиска “GPT-3”, и нашел вот это видео:

Источник: https://www.youtube.com/watch?v=wx4GQUXOHIQ

Это интересное видео от создателя, имеющего всего несколько тысяч подписчиков

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

Видео про GPT-3 от каналов с большой аудиторией
Видео про GPT-3 от каналов с большой аудиторией

С помощью кода Video Finder, который я написал, намного проще находить эти интересные видео, содержащие новые перспективы.

За последние несколько месяцев я перепробовал множество условий поиска видео, основанных на моих интересах – например, ‘artificial intelligence’, ‘medical AI’ и ‘Python programming’. Практически всегда в первой пятерке предложений Video Finder’а было хотя бы одно интересное видео.

Запускаем рабочий процесс

Я причесал весь свой код и выложил его на GitHub.

На высоком уровне, теперь мой код работал примерно так:

  1. Используем условия поиска, период поиска и ключ API для получения информации о видео с YouTube.
  2. Рассчитываем “метрику интересности” для видео.
  3. Используем “функцию ценности” для ранжирования этих видео по предполагаемой интересности.
  4. Сохраняем интересующую нас информацию в DataFrame.
  5. Печатаем информацию (включая ссылки) о 5 лучших видео в консоль.

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

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

Однако этот план не сработал.

Это была моя первая попытка использовать Lambda, и как я ни старался, я не смог заставить все импортированные библиотеки работать одновременно. Чтобы выполняться, коду требовался почтовый клиент boto3, OAuth для вызова API, Pandas для хранения результатов, и множество модулей, от которых они зависят. Обычно установка этих пакетов довольно проста, но на Lambda возникли дополнительные сложности. Во-первых, там есть лимиты на загрузку файлов, так что мне пришлось упаковать библиотеки, а потом распаковать их после загрузки. Во-вторых, AWS Lambda использует собственную версию Linux, которая затруднила использование правильных библиотек с кросс-платформной совместимостью. В-третьих, мой Mac вел себя странно с ее виртуальными окружениями.

Потратив около 10-15 часов на поиск советов на StackOverflow, загрузку и повторную загрузку различных codebase и совещания с несколькими друзьями, я так и не смог заставить все это заработать. Так что, в конце концов я решил сдаться (если у вас есть какие-нибудь хорошие идеи, сообщите мне!)

Вместо этого, я реализовал план Б: запускать скрипт вручную на своем локальном компьютере раз в неделю (после автоматического напоминания через email). Честно говоря, это не конец света.

Итоговые мысли

В целом, это был действительно забавный проект. Я научился использовать YouTube API, познакомился с AWS Lambda и создал инструмент, который могу использовать в дальнейшем.

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

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

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

Возможные дальнейшие шаги

В целом, проект еще достаточно сырой, и здесь многое можно сделать:

  1. Метрика для ранжирования видео довольно груба, и я мог бы ее улучшить. Естественным следующим шагом было бы встроить соотношение лайков и дизлайков.
  2. При задании условий поиска также много условностей. Если строка поиска не содержится в названии видео или его описании, видео не будет выбрано. Я мог бы исследовать способы обойти эту проблему.
  3. Я мог также создать интерфейс, позволяющий пользователю просто вводить условия поиска и период поиска. Это сделало бы инструмент более доступным, а также позволило бы пользователям смотреть видео, не заходя на youtube.com.
  4. В настоящее время код работает довольно медленно. Я не приложил особых усилий к его оптимизации и ускорению, учитывая, что я собирался запускать этот код всего раз в неделю. Но есть несколько очевидных мест, где можно было бы повысить эффективность.

Полезные ссылки

Похожие проекты:

YouTube API:

AWS Lambda:

04
Дек
2020

Как стать React-разработчиком в 2021: дорожная карта

Хотите знать, как стать React-разработчиком в 2021? Держите дорожную карту, которая собрала must-have темы и инструменты.
— Читать дальше «Как стать React-разработчиком в 2021: дорожная карта»

03
Дек
2020

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

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

Для чего нужны инструменты веб-разработки?

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

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

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


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

Sketch – набор инструментов для цифрового дизайна


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

демонстрация работы в Sketch
демонстрация работы в Sketch

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

Sketch поддерживает только OS X, к тому же это коммерческое приложение — ценовая политика предполагает единовременную оплату лицензии на одного пользователя, либо ежемесячную или годовую подписку.

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

  • создает простые анимации;
  • есть интерактивные прототипы;
  • поддерживается совместная работа в облаке.

Недостатки:

  • только под OS X.

InVision Cloud – платформа для дизайна цифровых продуктов

принцип работы Prototype
принцип работы Prototype

Список использующих InVision Cloud технологических компаний включает Amazon, SoundCloud, Evernote и Netflix, что подтверждает эффективность платформы для разработки цифровых продуктов.

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

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

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

  • есть бесплатная версия;
  • есть набор полезных инструментов;
  • возможность создания прототипа веб-сайта.

Sublime Text – редактор кода, упрощающий продвинутый дизайн сайтов

демонстрация Sublime Text
демонстрация Sublime Text

Sublime Text – популярный редактор кода, который является полезным инструментом для веб-дизайна и доступен для загрузки под Windows, OS X и Linux. К полезным функциям относятся команда GoTo Anything для поиска фрагмента кода, команда Multiple Selections, которая вносит изменения в повторяющиеся разделы кода, и Split Editing для максимизации отображения кода на широкоэкранном мониторе или даже на нескольких мониторах.

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

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

  • есть версии для Windows, OS X и Linux;
  • поддерживаются расширенные команды;
  • доступна бесплатная пробная версия.

Недостатки:

  • нет версии для мобильных платформ.

Foundation

установка и работа в Foundation

Что-либо спроектировать проще, когда заложены основы. Foundation использует этот подход, предлагая «семейство гибких интерфейсных фреймворков», которые можно применять для дизайна веб-сайтов и электронной почты. Каждый из них нетрудно настроить для получения нужного вида. В списке использующих этот инструмент сайтов есть несколько серьезных «тяжеловесов», включая Disney, HP и Adobe.

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

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

  • фреймворк для упрощения дизайна;
  • настраиваемые строительные блоки;

Недостатки:

  • непрозрачное ценообразование;
  • крутая кривая обучения

Chrome DevTools – инструмент для веб-разработчиков


Chrome по-прежнему остается популярным выбором для пользователей Интернета: он также включает инструменты разработчика прямо в браузере. Они предназначены для отладки JavaScript, применения стилей к элементам HTML, вывода сообщений о работе страницы, а также оптимизации скорости веб-сайта.

В одной из предыдущих статей мы уже рассмотрели 14 наиболее полезных особенностей Chrome DevTools.

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

Использование инструментов разработчика Chrome бесплатно, а поддержка предоставляется через активное сообщество DevTools.

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

  • бесплатность;
  • доступность.

Недостатки:

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

Кому и для чего пригодится

Sketch будет полезен использующим компьютеры Apple разработчиком для создания дизайна и верстки сайтов. InVision Cloud подойдет для дизайна, прототипирования и модульного создания сайтов. Sublime Text облегчит работу с кодом сайта или веб-приложения. Foundation поможет подобрать и кастомизировать шаблон HTML. Chrome DevTools хороши тестирования и отладки сайта в браузере Chrome.

***

Автоматизированные помощники хороши, но это именно помощники – знания матчасти они не заменят. Если вы только осваиваете профессию, стоит обратить внимание на курс по веб-разработке от Geek Brains и Mail.ru. Начав с основ, здесь можно получить необходимые для старта карьеры знания. Актуальная программа, 2 – 3 вебинара в неделю и 2 месяца стажировки. Под руководством опытных преподавателей студенты наработают необходимую для дальнейшего развития в сфере IT базу и получат помощь в трудоустройстве.

03
Дек
2020

Что такое доступность сайта и как её проверить

Разобрались, что такое доступность сайта, зачем об этом заботиться разработчикам и как проверять с помощью Chrome DevTools.
— Читать дальше «Что такое доступность сайта и как её проверить»