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

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 месяцев и включает теоретическую часть, практику с четырьмя проектами в портфолио и как бонус – диплом о профессиональной переподготовке с гарантированным трудоустройством. Программа обучения актуальна, а занятия ведут практикующие специалисты российских технологических компаний.

02
Сен
2021

🕵 Что такое динамическое тестирование безопасности приложений (DAST)?

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

31
Авг
2021

📊 Путеводитель по Big Data для начинающих: методы и техники анализа больших данных

Методы и техники анализа Big Data: Machine Learning, Data mining, краудсорсинг, нейросети, предиктивный и статистический анализ, визуализация, смешение и интеграция данных, имитационные модели. Как разобраться во множестве названий и аббревиатур? Читайте наш путеводитель.

Machine Learning

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

Как методы машинного обучения применяют при анализе больших данных:

  • Осуществление маркетинговых исследований и сегментации информации. Это дает возможность предприятию понимать рынок, узнавая потребности целевой аудитории. В СМИ машинное обучение помогает определить, какой контент нравится аудитории, а какой нет.
  • Изучение поведения клиентов.
В особенности преимущества машинного обучения в Big Data видны в процессе построения IoT-систем. Технологию используют Tesla Motors и Nest, а также IoT-платформы: AWS IoT Greengrass ML Inference, SageMaker, Google Cloud IoT.
В особенности преимущества машинного обучения в Big Data видны в процессе построения IoT-систем. Технологию используют Tesla Motors и Nest, а также IoT-платформы: AWS IoT Greengrass ML Inference, SageMaker, Google Cloud IoT.

Нейронные сети и распознавание образов

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

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

Вариант использования нейросетей с распознаванием образов – различать фото мужчин и женщин.

Для этого потребуется:

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

Data mining

Термин Data mining появился благодаря математику Григорию Пятецкому-Шапиро в 1989 году. Добыча данных – это интеллектуальный анализ, необходимый для выявления закономерностей в массиве разнородной информации.

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

Основные задачи, решаемые Data mining:

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

Краудсорсинг

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

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

Предиктивная аналитика

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


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

Принцип работы Predictive analytics:

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

Имитационное моделирование

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

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

Статистический анализ

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

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

К статистике относят анализ временных рядов и А/В тестирование. A/B testing или split testing – это маркетинговый метод исследования, при котором сравнивают контрольную группу элементов с наборами тестовых групп с измененными параметрами, чтобы определить, какие факторы улучшают целевые показатели.
К статистике относят анализ временных рядов и А/В тестирование. A/B testing или split testing – это маркетинговый метод исследования, при котором сравнивают контрольную группу элементов с наборами тестовых групп с измененными параметрами, чтобы определить, какие факторы улучшают целевые показатели.

Методы для получения статистических результатов:

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

Визуализация аналитических данных

Для упрощения процесса анализа информации используют метод визуализации данных. Выполнить визуализацию Big Data можно при помощи средств виртуальной реальности и «больших экранов». Визуальные образы воспринимаются лучше текста, поскольку 90% информации человек получает через зрение.

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

Результаты выводят в виде диаграмм, карт, графиков, гистограмм, 3-D моделей, либо пиктограмм. Инструменты для визуализации больших данных: Qlik, Microsoft (Excel, Power BI), Tableau (tableau desktop, tableau public), Orange и Microstrategy.
Результаты выводят в виде диаграмм, карт, графиков, гистограмм, 3-D моделей, либо пиктограмм. Инструменты для визуализации больших данных: Qlik, Microsoft (Excel, Power BI), Tableau (tableau desktop, tableau public), Orange и Microstrategy.

Смешение и интеграция данных

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

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

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

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

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

***

Если вы только начинаете путь в профессии, обратите внимание на Факультет аналитики Big Data образовательной онлайн-платформы GeekBrains. Вы научитесь собирать и анализировать данные, извлекать полезную информацию и находить закономерности. После обучения сможете проверять гипотезы и помогать бизнесу принимать взвешенные решения. Занятия под руководством опытных наставников и поддержка опытных HR помогут вам продвинуться по карьерной лестнице. Специализированный опыт не потребуется: программа предполагает освоение профессиональных навыков с нуля.

30
Авг
2021

TestCon Moscow 2021

Международная конференция по тестированию и обеспечению качества ПО. 3 дня докладов и мастер-классов от ведущих мировых специалистов.
— Читать дальше «TestCon Moscow 2021»

03
Авг
2021

💻 13 редких и недооцененных языков программирования

На Java, Python, С/С++, JavaScript и PHP пишут миллионы разработчиков, но хорошему специалисту нужно постоянно изучать что-то новое. Разберемся с редкими, необычными и/или недооцененными языками программирования, на которые стоит обратить в…

20
Июл
2021

Flutter Global Summit’21

Спикеры из крупных мировых компаний поговорят о применении Flutter и Dart в разработке приложений, сайтов и игр. Рассмотрят кейсы, проведут панельные дискуссии, воркшопы и Q&A-сессии.
— Читать дальше «Flutter Global Summit’21»

16
Июл
2021

🛠 Может ли NanoID заменить UUID?

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

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

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

NanoID и его использование

Когда дело доходит до создания
UUID или NanoID в JavaScript, становится ясно, что тут все просто – у них есть
NPM-пакеты, которые помогут вам. Все, что нужно сделать – установить библиотеку NanoID NPM с помощью команды npmi nanoid и использовать ее в своем проекте.

        import { nanoid } from 'nanoid';
model.id = nanoid();
    
Знаете ли вы, что NanoID имеет более 11 754 тыс. загрузок NPM в неделю и на 60% быстрее чем UUID?

На приведенном ниже
графике показано сравнение мы
видим тенденцию к росту NanoID по сравнению с неизменным прогрессом UUID.


Надеемся, что эти цифры
убедили вас попробовать NanoID.

Основное различие между ними простое – используемый в качестве ключа алфавит. Поскольку NanoID использует алфавит большего размера чем UUID, более короткий идентификатор может работать также, как и более длинный UUID.

1. Размер NanoID составляет всего 108 байт

В отличие от UUID, NanoID
в 4,5 раза меньше по размеру и не имеет никаких зависимостей. Кроме того,
ограничение по «весу» было использовано для уменьшения размера еще на 35%.
Это напрямую влияет на размер данных. Например, использующий NanoID объект мал и компактен для передачи и хранения данных. По мере роста приложения эти цифры становятся заметными.

2. Более безопасный

В большинстве генераторов
случайных чисел используют небезопасную Math.random(). Однако NanoID использует crypto module и Web
Crypto API
, которые являются более безопасными.
Кроме того, NanoID использует свой собственный алгоритм, называемый uniform algorithm, при реализации генератора идентификаторов вместо использования random % alphabet.

3. Быстрый и компактный

NanoID на 60% быстрее
UUID. Вместо 36 символов в алфавите UUID, NanoID имеет только 21 символ.

        0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz-
    

А еще NanoID
поддерживает 14 различных языков программирования, а именно:

        C#, C++, Clojure and ClojureScript, Crystal, Dart & Flutter, Deno, Go, Elixir, Haskell, Janet, Java, Nim, Perl, PHP, Python with dictionaries, Ruby , Rust, Swift.
    

4. Совместимость

NanoID умеет работать с
PouchDB, CouchDB WebWorkers, Rollup и библиотеками, вроде React и
React-Native.
Вы можете получить уникальный идентификатор в терминале с помощью npx nanoid, но для этого вам придется соблюсти необходимое условие – установка NodeJS.


Кроме того, в наборе
инструментов Redux можно найти NanoID и использовать его следующим образом:

        import { nanoid } from ‘@reduxjs/toolkit’
