Мой опыт работы
Мой первый опыт работы был с компьютером на процессоре Z80 в 90ые годы. Тогда я с помощью языка Basic и псевдографики реализовал визуализацию значений функции эмуляции звука. И так как компьютер был доступен лишь в редкие часы мне приходилось программировать в тетрадке, а затем проверять код на компьютере.
Мои основные разработки
- Разработка центрального фондового каталога
- Разработка ERM+HELPDESK
- Участие в проекте создания межрегиональной торговой площадки
- Разработка Scada системы
- Разработка многопоточного веб-краулера
- Разработка измерителя кубатуры
- Разработка системы управления сетью светильников по протоколу Dali (2019)
- Цeнтpcвeт
Моя первая профессиональная деятельность
Затем была учёба в университете и работа в государственном архиве. В мои обязанности входило разработка баз данных и систем ввода и учёта данных, а так же администрирование локальной сети предприятия. В этот период мне пришлось разработать первый веб-сайт и разместить его на сервере правительства моей области. Среди прочих требований было обязательным то, что программа должна была работать в среде Linux. Так начался мой опыт работы с Linux и первое своё веб-приложение я реализовал на понятном мне языке программирования C++ и с помощью библиотеки CGICC. Так как на этом сервере нам не дали доступа к базе данных я и мой коллега разработали собственный формат файла в котором хранились все данные для работы сайта (текст, фотографии, статические css и js файл). В этом файле применялось сквозное шифрование и имелась система контроля доступа к объетам. Таким образом я пытался сэмулировать работу файловой системы Linux. Так же был разработан собственный шаблонизатор микроязык разметки. В ходе этой работы я научился работать с системой Make, CVS, разобрался с тонкостями компиляции и инсталяции программ в различных средах. Наша программа запускалась в Windows 2000, FreeBSD5.3 и RedHat/Linux. Для взаимодействия с HTTP сервером использовался протокол Cgi
Переход от C++ на использование Python и Mysql
В течении нескольких лет я поддерживал работку приложения предприятия на языке C++ и операционной системы Windows. Затем было принято решение провести оптимизацию и переработку всех систем с использованием операционной системы Linux. Почти на всех компьютерах была проведена замена операционных систем и переобучение пользователей. Так же с этого момента я начал использовать для разработки Python и Mysql как сервер для баз данных. В качестве системы генерации HTML был выбран, казавшийся на тот момент стабильным, язык XSLT и я во время отпуска создал альтернативу государственной программы «Архивный Фонд». Программа использовала инновационный на тот момент для архивов подход ввода данных и доступа к данные с помощью веб-интерфейса. Была создана система которая интегрировала в себя многочисленные базы данных государственного архива и предоставила сотрудникам единый интерфейс с разграничением функционала в зависимости от авторизации. Системы была построена с помощью Mysql/Python/XSLT/HTML/JS
Разработка центрального фондового каталога
Следующим этапом стала разработки системы объединяющей данные со всех архивов области. Система наследовала структуру базы данных предыдущего проекта, но использовала Django. С помощью этой системы удалённые сотрудники других архивов области, после авторизации, импортировали свои базы данных в формате DBF и сайт предоставлял возможность поиска по всем архива нашей области. ( http://fk.archiv-kirov.ru/ )
Разработка мультидоменной CMS с помощью Flask
Следующим естественным этапом развития стала разработка мультидоменной системы управления сайтами как для государственных архивов так и для других коммерческих и общественных клиентов. Для разработки системы я выбрал Flask, как гораздо более гибкий и удобный фреймворк относительно Django, который, как выяснилось имеет очень слабый ORM, очень плохой язык шаблонов и не гибкую внутреннюю архитектуру. Впрочем я участвовал в разработке многих проектов с помощью Django и занимаюсь поддержкой нескольких проектов на этом фреймворке и вижу что Django всё таки лучше любого PHP фреймворка. Моя новая система управления контентом помимо основных функций публикации текстов и файлов имела множество дополнительных модулей. Использование гибкой архитектуры Flask позволило мне создать систему динамической загрузки модулей и решать задачи разных клиентов в рамках одного проекта и одной базы данных. Например,, одним клиентам была необходима синхронизация сайта с социальной сетью и я реализовал модуль интеграции с помощью API, модуль занимался синхронизацией контента сайта и группы в социальной сети, а так же предоставлял клиенту уведомления о событиях на сайте через социальную сеть. Были реализованы множество модулей от онлайн платежей до выставление счетов и актов для внутренней работы предприятия. Для совместной работы с дизайнерами и другими программистами была использована Git
Я несколько лет занимался развитием этого проекта и наблюдал все плюсы и минусы использования мультидоменных систем управления контентом. Эта система продолжает работать и сейчас.
Участие в разработке b2b портала
Дальше я стал активно участвовать в чужих проектах. Так например я разрабатывал b2b версию сайта 003ok.ru . Суть проекта была в том, что сайт 003ok предоставлял возможно заказать подарок из своего города в любом другом городе. Моя задача была разработать систему кабинетов оптовых покупателей, которые делая оптовые заказы на оптовом сайте, автоматически обновляли витрину возможных подарков своего города на розничном сайта. Система была построена с помощью Django и использовала мультидоменные возможности этого фреймворка. Одной из главных задача была синхронизация оптового каталога с несколькими оптовыми базами. Синхронизация происходила через обработку и импорт файлов прайсов оптовых баз. (сейчас это проект уже закрыт из-за высокой конкуренции Yandex на этом рынке)
Разработка PAM модуля
Интересным опытом оказалась защита сайтов и серверов. После того как ко мне обратились сотрудники одной кафедры Бауманского университета за помощью в решении проблемы заражения их сайта вирусов. В процессе анализа работы сервера я выяснил, что сервер кафедры атаковали с целью подбора пароля SSH и спустя полгода сервер был взлома и использован для рассылки спама и заражения клиентов сайта вирусами. Стало ясно, что защиты с помощью пароля оказалось не достаточно и сложностью любого пароля и DenyHost можно с обойти помощью распределённой сети роботов подбирающей пароли. Для решения этой проблемы была разработана двухэтапная авторизация. Я разработал PAM модуль, который включался после правильного ввода SSH пароля и требовал от пользователя ввести временный пароль который был отправлен на номер телефона системной учётной записи пользователя с помощью SMS через шлюз доставки SMS сообщений. Этот модуль написан с помощью языка C и расширяет систему авторизации Linux (https://github.com/ffsdmad/pam_p11). Очевидно, что с его помощью можно надёжно защитить свои Linux сервера. На разработку и отладку модуля у меня ушла одна неделя.
Разработка ERM+HELPDESK
Следующим интересным опытом оказалась переработка HelpDesk системы компании которая занимается обслуживанием автозаправок в Москве (dkmt.ru). Существующая система представляла из себя PHP скрипт который обрабатывая входящую почту генерировал заявки на обслуживание АЗС и в связке с Delphi программой отправлял уведомления о новых заявкам исполнителям с помощью SMS. Для реализации я опять выбрал Flask и систему динамических модулей моей мультидоменной системы. С помощью sqlachimycodegen я сгенерировал из существующей базы данных модели Flask, расширили их и добавил новые. Затем реализовал ERP предприятия со всеми функциями прежней Helpdesk системы. Среди основных нововведений я бы отметил:
-
разделение пользователей по ролям с соответствующими настройками интерфейса
-
возможность ручной настройки источников входящей почты
-
интеграция точек обслуживания с геолокационными сервисами Yandex
-
интеграцию с Telegram для дублирования отправки уведомлений
-
использование мобильной вёрстки для доступа к системе со помощью мобильных устройств
-
механизм формирования и учёта рабочего времени сотрудников
-
встроенный багтерекер и система помощи
-
механизм хештегирования для внутренней перелинковки объектов системы
-
переработка Delphi приложения с расширением возможностей обработчика SMS
-
использование Celery для обработки фоновых задач
на разработку системы я потратил два месяца и сейчас периодически добавляю новые функции
Участие в проекте создания межрегиональной торговой площадки
Дальше мне приходится подхватывать разработку чужого проекта на Django, главной задачей является создание специализированных кабинетов пользователей в зависимости от роли пользователя, оптимизация работы каталога для работы с огромным числом записей, создание специализированных интерфейсов ввода данных для сотрудников портала. В этом проекте опять проявляется все проблемы Django и сложности адаптации фреймворка для решения сложных задач отличающихся от функций обычной CMS. Для решения проблемы было решено разработать и применять RestFull API и использовать на фронтэнде с помощью Angular. Для этого я опять сгенерировал модели Flask, интегрировал систему авторизации и управления ролями Django в микросервисы Flask. Была проведена оптимизацию тяжёлых ORM запросов и замена самых сложных на оптимальный чистый PosgreSQL код. Для оптимизации работы с мультимедиа контентом был разработан микросервис обработки мультимедиа – https://github.com/ffsdmad/ffstatic, сейчас я активно использую этот сервис в других проектах. Так же этом проекте мной реализованы новые для меня функции агрегатора новостей и генератор почтовых рассылок с помощью flask_celery. В этом проекте мне приходилось координировать работы нескольких разработчиков, системного администратора и верстальщика. Для взаимодействия мы использовали mercurial, а затем вернулись на git. Деплой проекта осуществляется с помощью TeamCite.
Видео процесс совместной работы над этим проектом
Работа над проектом продолжалась больше полугода, сейчас проект заморожен по финансовым причинам.
Разработка Scada системы
Однокашик-инженер-схемотехник предложил реализовать систему управления разработанной им системы контроля эстакады сортировки древесины. Данная система предназначена для автоматизации процесса сортировки брёвен. Так появилась Scada система, которая с помощью модуля modbusrtu взаимодействует датчиками и реле. Полученные данные обрабатываются с помощью математических методов с целью выделения из непрерывного потока данных объектов которые соответствую брёвнам проходящим по конвейеру эстакады. Затем выделенные объекты заносятся в базу данных и проходят цикл логической обработки для направления в подходящий сборник древесины. Система использует многопоточные возможности Linux и Python реализует несколько циклов обработки данных:
-
процесс обработки регистров датчиков и реле (выступает в роли UPS сервера)
-
цикл обработки логики
-
цикл обработки входящих событий (используется механизм Redis подписок)
в качестве интерфейса системы выбран веб-интерфейс и модуль Flask_admin. С помощью модуля Flask_admin реализовано разграничение прав и учёт пользователей и обрабатываемой древесины, а так же контроль за состоянием и настройки Scada. В качестве метод взаимодействий используется модуль socketIO, который доставляет данные о состоянии Scada на страницу где данные обрабатываются с помощью Angular библиотеки и формируется анимированный тренд. На тренде отображаются брёвна находящиеся на конвейере. Тренд формируется с помощью SVG полигонов. Так же в системе реализована система учёта действий пользователей и обработка статистики работы эстакады.
► Часть описания системы
Для управления состоянием Scada я использовал функционал Redis сервера, для синхронизации поток я использовал Queue.
Видео процесса работы Scada в режиме эмуляции сигналов с датчиков
На разработку данной я потратил один месяц
Разработка многопоточного веб-краулера
Для реализации интересной задачи по скачиванию, обработке и формированию базы данных (скрапинг) с сайта третьих лиц, я реализовал многопоточное приложение, которое управляя распределенной сетью выделенных серверов и арендованных прокси скачивает содержимое большого сайта, обрабатывает скачанные страницы на узлах сети и формирует на центральном сервере единую базу данных. В ходе работы я решил проблему снижения нагрузки на SQL сервер из-за большой скорости запросов вставки и проверки на дублирование информации, а так же балансировку нагрузки на целевой сайт и обход методов защиты целевого сайта от скраинга. Для управления процессом скрапинга я так же использовал модуль Flask_admin и функции Redis сервера. Мне удалось достичь скорости в несколько миллионов страниц в сутки.
Видео процесс работы веб-краулера
На разработку системы я потратил одну неделю
Разработка измерителя кубатуры
На основе разработанной ранее системы управления сортровкой леса разработал систему подсчёта и учёта кубатуры леса входящего на дереобработку. Данная система:
- переопределяет основной объект Скада системы
- обрабатывает всего два датчика
- для отображения и ввода информации используется графический интерфейс Tkinter
- в графическом интерфейсе имеется возможность просмотра и редактирования:
- количественных показателей за смену, за месяц, максимальные
- изменение настроек Скада блока
- добавление пользователей и выбор руководителя смены
- отображение длинны двигающего под датчиком "снаряда"
- так же имеет возможность использовать веб-интерфейс
- использует микрокомпьютер Rasbery PI3 и 5 дюймовый тачскрин
Разработка системы управления сетью светильников по протоколу Dali (2019)
Была поставлена задача разработать устройство с помощью которого электромонтёры могли бы настроить сеть светильников смонрированных но основе сети Dali. Проблема состояла в том, что для настройки такой сети приходилось привлекать программистов "умного дома" которые настраивали каждый отдельный светильник и устанавливали его в нужное место, а затем программировали управляющий контроллер.
Задача была решена следующим образом: был придуман способ который предусматривал сброс настроек светильников с последующим их программированием без применения специальных средств, необходимо было лишь оставить в dali сети группу светильников соответствующую заданию и нажать пронумерованную кнопку на нашем контроллере, после чего группа светильников получала свой номер группы и цикл повторялся пока будут запрограммированы светильники всех групп.
Для реализации контроллера была задействована платформа Raspberry и адаптер уровней напряжения сети Dali, данные с адаптера попадали на порт GPIO и обработка производилась Python приложением. Python приложение обрабатывало прерывание и организовывало преобразование последовательного сигнала в управляющие команды протокола Dali. С помощью Python приложения был реализован сборс конфигурации сети и начальная инициализация светильников, затем с помощью обработки входящих значений GPIO порта от кнопок прозводилась запись номера группы светильников
Так же было реализовано удалённое управление офисной сетью светильников (включение/выключение) с помощью контроллера Raspberry/Python через сайта компании, передача сигналов включения/выключения от сайта осуществлялась через Redis/Subscribe
Для удешевления устройства платформа Raspberry была заменена на контроллер STM32, Python приложение переписано на C++ и основе имеющейся схемотехники был собран собственный адаптор уровня напряжений сети Dali. Удалось снизить себестомость контроллера с 10 тыс.руб до 500 рублей
Работа в Цeнтрcвeт (2018)
В 2018 инфраструктура проекта представляла из себя 1 VDS хостинг и Dango приложение, чистый Django проект с перенесённой структурой каталога 1С и обновлением цен каталога через выгрузку XML.1С
Не было ни тестового сервера, ни отдельной среды разработки, не было ни git ни ssl, фронт был реализован на шаблонах Django + Jquery, резервных копий не делалось и сайт регулярно терял данные и падал. Процесса деплоя как такового не было, так как даже контент-менеджеры самостоятельно исправляли Django-шаблоны через FTP сервер прямо в продакшене, что так же часто приводило к простоям сайта.
От меня требовалось:
- создать отказоустойчивую систему предоставления клиентам доступа к каталогам продукции компании
- обеспечить возможность интерактивного взаимодействия сотрудников компании с клиентами и партнёрами с помощью сайта
- интегрировать платёжные системы, месенжеры, CRM системы
- обеспечить работу английской версии сайта с раздельным формированием номенклатуры и цен на продукцию и соответствующим контентом
- разработать конфигураторы заказов для помощи клиентов в подборе сложных конфигураций компонентов
- разработка административных интерфейсов для разных отделов сотрудников сайта
- постоянное развитие сейчас и реализаций новых идей заказчика
за время работы с проектом было проделано
- подключил GIT на выделенном сервере с доступом через SSH, там же разместил и другие проекты компания, недавно запустил Gitlab сервис с импортом текущих проектов, постепенно перевожу туда задачи команды
- настройка создания бекапов и автоматического разворачивания на резервных серверах с помощью bash скриптов, создание отдельных сред разработки и тестовых серверов
- запустил и подключил балансировщики трафика haproxy. Так как сайт работает на нескольких доменах и разных языковых зонах, а так же использует собственный CDN (Flask/Pillow), использование haproxy позволило получить более отказоустойчивую схему, а так же автоматизировать генерацию ssl для доменов размешённых на разных серверах, а так же скрыть очень большую часть инфраструктуры компании
- подключил celery/очереди задач, с её помощью выставляются счета (paykeeper/сбербанк/юмоней), отправка почты, логирование действий персонала и партнёров сайта, чистка кеша CDN и пр.
- разработка личных кабинетов пользователей, изначально задача стояла сделать ЛК для всех клиентов, но сейчас кабинеты оставили только для партнёров где они могут подгрузить договора, заказать оформление своих бонусов, просмотреть часть информации хранящейся в 1С (двухсторонняя интеграция с 1С)
- заменил фронтенд django-шаблонов на фронт генерируемый с помощью webpack (babel|production) из vue2 приложений активно использующих restapi сайта, сейчас почти все разделы генерируются с помощью VUE и разработку фронта ведётся отдельно подготовленным специалистом, первоначально выбор был между Angular и VUE
- синхронизация с 1С по различным моделям (продукция, счета, заказы, профили пользователей)
- для упрощения и ускорения управления DNS зонами поднял собственные DNS сервера и разместил все домены компании (их уже больше 50), заскпритовал генерацию зон и конфигураций Nginx сервера, синхронизацию DNS серверов
- разработка административных интерфейсов для персонала сайта (переводчики, контентщики, сеошники, маркетологи, менеджеры по работе с клиентам и партнёрами)
- текущая разработка сайта (новые разделы, новые шаблоны, доработка каталога, интеграции с различными сервисами)
- разработка интерактивных конфигураторов заказа, так как наша продукция это набор взаимосвязанных компонентов мы постоянно дорабатываем наши конфигураторы, добавляя новые связи и свойства
- локализация английской версии сайта
- интеграция с Yandex.Direct (импорт кампания, групп и объявлений) позволила оперативно контролировать рекламные компании со структурой каталога сайта, на сайте существует проблема регулярного перемещения и изменения состояния продуктов
- разработка Celenium-тестов работоспособности сайта
- перманентная оптимизация на уровне sql так как номеклатура каталога постоянно разрастается со стороны 1С и у меня нет возможности контролировать этот рост, лучшим решением оказалось использование виртуальных схем постгресса и оконных функций, сейчас по сути, Django используется для редактирования некоторых конкретных объектов сайт, который синхронизируются частью значений с 1С, а выборки и группировки происходят в схемах постгресса и зависит от перегенерации этих схем, что позволило значительно сократить нагрузки Django
- разработал систему управления светильниками на основе протокола Dali/Dali2, система разрабатывалась для предложения клиентом совместно с продукцией компании (параллельно разрабатывалось мобильное приложения для Apple https://apps.apple.com/ru/app/centrsvet/id1490230330 ), но с приходом на отечественный рынок https://casambi.com/ компания отказалась от продвижения собственного контроллера на протоколе Dali в пользу продвижения контроллеров casambi
- периодическое обновления среды разработки, совместно с обновлением серверной ОС, стараюсь не пропускать LTS релизы
- интеграция службы MPD для трансляции потокового радио в шоурумах компании (https://python.breys.ru/page/mpd+songs+amq) позволило отказаться от попавших под санкции стримонговых планых сервисов и съэкономить деньги
- перенос проекта в контейнерную среду Docker, запуска собственного сервера docker-образов, запуск нескольких узлов копий, маршрутизация трафика заказов и внутреннего документооборота
- интеграция django-graphql и apollo.vuejs на замену django-rest-framework
так как мы работаем в одном офисе, имеем прямой визуальный контакт с заказчиком и специалистом по фронту, а так же наши контентщики выполняют роль тестировщиков, у нас получилась специфичная схема в которой не прижилась ни один таскменеджер
сейчас проект использует два сервера балансировки трафика, три DNS сервера (1Master/2Slave), три дублирующих сервера web-приложений, три рабочих и тестовых среды разработки
за 4 года сайт падал два раз, один раз на ночь, когда случился пожар в датацентре FirstVDS, затем на несколько часов когда происходили технические проблемы на канале связи нашего балансировщика, сейчас это проблема купируется резервным балансировщиком и динамическими настройками DNS