console.log(nanoid()) //‘dgPXxUz_6fWIQBD8XmiSy’
    

5. Пользовательские алфавиты

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

        import { customAlphabet } from 'nanoid';
const nanoid = customAlphabet('ABCDEF1234567890', 12);
model.id = nanoid();
    

В приведенном выше
примере определяется пользовательский алфавит ABCDEF1234567890 с размером
идентификатора 12.

6. Отсутствие сторонних зависимостей

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

***

Ограничения и направленность на будущее

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

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

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

В будущем…

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


Приведенные выше тесты
показывают производительность NanoID по сравнению с другими
генераторами идентификаторов.

Он может генерировать более 2,2 млн. уникальных идентификаторов в секунду со своим алфавитом по умолчанию и более 1,8 млн. уникальных идентификаторов в секунду с пользовательским алфавитом.

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

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

15
Июл
2021

В IntelliJ IDEA завезли подключение к Docker через SSH и другие нововведения

В предварительную версию IntelliJ IDEA 2021.2 завезли полезные обновления для Kubernetes и Docker.
— Читать дальше «В IntelliJ IDEA завезли подключение к Docker через SSH и другие нововведения»

12
Июл
2021

Митап «Flutter в большом проекте»

Flutter-разработчики рассмотрят возможности использования фреймворка в больших проектах, поделятся своими подходами и полезными инструментами для работы с веб-приложениями.
— Читать дальше «Митап «Flutter в большом проекте»»

12
Июл
2021

🛠 Сложноструктурные аналитические отчеты с Python и LaTeX

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

Экосистема LaTeX. Быстрый старт

  • TeX (произносится как «тех») – система компьютерной верстки, предназначенная для подготовки научно-технических материалов высокого полиграфического качества.
  • LaTeX (произносится «латех») – это, строго говоря, набор макросов на языке разметки TeX, но в зависимости от контекста под LaTeX может пониматься макропакет, издательская система или язык, служащий для разметки документа. LaTeX 2e – наиболее полная, стабильная версия LaTeX.
  • MikTеX – свободно распространяемая реализация TeX под основные операционные системы – Windows, macOS, Linux (Ubuntu, Debian, CentOS и пр.) – включающая в себя практически все наиболее значимые расширения.

Установить реализацию MikTеX под нужную операционную систему можно по инструкциям на странице проекта. При желании с системой можно взаимодействовать и без установки дистрибутива, просто запустив Docker-образ:

miktex_install.sh
        $ docker pull miktex/miktex
$ docker volume create --name miktex
$ docker run -it \
  -v miktex:/miktex/.miktex \
  -v $(pwd):/miktex/work \
  miktex/miktex \
  pdflatex main.tex
    

Здесь с помощью команды docker pull в локальное хранилище образов скачивается Docker-образ miktex/miktex. Затем командой docker volume в файловой системе хоста создается директория miktex/. Последним шагом с помощью команды docker run остается запустить контейнер Docker на базе образа miktex/miktex. Флаг -it создает сеанс интерактивной работы на подключаемом терминальном устройстве, а флаг -v отображает директорию файловой системы хоста на директорию внутри контейнера.

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

В качестве альтернативы MikTEX можно использовать TeX Live – это еще один свободно распространяемый и наиболее полный дистрибутив TeX. Для операционной системы MacOS X можно пользоваться специализированным решением MacTeX.

Опорный документ LaTeX (tex-файл) представляет собой обычный текстовый файл с разметкой. Для редактирования такого рода файлов можно пользоваться и обычным текстовым Unix-редактором Vim, но практичнее использовать специальные решения, например, открытую среду разработки TeXstudio (поддерживает все основные операционные системы). Однако TeXstudio не единственный вариант. Вот наиболее распространенные альтернативы: TeXmaker, Kile, TeXCenter.

LaTeX состоит из пакетов, получить доступ к которым можно на странице CTAN (The Comprehensive TeX Archive Network). CTAN – центральный репозиторий, в который стекаются все сколько-нибудь стоящие наработки, имеющие отношение к TeX.

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

Итак, для запуска примеров из настоящего руководства потребуется установить дистрибутив TeX (например, MikTеX) и LaTeX-редактор (например, TeXstudio).

Введение в язык разметки LaTeX

В текстовых процессорах, которые позволяют в момент набора текста видеть его на экране дисплея точно таким, как он будет выглядеть на бумаге, используется концепция визуального проектирования (WYSIWYG – What You See Is What You Get). В LaTeX же используется концепция логического проектирования, когда внешний вид документа становится понятен только после компиляции.

Внешний вид документа определяется инструкциями, описанными на языке разметки TeX или LaTeX. Между этими языками сложно провести четкую границу. Сам LaTeX написан в командах TeX и в LaTeX-документе можно использовать практические любые TeX-команды. Упрощенно можно считать, что язык разметки LaTeX это высокоуровневая «синтаксически-сахарная» обертка для низкоуровневого языка TeX. Таким образом, TeX в основном применяется при разработке классов и пакетов, в то время как LaTeX – для подготовки печатного документа.

Теперь рассмотрим общий синтаксис языка LaTeX и познакомимся с базовой структурой tex-документа.

  • LaTeX-файл должен начинаться с команды \documentclass, задающей стиль оформления документа, например, \documentclass{article}. Аргумент команды article означает, что документ будет оформлен в соответствии с наиболее общими правилами оформления статей. При желании можно изменить (с незначительными оговорками) любой элемент макета документа.
  • Команда \documentclass поддерживает и другие классы, доступные «из коробки»: book (для оформления книг), report (для оформления отчетов – нечто среднее между book и article), proc (для оформления трудов конференций) и letter (для деловых писем со сложной структурой).
  • После команды \documentclass могут следовать команды, относящиеся ко всему документу. Далее с помощью окружения\begin{document}\end{document} (условимся называть его документарным окружением) указывается тело документа. В общем случае окружением называют сложные конструкции вида \begin{}\end{}.
  • Часть tex-файла между командой \documentclass и \begin{document}\end{document} называют преамбулой. Команды указанные после закрывающей скобки окружения документа \end{document} LaTeX проигнорирует.

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

base_example.tex
        \documentclass{article}
% область преамбулы
\begin{document} % тело документа: начало
% текст
\end{document} % тело документа: конец
% команды в этой части документа не будут учитываться при сборке документа
    

Инструкции, управляющие макетом страницы и прочие настройки tex-документа, могут быть размещены и в преамбуле, но когда инструкций становится много, будет удобнее вынести их в отдельный стилевой файл с расширением *.sty. Позже стилевой файл можно будет подключить командой \usepackage{}, принимающей в качестве аргумента путь до этого файла.

Сам стилевой файл содержит импорты пакетов \RequirePackage{}, пользовательские команды \newcommand{}, псевдонимы математических операторов \DeclareMathOperator и прочие элементы кастомизации:

style_template.sty
        % начало стилевого файла
\RequirePackage[english,russian]{babel}
\RequirePackage[utf8]{inputenc}
\RequirePackage{amsmath, amsfonts, amssymb, latexsym}
\RequirePackage[
	left=2cm,
	right=2cm,
	top=2cm,
	bottom=2cm
		]{geometry}
... 
\newcommand{\str}[1]{cтр.~\pageref{#1}}
\newcommand{\strbook}[1]{стр.~{#1}}
...
\DeclareMathOperator*{\argmin}{arg\,min}
\DeclareMathOperator*{\argmax}{arg\,max}
\DeclareMathOperator*{\sign}{sign}
\DeclareMathOperator*{\const}{const}
...
    

С подключенным стилевым файлом tex-документ будет выглядеть так:

base_example_with_usepackage.tex
        \documentclass{article}
\usepackage{style_template} % подключаем стилевой файл style_template.sty, расположенный в той же директории, что и tex-файл
\begin{document}
% текст
\end{document}
    

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

Далее предполагается, что все настройки макета документа описаны в стилевом файле style_template.sty, который расположен в той же директории, что и tex-файл.

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

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

Наберем в документарном окружении следующие строки:

simple_onepage_template.tex
        ...
\begin{document}

\title{Аналитический отчет по ...} % заголовок отчета
\author{\itshape Иванов И.И.} % автор работы
\date{} % просим LaTeX не указывать дату, так как будет
        % использован наш вариант оформления даты, описанный в стилевом файле
\maketitle % создает заголовок

\thispagestyle{fancy} % задает стиль страницы

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

\tableofcontents % создает оглавление

\section{Пример многострочной формулы}
    Для набора сложных многострочных формул используются различные окружения, например, окружение \texttt{multline}
	\begin{multline}
		F_{\zeta}(z)=P[\,\zeta\leqslant z\,] = \int\!\!\!\int_{x/y\leqslant z}f_X(x;n)f_Y(y;m)\,dxdy =\\ \dfrac{1}{2^{(n+m)/2}\Gamma(n/2)\Gamma(m/2)}\int\!\!\!\int_{x/y\leqslant z}x^{n/2-1}y^{m/2-1}\exp\left( -\frac{x}{2} \right) \exp\left( -\frac{y}{2} \right) \,\mathrm{d}x \, \mathrm{d}y.
	\end{multline}

\section{Пример группового размещения формул}

Несколько формул можно разместить в одной группе с помощью окружения \texttt{gather}
\begin{gather}
	\sum_{j \in \mathbf{N}} b_{ij} \hat{y}_{j} = \sum_{j \in \mathbf{N}} b_{ij}^\lambda \hat{y}_j + (b_{ii} - \lambda_i)\hat{y}_i \hat{y},\notag \\
	\det \mathbf{K}(t=1, t_1, \ldots, t_n) = \sum_{I \in \mathbf{n} } (-1)^{|I|} \prod_{i \in I} t_i \prod_{j \in I} (D_j + \lambda_j t_j) \det \mathbf{A}^{(\lambda)} (\, \overline{I} | \overline{I} \,) = 0,\tag{$a$} \\
	\mathbb{F} = \sum_{i=1}^{\left[ \frac{n}{2}\right] } \binom{ x_{i,i+1}^{i^2}}{ \left[ \frac{i+3}{3} \right]} {{\sqrt{\mu(i)^\frac{3}{2} (i^2-1)}} \over\displaystyle {\sqrt[3]{\rho(i)-2} + \sqrt[3]{\rho(i)-1}} }, \tag{$b$}
\end{gather}

\section{Простая однострочная формула}

Теорема Хинчина-Винера утверждает, что спектральная плотность мощности стационарного в широком смысле случайного процесса представляет собой преобразование Фурье от соответствующей автокорреляционной функции
\begin{equation*} % без нумерации
    S_{xx}(f) = \int\limits_{-\infty}^{\infty}  \, r_{xx} (\tau) e^{-j 2 \pi f \tau} \mathrm{d} \tau,\ \text{где}\ r_{xx}(\tau) = \mathbb{E}[\,x(t) \, x^{*}(t - \tau)\,].
\end{equation*}

\end{document}
    

Теперь можно вызвать компилятор PDFLaTeX через командную оболочку и передать ему имя tex-файла. Результат компиляции приведен на рисунке ниже.

Результат компиляции файла <code class="inline-code">analyt_report_template.tex</code>
Результат компиляции файла analyt_report_template.tex

Рассмотрим более подробно код файла analyt_report_template.tex.

  • В первых строках файла с помощью команд \title и \author мы объявляем заголовок отчета и имя автора работы соответственно, а с помощью команды \maketitleсоздаем заголовок.
  • Затем с помощью команды \date, вызванной без аргументов, подавляем вывод временной метки. Здесь для привязки ко времени будет использоваться специальная низкоуровневая командная вставка в стилевом файле style_template.sty (этот фрагмент кода приводится только для справки, так как конечному пользователю приложения нет необходимости вносить в стилевой файл изменения напрямую):
fragment_style_template.sty
        ... 
\def\@maketitle{
    \begin{flushright}
	\footnotesize\itshape
	Дата последней сборки документа:\\ \today\ в \currenttime
    \end{flushright}

    \begin{center}
	\let \footnote \thanks
	\begin{spacing}{1.5}
	    {\Large\bfseries\@title}
	\end{spacing}\vskip 1mm

	{\normalsize
	    \begin{tabular}[t]{l}
		\@author
	    \end{tabular}\par	
	}
    \end{center}
    \par
    \vskip 1.5em
}
...
    

Команда \thispagestyle задает стиль страницы, а команда \tableofcontents создает оглавление документа. С помощью команды \section создаются разделы документа высшего уровня (с учетом класса документа). Для того чтобы создать раздел более низкого уровня следующей ступени можно воспользоваться командой \subsection.

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

Как должно быть понятно из приведенного выше рисунка, equation используется для однострочных формул, multline – для многострочных, а gather – для группового размещения формул. Звездочка после имени окружения означает, что LaTeX не станет присваивать номера формулам, попавшим в это окружение.

При наборе формул используются специальные LaTeX-команды с названиями созвучными набираемому элементу, например, для того чтобы добавить в формулу знак суммы с нижним lowindex и верхним upindex индексом используется команда \sum_{lowindex}^{upindex}, чтобы вставить символ большой омеги – \Omega, а для вставки символа гамма потребуется \gamma и т.д.

Для быстрого поиска нужных математических LaTeX-команд, специальных символов, приемов оформления псевдокода и пр. удобно пользоваться компактным, но очень содержательным сборником Константина Воронцова «LaTeX 2e в примерах».

Прочие детали работы с издательской системой LaTeX можно выяснить из следующих работ:

Введение в Python-библиотеку Streamlit

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

Установить библиотеку проще всего с помощью менеджера пакетов pip: pip install streamlit.

Запускается приложение командой streamlit run:

streamlit_run.sh
        $ streamlit run streamlit_simple_example.py

  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8502 # <-- 
  Network URL: http://192.168.1.247:8502
    

После запуска сценария в браузере (http://localhost:8502) откроется вкладка с приложением. Завершить работу приложения можно, закрыв вкладку браузера и набрав Ctrl+C в командной оболочке.

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

Начать работу со Streamlit можно с вводного руководства, которое подробно описывает все возможности библиотеки, включая Markdown-разметку, аудио и видео объекты, различные графические объекты (Bokeh, Altair, Plotly и др.), а также оптимизацию загрузки объемных наборов данных.

Ниже приводится пример использования библиотеки Streamlit для построения двух интерактивных графиков (на базе библиотеки Plotly) гауссовских процессов с автокорреляционной функцией экспоненциального типа.

streamlit_simple_example.py
        import streamlit as st
import math
import pandas as pd
from pandas import Series
import plotly.graph_objects as go
import numpy as np
import numpy.random as rnd

title_app = "Простой пример использования библиотеки Streamlit"
# чтобы на вкладке браузера отображалось имя приложения, а не имя файла
st.set_page_config(
    layout="wide",
    page_title=title_app,
    initial_sidebar_state="expanded",
)


def gauss_with_exp_acf_gen(
    *,
    sigma: float = 2,
    w_star: float = 1.25,
    delta_t: float = 0.05,
    N: int = 1000,
) -> np.array:
    """
    Описание
    --------
    Генерирует дискретную реализацию
    стационарного гауссовского ПСП
    с КФ экспоненциального типа

    Параметры
    ---------
    sigma : стандартное отклонение ординат ПСП.
    w_star : параметр модели ПСП.
    delta_t : шаг по времени.
    N : число отсчетов ПСП.

    Возвращает
    ----------
    xi : массив элементов ПСП с заданной КФ
    """
    gamma_star = w_star * delta_t
    rho = math.exp(-gamma_star)
    b1 = rho
    a0 = sigma * math.sqrt(1 - rho ** 2)

    xi = np.zeros(N)
    xi[0] = rnd.rand()
    x = rnd.randn(N)

    for n in range(1, N):
        xi[n] = a0 * x[n] + b1 * xi[n - 1]

    return xi


def main(N: int = 100):
    timestmp = np.arange(N)
    # временной ряд №1
    time_series_1 = gauss_with_exp_acf_gen(sigma=5, w_star=1.25, N=N)
    # временной ряд №2
    time_series_2 = gauss_with_exp_acf_gen(sigma=6.5, w_star=1.75, N=N)

    fig = go.Figure()

    fig.add_trace(
        go.Scatter(
            x=timestmp,
            y=time_series_1,
            name="Временной ряд (объект-1)",
            opacity=0.8,
            mode="lines",
            line=dict(
                color="#E84A5F",
            ),
        )
    )

    fig.add_trace(
        go.Scatter(
            x=timestmp,
            y=Series(time_series_1).rolling(window=7).mean(),
            name="Скользящее среднее (объект-1)",
            mode="lines",
            opacity=0.6,
            line=dict(
                color="#FF847C",
            ),
        )
    )

    fig.add_trace(
        go.Scatter(
            x=timestmp,
            y=time_series_2,
            name="Временной ряд (объект-2)",
            mode="lines",
            opacity=0.8,
            line=dict(
                color="#5E63B6",
            ),
        )
    )

    fig.add_trace(
        go.Scatter(
            x=timestmp,
            y=Series(time_series_2).rolling(window=7).mean(),
            name="Скользящее среднее (объект-2)",
            mode="lines",
            opacity=0.6,
            line=dict(
                color="#6EB6FF",
            ),
        )
    )

    fig.update_layout(
        title=dict(
            # text="<i>Временной ряд</i>",
            font=dict(
                family="Arial",
                size=18,
                color="#07689F",
            ),
        ),
        xaxis_title=dict(
            text="<i>Временная метка</i>",
            font=dict(
                family="Arial",
                size=13,
                color="#537791",
            ),
        ),
        yaxis_title=dict(
            text="<i>Продолжительность простоя, час</i>",
            font=dict(
                family="Arial",
                size=13,
                color="#537791",
            ),
        ),
        xaxis=dict(
            showline=True,
        ),
        yaxis=dict(
            showline=True,
        ),
        autosize=False,
        showlegend=True,
        margin=dict(
            autoexpand=False,
            l=70,
            r=10,
            t=50,
        ),
        legend=dict(
            orientation="v",
            yanchor="bottom",
            y=0.01,
            xanchor="right",
            x=0.99,
            font=dict(family="Arial", size=12, color="black"),
        ),
        plot_bgcolor="white",
    )

    st.plotly_chart(fig, use_container_width=True)


if __name__ == "__main__":
    main(N=350)
    

В этом примере к библиотеке Streamlit имеет отношение только:

  • функция st.set_page_config(), которая переопределяет имя вкладки браузера – отображается не имя файла, а имя приложения;
  • функция st.plotly_chart(), которая принимает сконфигурированный Plotly-объект и выводит его в окно браузера.
Результат работы сценария <code class="inline-code">streamlit_simple_example.py</code>
Результат работы сценария streamlit_simple_example.py

Прочие элементы сценария streamlit_simple_example.py играют лишь вспомогательную роль.

Пример-шаблон аналитического отчета

Предлагается в качестве примера, сочетающего приемы работы с библиотекой Streamlit (браузерный интерфейс приложения) и LaTeX-разметку (опорный tex-файл), рассмотреть подготовку отчета на тему «Оценка усталостной долговечности силовых элементов транспортных машин под воздействием стационарных гауссовских процессов с автокорреляционной функцией экспоненциально-косинусного семейства».

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

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

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

downloader_for_streamlit.py
        def text_downloader(multiline: str) -> NoReturn:
    """
    Принимает LaTeX-шаблон документа в виде многострочной строки и
    создает на странице ссылку для скачивания шаблона
    """
    OUTPUT_TEX_FILENAME = "base_template_for_latex.tex"
    
    b64 = base64.b64encode(multiline.encode()).decode()
    # создает ссылку для скачивания файла
    href = (f'<a href="data:file/txt;base64,{b64}" '
            f'download="{OUTPUT_TEX_FILENAME}">Скачать ...</a>')
    st.markdown(href, unsafe_allow_html=True)
    

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

При наборе текстового шаблона для Python (latex_template_for_python.txt) – по сути файл представляет собой каркас документа с заглушками под строковую интерполяцию – важно помнить о синтаксических особенностях LaTeX. Дело в том, что в контексте строковой интерполяции фигурные скобки означают «место подстановки», а в контексте LaTeX – обязательный аргумент команды. То есть, чтобы Python корректно «прочитал» строку следует фигурные скобки, относящиеся к синтаксису LaTeX, удвоить.

В результате получится текстовый файл вида:

fragment_latex_template_for_python.txt
        \documentclass[
    11pt,
    a4paper,
    utf8,
]{{article}}

\usepackage{{style_template}}

\begin{{document}}
...
Усталостная долговечность по модели \eqref{{eq:miles}} составляет $ Y_{{NB}} = {Y_NB:.2f} $, сек.

\section{{Оценка усталостной долговечности по модели P.H. Wirsching и C.L.~Light}}
...
    

Ниже на рисунках приводится общий вид приложения.

Стартовая страница приложения
Стартовая страница приложения

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

pdflatex_start.sh
        # для сборки каркаса
$ pdflatex base_template_for_latex.tex
# для вычисления конечных ссылок на страницы, формулы и пр.
$ pdflatex base_template_for_latex.tex

    

После сборки документа в рабочей директории проекта будет создан pdf-файл.

Выгрузка подготовленного LaTeX-шаблона
Выгрузка подготовленного LaTeX-шаблона
Результат работы <code class="inline-code">pdflatex base_template_for_latex.tex</code>. Фрагмент собранного аналитического отчета
Результат работы pdflatex base_template_for_latex.tex. Фрагмент собранного аналитического отчета

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

Развертывание приложения на облачной платформе Streamlit
Развертывание приложения на облачной платформе Streamlit

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

Заключение

Из руководства вы узнали:

  • что собой представляет система компьютерной вёрстки LaTeX, где найти ее дистрибутивы и пакеты, как правильно читать документацию, как начать работать с системой;
  • как разрабатывать гибкие, масштабируемые шаблоны документов с помощью языка разметки TeX/LaTeX;
  • как использовать приемы разработки приложений с помощью Python-библиотеки Streamlit;
  • как может выглядеть пример связки «LaTeX + Streamlit»;
  • и, наконец, как развернуть приложение на облачной платформе Streamlit.

Полезные источники:

Связные материалы с платформы Proglib:

12
Июл
2021

🛠 Сложноструктурные аналитические отчеты с Python и LaTeX

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

Экосистема LaTeX. Быстрый старт

  • TeX (произносится как «тех») – система компьютерной верстки, предназначенная для подготовки научно-технических материалов высокого полиграфического качества.
  • LaTeX (произносится «латех») – это, строго говоря, набор макросов на языке разметки TeX, но в зависимости от контекста под LaTeX может пониматься макропакет, издательская система или язык, служащий для разметки документа. LaTeX 2e – наиболее полная, стабильная версия LaTeX.
  • MikTеX – свободно распространяемая реализация TeX под основные операционные системы – Windows, macOS, Linux (Ubuntu, Debian, CentOS и пр.) – включающая в себя практически все наиболее значимые расширения.

Установить реализацию MikTеX под нужную операционную систему можно по инструкциям на странице проекта. При желании с системой можно взаимодействовать и без установки дистрибутива, просто запустив Docker-образ:

miktex_install.sh
        $ docker pull miktex/miktex
$ docker volume create --name miktex
$ docker run -it \
  -v miktex:/miktex/.miktex \
  -v $(pwd):/miktex/work \
  miktex/miktex \
  pdflatex main.tex
    

Здесь с помощью команды docker pull в локальное хранилище образов скачивается Docker-образ miktex/miktex. Затем командой docker volume в файловой системе хоста создается директория miktex/. Последним шагом с помощью команды docker run остается запустить контейнер Docker на базе образа miktex/miktex. Флаг -it создает сеанс интерактивной работы на подключаемом терминальном устройстве, а флаг -v отображает директорию файловой системы хоста на директорию внутри контейнера.

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

В качестве альтернативы MikTEX можно использовать TeX Live – это еще один свободно распространяемый и наиболее полный дистрибутив TeX. Для операционной системы MacOS X можно пользоваться специализированным решением MacTeX.

Опорный документ LaTeX (tex-файл) представляет собой обычный текстовый файл с разметкой. Для редактирования такого рода файлов можно пользоваться и обычным текстовым Unix-редактором Vim, но практичнее использовать специальные решения, например, открытую среду разработки TeXstudio (поддерживает все основные операционные системы). Однако TeXstudio не единственный вариант. Вот наиболее распространенные альтернативы: TeXmaker, Kile, TeXCenter.

LaTeX состоит из пакетов, получить доступ к которым можно на странице CTAN (The Comprehensive TeX Archive Network). CTAN – центральный репозиторий, в который стекаются все сколько-нибудь стоящие наработки, имеющие отношение к TeX.

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

Итак, для запуска примеров из настоящего руководства потребуется установить дистрибутив TeX (например, MikTеX) и LaTeX-редактор (например, TeXstudio).

Введение в язык разметки LaTeX

В текстовых процессорах, которые позволяют в момент набора текста видеть его на экране дисплея точно таким, как он будет выглядеть на бумаге, используется концепция визуального проектирования (WYSIWYG – What You See Is What You Get). В LaTeX же используется концепция логического проектирования, когда внешний вид документа становится понятен только после компиляции.

Внешний вид документа определяется инструкциями, описанными на языке разметки TeX или LaTeX. Между этими языками сложно провести четкую границу. Сам LaTeX написан в командах TeX и в LaTeX-документе можно использовать практические любые TeX-команды. Упрощенно можно считать, что язык разметки LaTeX это высокоуровневая «синтаксически-сахарная» обертка для низкоуровневого языка TeX. Таким образом, TeX в основном применяется при разработке классов и пакетов, в то время как LaTeX – для подготовки печатного документа.

Теперь рассмотрим общий синтаксис языка LaTeX и познакомимся с базовой структурой tex-документа.

  • LaTeX-файл должен начинаться с команды \documentclass, задающей стиль оформления документа, например, \documentclass{article}. Аргумент команды article означает, что документ будет оформлен в соответствии с наиболее общими правилами оформления статей. При желании можно изменить (с незначительными оговорками) любой элемент макета документа.
  • Команда \documentclass поддерживает и другие классы, доступные «из коробки»: book (для оформления книг), report (для оформления отчетов – нечто среднее между book и article), proc (для оформления трудов конференций) и letter (для деловых писем со сложной структурой).
  • После команды \documentclass могут следовать команды, относящиеся ко всему документу. Далее с помощью окружения\begin{document}\end{document} (условимся называть его документарным окружением) указывается тело документа. В общем случае окружением называют сложные конструкции вида \begin{}\end{}.
  • Часть tex-файла между командой \documentclass и \begin{document}\end{document} называют преамбулой. Команды указанные после закрывающей скобки окружения документа \end{document} LaTeX проигнорирует.

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

base_example.tex
        \documentclass{article}
% область преамбулы
\begin{document} % тело документа: начало
% текст
\end{document} % тело документа: конец
% команды в этой части документа не будут учитываться при сборке документа
    

Инструкции, управляющие макетом страницы и прочие настройки tex-документа, могут быть размещены и в преамбуле, но когда инструкций становится много, будет удобнее вынести их в отдельный стилевой файл с расширением *.sty. Позже стилевой файл можно будет подключить командой \usepackage{}, принимающей в качестве аргумента путь до этого файла.

Сам стилевой файл содержит импорты пакетов \RequirePackage{}, пользовательские команды \newcommand{}, псевдонимы математических операторов \DeclareMathOperator и прочие элементы кастомизации:

style_template.sty
        % начало стилевого файла
\RequirePackage[english,russian]{babel}
\RequirePackage[utf8]{inputenc}
\RequirePackage{amsmath, amsfonts, amssymb, latexsym}
\RequirePackage[
	left=2cm,
	right=2cm,
	top=2cm,
	bottom=2cm
		]{geometry}
... 
\newcommand{\str}[1]{cтр.~\pageref{#1}}
\newcommand{\strbook}[1]{стр.~{#1}}
...
\DeclareMathOperator*{\argmin}{arg\,min}
\DeclareMathOperator*{\argmax}{arg\,max}
\DeclareMathOperator*{\sign}{sign}
\DeclareMathOperator*{\const}{const}
...
    

С подключенным стилевым файлом tex-документ будет выглядеть так:

base_example_with_usepackage.tex
        \documentclass{article}
\usepackage{style_template} % подключаем стилевой файл style_template.sty, расположенный в той же директории, что и tex-файл
\begin{document}
% текст
\end{document}
    

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

Далее предполагается, что все настройки макета документа описаны в стилевом файле style_template.sty, который расположен в той же директории, что и tex-файл.

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

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

Наберем в документарном окружении следующие строки:

simple_onepage_template.tex
        ...
\begin{document}

\title{Аналитический отчет по ...} % заголовок отчета
\author{\itshape Иванов И.И.} % автор работы
\date{} % просим LaTeX не указывать дату, так как будет
        % использован наш вариант оформления даты, описанный в стилевом файле
\maketitle % создает заголовок

\thispagestyle{fancy} % задает стиль страницы

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

\tableofcontents % создает оглавление

\section{Пример многострочной формулы}
    Для набора сложных многострочных формул используются различные окружения, например, окружение \texttt{multline}
	\begin{multline}
		F_{\zeta}(z)=P[\,\zeta\leqslant z\,] = \int\!\!\!\int_{x/y\leqslant z}f_X(x;n)f_Y(y;m)\,dxdy =\\ \dfrac{1}{2^{(n+m)/2}\Gamma(n/2)\Gamma(m/2)}\int\!\!\!\int_{x/y\leqslant z}x^{n/2-1}y^{m/2-1}\exp\left( -\frac{x}{2} \right) \exp\left( -\frac{y}{2} \right) \,\mathrm{d}x \, \mathrm{d}y.
	\end{multline}

\section{Пример группового размещения формул}

Несколько формул можно разместить в одной группе с помощью окружения \texttt{gather}
\begin{gather}
	\sum_{j \in \mathbf{N}} b_{ij} \hat{y}_{j} = \sum_{j \in \mathbf{N}} b_{ij}^\lambda \hat{y}_j + (b_{ii} - \lambda_i)\hat{y}_i \hat{y},\notag \\
	\det \mathbf{K}(t=1, t_1, \ldots, t_n) = \sum_{I \in \mathbf{n} } (-1)^{|I|} \prod_{i \in I} t_i \prod_{j \in I} (D_j + \lambda_j t_j) \det \mathbf{A}^{(\lambda)} (\, \overline{I} | \overline{I} \,) = 0,\tag{$a$} \\
	\mathbb{F} = \sum_{i=1}^{\left[ \frac{n}{2}\right] } \binom{ x_{i,i+1}^{i^2}}{ \left[ \frac{i+3}{3} \right]} {{\sqrt{\mu(i)^\frac{3}{2} (i^2-1)}} \over\displaystyle {\sqrt[3]{\rho(i)-2} + \sqrt[3]{\rho(i)-1}} }, \tag{$b$}
\end{gather}

\section{Простая однострочная формула}

Теорема Хинчина-Винера утверждает, что спектральная плотность мощности стационарного в широком смысле случайного процесса представляет собой преобразование Фурье от соответствующей автокорреляционной функции
\begin{equation*} % без нумерации
    S_{xx}(f) = \int\limits_{-\infty}^{\infty}  \, r_{xx} (\tau) e^{-j 2 \pi f \tau} \mathrm{d} \tau,\ \text{где}\ r_{xx}(\tau) = \mathbb{E}[\,x(t) \, x^{*}(t - \tau)\,].
\end{equation*}

\end{document}
    

Теперь можно вызвать компилятор PDFLaTeX через командную оболочку и передать ему имя tex-файла. Результат компиляции приведен на рисунке ниже.

Результат компиляции файла <code class="inline-code">analyt_report_template.tex</code>
Результат компиляции файла analyt_report_template.tex

Рассмотрим более подробно код файла analyt_report_template.tex.

  • В первых строках файла с помощью команд \title и \author мы объявляем заголовок отчета и имя автора работы соответственно, а с помощью команды \maketitleсоздаем заголовок.
  • Затем с помощью команды \date, вызванной без аргументов, подавляем вывод временной метки. Здесь для привязки ко времени будет использоваться специальная низкоуровневая командная вставка в стилевом файле style_template.sty (этот фрагмент кода приводится только для справки, так как конечному пользователю приложения нет необходимости вносить в стилевой файл изменения напрямую):
fragment_style_template.sty
        ... 
\def\@maketitle{
    \begin{flushright}
	\footnotesize\itshape
	Дата последней сборки документа:\\ \today\ в \currenttime
    \end{flushright}

    \begin{center}
	\let \footnote \thanks
	\begin{spacing}{1.5}
	    {\Large\bfseries\@title}
	\end{spacing}\vskip 1mm

	{\normalsize
	    \begin{tabular}[t]{l}
		\@author
	    \end{tabular}\par	
	}
    \end{center}
    \par
    \vskip 1.5em
}
...
    

Команда \thispagestyle задает стиль страницы, а команда \tableofcontents создает оглавление документа. С помощью команды \section создаются разделы документа высшего уровня (с учетом класса документа). Для того чтобы создать раздел более низкого уровня следующей ступени можно воспользоваться командой \subsection.

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

Как должно быть понятно из приведенного выше рисунка, equation используется для однострочных формул, multline – для многострочных, а gather – для группового размещения формул. Звездочка после имени окружения означает, что LaTeX не станет присваивать номера формулам, попавшим в это окружение.

При наборе формул используются специальные LaTeX-команды с названиями созвучными набираемому элементу, например, для того чтобы добавить в формулу знак суммы с нижним lowindex и верхним upindex индексом используется команда \sum_{lowindex}^{upindex}, чтобы вставить символ большой омеги – \Omega, а для вставки символа гамма потребуется \gamma и т.д.

Для быстрого поиска нужных математических LaTeX-команд, специальных символов, приемов оформления псевдокода и пр. удобно пользоваться компактным, но очень содержательным сборником Константина Воронцова «LaTeX 2e в примерах».

Прочие детали работы с издательской системой LaTeX можно выяснить из следующих работ:

Введение в Python-библиотеку Streamlit

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

Установить библиотеку проще всего с помощью менеджера пакетов pip: pip install streamlit.

Запускается приложение командой streamlit run:

streamlit_run.sh
        $ streamlit run streamlit_simple_example.py

  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8502 # <-- 
  Network URL: http://192.168.1.247:8502
    

После запуска сценария в браузере (http://localhost:8502) откроется вкладка с приложением. Завершить работу приложения можно, закрыв вкладку браузера и набрав Ctrl+C в командной оболочке.

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

Начать работу со Streamlit можно с вводного руководства, которое подробно описывает все возможности библиотеки, включая Markdown-разметку, аудио и видео объекты, различные графические объекты (Bokeh, Altair, Plotly и др.), а также оптимизацию загрузки объемных наборов данных.

Ниже приводится пример использования библиотеки Streamlit для построения двух интерактивных графиков (на базе библиотеки Plotly) гауссовских процессов с автокорреляционной функцией экспоненциального типа.

streamlit_simple_example.py
        import streamlit as st
import math
import pandas as pd
from pandas import Series
import plotly.graph_objects as go
import numpy as np
import numpy.random as rnd

title_app = "Простой пример использования библиотеки Streamlit"
# чтобы на вкладке браузера отображалось имя приложения, а не имя файла
st.set_page_config(
    layout="wide",
    page_title=title_app,
    initial_sidebar_state="expanded",
)


def gauss_with_exp_acf_gen(
    *,
    sigma: float = 2,
    w_star: float = 1.25,
    delta_t: float = 0.05,
    N: int = 1000,
) -> np.array:
    """
    Описание
    --------
    Генерирует дискретную реализацию
    стационарного гауссовского ПСП
    с КФ экспоненциального типа

    Параметры
    ---------
    sigma : стандартное отклонение ординат ПСП.
    w_star : параметр модели ПСП.
    delta_t : шаг по времени.
    N : число отсчетов ПСП.

    Возвращает
    ----------
    xi : массив элементов ПСП с заданной КФ
    """
    gamma_star = w_star * delta_t
    rho = math.exp(-gamma_star)
    b1 = rho
    a0 = sigma * math.sqrt(1 - rho ** 2)

    xi = np.zeros(N)
    xi[0] = rnd.rand()
    x = rnd.randn(N)

    for n in range(1, N):
        xi[n] = a0 * x[n] + b1 * xi[n - 1]

    return xi


def main(N: int = 100):
    timestmp = np.arange(N)
    # временной ряд №1
    time_series_1 = gauss_with_exp_acf_gen(sigma=5, w_star=1.25, N=N)
    # временной ряд №2
    time_series_2 = gauss_with_exp_acf_gen(sigma=6.5, w_star=1.75, N=N)

    fig = go.Figure()

    fig.add_trace(
        go.Scatter(
            x=timestmp,
            y=time_series_1,
            name="Временной ряд (объект-1)",
            opacity=0.8,
            mode="lines",
            line=dict(
                color="#E84A5F",
            ),
        )
    )

    fig.add_trace(
        go.Scatter(
            x=timestmp,
            y=Series(time_series_1).rolling(window=7).mean(),
            name="Скользящее среднее (объект-1)",
            mode="lines",
            opacity=0.6,
            line=dict(
                color="#FF847C",
            ),
        )
    )

    fig.add_trace(
        go.Scatter(
            x=timestmp,
            y=time_series_2,
            name="Временной ряд (объект-2)",
            mode="lines",
            opacity=0.8,
            line=dict(
                color="#5E63B6",
            ),
        )
    )

    fig.add_trace(
        go.Scatter(
            x=timestmp,
            y=Series(time_series_2).rolling(window=7).mean(),
            name="Скользящее среднее (объект-2)",
            mode="lines",
            opacity=0.6,
            line=dict(
                color="#6EB6FF",
            ),
        )
    )

    fig.update_layout(
        title=dict(
            # text="<i>Временной ряд</i>",
            font=dict(
                family="Arial",
                size=18,
                color="#07689F",
            ),
        ),
        xaxis_title=dict(
            text="<i>Временная метка</i>",
            font=dict(
                family="Arial",
                size=13,
                color="#537791",
            ),
        ),
        yaxis_title=dict(
            text="<i>Продолжительность простоя, час</i>",
            font=dict(
                family="Arial",
                size=13,
                color="#537791",
            ),
        ),
        xaxis=dict(
            showline=True,
        ),
        yaxis=dict(
            showline=True,
        ),
        autosize=False,
        showlegend=True,
        margin=dict(
            autoexpand=False,
            l=70,
            r=10,
            t=50,
        ),
        legend=dict(
            orientation="v",
            yanchor="bottom",
            y=0.01,
            xanchor="right",
            x=0.99,
            font=dict(family="Arial", size=12, color="black"),
        ),
        plot_bgcolor="white",
    )

    st.plotly_chart(fig, use_container_width=True)


if __name__ == "__main__":
    main(N=350)
    

В этом примере к библиотеке Streamlit имеет отношение только:

  • функция st.set_page_config(), которая переопределяет имя вкладки браузера – отображается не имя файла, а имя приложения;
  • функция st.plotly_chart(), которая принимает сконфигурированный Plotly-объект и выводит его в окно браузера.
Результат работы сценария <code class="inline-code">streamlit_simple_example.py</code>
Результат работы сценария streamlit_simple_example.py

Прочие элементы сценария streamlit_simple_example.py играют лишь вспомогательную роль.

Пример-шаблон аналитического отчета

Предлагается в качестве примера, сочетающего приемы работы с библиотекой Streamlit (браузерный интерфейс приложения) и LaTeX-разметку (опорный tex-файл), рассмотреть подготовку отчета на тему «Оценка усталостной долговечности силовых элементов транспортных машин под воздействием стационарных гауссовских процессов с автокорреляционной функцией экспоненциально-косинусного семейства».

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

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

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

downloader_for_streamlit.py
        def text_downloader(multiline: str) -> NoReturn:
    """
    Принимает LaTeX-шаблон документа в виде многострочной строки и
    создает на странице ссылку для скачивания шаблона
    """
    OUTPUT_TEX_FILENAME = "base_template_for_latex.tex"
    
    b64 = base64.b64encode(multiline.encode()).decode()
    # создает ссылку для скачивания файла
    href = (f'<a href="data:file/txt;base64,{b64}" '
            f'download="{OUTPUT_TEX_FILENAME}">Скачать ...</a>')
    st.markdown(href, unsafe_allow_html=True)
    

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

При наборе текстового шаблона для Python (latex_template_for_python.txt) – по сути файл представляет собой каркас документа с заглушками под строковую интерполяцию – важно помнить о синтаксических особенностях LaTeX. Дело в том, что в контексте строковой интерполяции фигурные скобки означают «место подстановки», а в контексте LaTeX – обязательный аргумент команды. То есть, чтобы Python корректно «прочитал» строку следует фигурные скобки, относящиеся к синтаксису LaTeX, удвоить.

В результате получится текстовый файл вида:

fragment_latex_template_for_python.txt
        \documentclass[
    11pt,
    a4paper,
    utf8,
]{{article}}

\usepackage{{style_template}}

\begin{{document}}
...
Усталостная долговечность по модели \eqref{{eq:miles}} составляет $ Y_{{NB}} = {Y_NB:.2f} $, сек.

\section{{Оценка усталостной долговечности по модели P.H. Wirsching и C.L.~Light}}
...
    

Ниже на рисунках приводится общий вид приложения.

Стартовая страница приложения
Стартовая страница приложения

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

pdflatex_start.sh
        # для сборки каркаса
$ pdflatex base_template_for_latex.tex
# для вычисления конечных ссылок на страницы, формулы и пр.
$ pdflatex base_template_for_latex.tex

    

После сборки документа в рабочей директории проекта будет создан pdf-файл.

Выгрузка подготовленного LaTeX-шаблона
Выгрузка подготовленного LaTeX-шаблона
Результат работы <code class="inline-code">pdflatex base_template_for_latex.tex</code>. Фрагмент собранного аналитического отчета
Результат работы pdflatex base_template_for_latex.tex. Фрагмент собранного аналитического отчета

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

Развертывание приложения на облачной платформе Streamlit
Развертывание приложения на облачной платформе Streamlit

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

Заключение

Из руководства вы узнали:

  • что собой представляет система компьютерной вёрстки LaTeX, где найти ее дистрибутивы и пакеты, как правильно читать документацию, как начать работать с системой;
  • как разрабатывать гибкие, масштабируемые шаблоны документов с помощью языка разметки TeX/LaTeX;
  • как использовать приемы разработки приложений с помощью Python-библиотеки Streamlit;
  • как может выглядеть пример связки «LaTeX + Streamlit»;
  • и, наконец, как развернуть приложение на облачной платформе Streamlit.

Полезные источники:

Связные материалы с платформы Proglib:

03
Июл
2021

📊 Как стать разработчиком BI-систем в 2021 году

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

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

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

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

Что такое Business Intelligence?

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

Кто такой разработчик Business Intelligence?

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

Разработчики систем бизнес-аналитики выполняют следующие функции:

  1. Создание и обновление BI-решений.
  2. Разработка технических запросов.
  3. Разработка точных поисковых запросов.
  4. Перевод данных в простые бизнес-термины и форматы для использования в других отделах.
  5. Работа с бизнес-аналитиками и другими Data-разработчиками.
  6. Создание визуальных документов для представления данных.
  7. Документирование процессов для будущего использования.
  8. Устранение неполадок моделирования бизнес-аналитики и разработка решений.
  9. Резервное копирование и безопасное хранение данных.

Что надо знать?

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

  1. Теория вероятностей и математическая статистика.
  2. Управление базами данных. Язык запросов SQL.
  3. Язык программирования Python (pandas, numpy, matplotlib).
  4. Технология обработки данных OLAP (online analytical processing).
  5. Принцип работы с ETL.
  6. Продуктовая аналитика и BI-инструменты (Tableau, Power BI).
  7. Apache Airflow.
  8. Работа с хранилищем данных SQL Azure.
  9. Git.
  10. Linux.
  11. Технический английский язык.
Важные «мягкие» навыки (soft skills), необходимые в профессии
Умение работать в команде, дисциплинированность, выносливость и адаптируемость к изменяющимся обстоятельствам, любознательность и способность в краткие сроки усвоить большой объем новой информации. Хороший разработчик должен уметь объяснять сложные концепции простым языком, для более продуктивного диалога с ответственными, за принятие решений людьми.

Наиболее популярные платформы для анализа данных – Tableau и Power BI

Power BI – набор инструментов для визуализации аналитических бизнес-данных от Microsoft, структурирующий полученную из различных источников информацию. В его стартовый пакет входит несколько коннекторов, служб (Power BI desktop, Power BI SaaS) и мобильное приложение для всех популярных платформ. Power BI desktop применяется для создания отчетов, Power BI SaaS (Software as a Service) публикует эти отчеты, а мобильное приложение используется для их мониторинга. Платформа позволяет подключаться к различным неструктурированным файлам, базам данных SQL, облаку Azure и к веб-платформам, вроде Facebook, Google Analytics и Salesforce. Скачать последнюю версию программы можно по ссылке.

Вот несколько полезных ссылок для разработчиков Power BI:

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

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

  1. Аналитическая скорость. Не требуется высокий уровень знаний в области программирования, почти все делается перетаскиванием.
  2. Легкое обслуживание. Не требуется сложная настройка программного обеспечения. Популярную десктопную версию легко установить.
  3. Визуальное обнаружение. Использование инструментов визуализации (цвета, линии тренда, диаграммы и графики).
  4. Возможность смешивать разнообразные наборы данных (реляционные, неструктурированные и обработанные источники данных) в реальном времени без дорогостоящих предварительных затрат на интеграцию.
  5. Архитектура Agnostic. Tableau работает на всех типах устройств, пользователю можно не беспокоиться о требованиях к оборудованию или программному обеспечению.
  6. Совместная работа в реальном времени. Сортировка и обсуждение данных, возможность встраивать интерактивную панель управления в порталы SharePoint и Salesforce.
  7. Источник централизованных данных – сервер Tableau предоставляет централизованное место для управления всеми опубликованными источниками данных организации.

Бесплатную персональную версию Tableau Desktop можно загрузить отсюда.

Полезные ссылки для разработчиков Tableau:

Сколько зарабатывает BI-разработчик?

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




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


***

Существует два пути в профессию разработчика Business Intelligence. Первый – это самообразование. Он непростой и длительный: без опытного наставника освоить специальность будет сложно. Главный минус этого варианта – недостаток практики при большом объеме теории. Второй путь – онлайн-курсы. Рекомендуем обратить внимание факультет BI-разработки образовательного портала GeekBrains. Под руководством практикующих специалистов вы сможете изучить все нюансы профессии, отточите навыки на практике и создадите 5 проектов для портфолио. Сделайте правильный выбор!

29
Июн
2021

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

Подборка инструментов, которые являются общими для львиной доли Java-разработчиков, а некоторые — и вовсе для большинства backend-программистов.
— Читать дальше «Инструменты, которыми пользуются Java-программисты в повседневной работе»

24
Июн
2021

Лучшие практики стилизованных компонентов React

Приведённые в статье советы и рекомендации должны помочь вам грамотно использовать стилизованные компоненты React.
— Читать дальше «Лучшие практики стилизованных компонентов React»

22
Июн
2021

🛠 Лучшие инструменты No-Code для разработчиков в 2021 году

Существует множество инструментов no-code, но выбрать правильные сложно. В небольшом обзоре мы выделили лучшие продукты для разработчиков, которые будут активно использоваться в 2021 году.

22
Июн
2021

🛠 Лучшие инструменты No-Code для разработчиков в 2021 году

Существует множество инструментов no-code, но выбрать правильные сложно. В небольшом обзоре мы выделили лучшие продукты для разработчиков, которые будут активно использоваться в 2021 году.

21
Июн
2021

Free Dev Stuff — сборник бесплатных инструментов для разработчиков

Тут есть как «попсовые» варианты, так и те, о которых большинство даже не слышало.
— Читать дальше «Free Dev Stuff — сборник бесплатных инструментов для разработчиков»

17
Июн
2021

🎮 Разработка игр на Unity: 10 важных советов для начинающих

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

1. Освойте необходимые для старта навыки

Для начала работы в Unity вам нужно знать хотя бы один из перечисленных языков программирования: C#, JavaScript или Boo. Будет отлично, если вы владеете еще и 3Ds max. Это сильно вам поможет в написании игры.

2. Изучите основы дизайна

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

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

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

Для себя я выделил ТОП-3 полезных каждому разработчику инструмента:

  • Graphy – это идеальный, простой в использовании и многофункциональный счетчик кадров в секунду, монитор статистики и отладчик для вашего проекта на Unity. Отладчик позволяет вам установить одно или несколько условий, выполнение которых приведет к желаемым последствиям, таким как снимок экрана, приостановка работы редактора, печать сообщения на консоль и т. д. Можно даже вызвать метод из собственного кода.
  • Lunar Unity Mobile Console – это высокопроизводительная и легкая в управлении консоль тестирования и отладки Unity для iOS/Android.
  • Odin Inspector and Serializer – единственный полностью платный плагин в топе, но он того стоит. OdinSerializer очень хорошо сравнивается со многими популярными библиотеками сериализации с точки зрения производительности и распределения мусора, обеспечивая при этом превосходный набор функций для использования в Unity. Графики производительности в этом разделе профилируются в двоичном формате.

4. Освойте Blender и Maya


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

5. Подучите терминологию

Индустрия игр достаточно быстро развивается, и в сфере их разработки давно появилась собственная терминология. Например, retargeting – это применение созданной для одной модели анимации к другой модели, а rigging – процесс построения скелетной иерархии сочленений костей для вашего меша (что такое «меш», попробуйте узнать сами). Для ознакомления с профессиональным жаргоном стоит прочесть «Unity Руководство: Словарь терминов анимации и Mecanim».

6. Учтите распространенные ошибки новичков


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

  1. недооценка фазы планирования;
  2. работа с неоптимизированными моделями;
  3. построение взаимозависимой архитектуры кода;
  4. игнорирование потерь производительности;
  5. игнорирование проблем со сборкой мусора;
  6. отсутствие оптимизации использования памяти и хранилища;
  7. общие ошибки физики;
  8. тестирование всей функциональности вручную.

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

7. Используйте обучающие материалы для новичков

Из обучающих материалов по Unity я порекомендую книгу «Unity 3.x Game Development Essentials». В ней вы найдете нужную для создания игры с нуля информацию.


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

8. Подумайте о маркетинге и рекламе

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

9. Изучите мнения экспертов

В широком мире разработки игр информации предостаточно. Если вы не будете осторожны, вы можете оказаться в море информации настолько глубоком, что вам будет трудно держать голову над водой. Обучающие видеоролики-отличный способ узнать новую информацию, не чувствуя себя подавленным. Мы собрали пять лучших учебных пособий по Unity от создателей YouTube, чтобы помочь вам ознакомиться с инструментами и мышлением разработки игр. Смотрите, слушайте и учитесь у профессионалов Unity. Чтобы начать разработку, вам необходимо иметь хотя бы базовые знания программирования. В частности, для движка Unity нужно знание языка C#. То есть должно быть понимание основ ООП, основных структур данных. Если говорить про среды разработки, то это могут быть как MS Visual Studio, так и другие сторонние решения, где вам удобно будет писать код.
Александр Саваткин, Senior Developer в компании Alawar

10. Пройдите обучение на курсах

Если вы только начинаете путь в профессии, обратите внимание на курс факультета разработки игр на Unity образовательной онлайн-платформы GeekBrains. В нем уделяется большое внимание практике, а студенты в процессе обучения реализуют 2D- и 3D-игры разных жанров для ПК и смартфонов. С таким багажом можно идти на собеседование с потенциальным работодателем, тем более платформа предлагает студентам бесплатные карьерные консультации и помогает подобрать соответствующие их навыкам вакансии.

15
Июн
2021

Курс «Python и инструменты машинного обучения»

Обучение работе с аналитическими инструментами в Python от Московского физико-технического института. 2 месяца практических онлайн-вебинаров и сертификат о повышении квалификации в финале.
— Читать дальше «Курс «Python и инструменты машинного обучения»…

14
Июн
2021

Серебряные пули против оборотней или чем пользуется Full Stack Developer

Подборка технологий и инструментов, которые использует в своей работе Full Stack разработчик. От фреймворков до плагинов для IDE.
— Читать дальше «Серебряные пули против оборотней или чем пользуется Full Stack Developer»