Отрисовка интервалов в SVG

На днях работал над необычной для меня задачей: подготовить инструмент для отображения на графике интервалов времени, в частности чем занимался сотрудник в течение рабочей смены. Для back-end разработчика это оказалось хорошей тренировкой в JavaScript и его возможностях в современных браузерах. Например, полностью писать с нуля было бы слишком затратно, так что пришлось покопаться в том, какие решения доступны под открытыми лицензиями. В итоге был выбран неплохой скрипт использующий библиотеку D3 которая уже использовалась в компании. Но сам скрипт не обладал всеми нужными возможностями, так что с одной стороны создал его форк на github и добавил туда все свои доработки. А с другой стороны была дописана обвязка с интерфейсом с применением Bootstrap для наших целей (она принадлежит репозиторию компании 🙂 ).

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

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

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

'Traceback (most recent call last):\n  File "/usr/lib/python2.7/dist-packages/XXX/XXX/XXX/xxx.py", line 180, in connect\n    connection = cx_Oracle.connect(**self.dsn)\nDatabaseError: ORA-12170: TNS:\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xba\xd0\xbb\xd0\xbe \xd0\xb2\xd1\x80\xd0\xb5\xd0\xbc\xd1\x8f \xd0\xbe\xd0\xb6\xd0\xb8\xd0\xb4\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f \xd1\x81\xd0\xbe\xd0\xb5\xd0\xb4\xd0\xb8\xd0\xbd\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f\n\n'

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

Continue reading Протоколирование в Sentry для Twisted

Создание debian-пакетов из архивов PyPi

Довольно часто в работе возникает необходимость использовать дополнительные пакеты из PyPi, но при этом накладывается ограничение – пакет должен быть установлен в виде debian-пакета, чтобы было понятно как им управлять и откуда взять. Для проектов, работающих внутри virtualenv проблем нет: сборщик пакета устанавливает их автоматически. А вот для других проектов очень полезным оказался недавно обновленный инструмент stdeb. После установки расширения превращение архива из PyPi в debian-пакет выглядит следующим образом:

  • Скачать актуальную версию архива с расширением, например:
    pypi-download raven
  • Собрать из архива debian-пакет:
    py2dsc-deb raven-5.0.0.tar.gz

В результате (после установки требуемых для сборки зависимостей) получаем готовый для установки пакет вида python-raven_5.0.0-1_all.deb.

Service name given as port is unknown

Встретился с забавной ошибкой от twisted при отладке очередного проекта:

Service name given as port is unknown: service/proto not found ('5672')

Поиск выводит только на сообщения с похожей ошибкой без ответов, а ларчик открывается просто: при вызове connectTCP номер порта должен быть строго целым числом, иначе twisted ищёт нужный порт, считая что вы передали ему название сервиса (как описано в /etc/services). Конечно, в этом справочнике сервисов такого названия не будет.

К слову о многопоточности

Довелось по работе столкнуться с сервисом шифрования, который был написан по словам авторов, вроде бы очень просто и примитивно, но протокол был очень неприятный: обмен шёл 18-байтовыми блоками символов через TCP-порт. Решил сделать к нему небольшой проксирующий сервис на twisted, который бы вёл приём данных через HTTP POST запросы, выдавая результат в ответ. Стал проверять на скорость работы, и, этот «лёгкий простой» Java-сервис шифрования оказалось не выдержал и 100 единовременных запросов. Пришлось в тестах ограничиться 10-ю потоками, а заодно озадачиться вопросом как twisted переиспользует объекты протокола в многопоточном доступе (об этом другая история).

Мораль такова: как и бывший коллега в тестах обнаружил, что twisted выдерживает на удивление столько потоков, что падаёт то, что стоит за ним, так и здесь получилось, что то, что кажется кому-то простым и надёжным, на деле оказывается весьма падуче-тяжеловесным, когда речь идёт о высокой нагрузке. И спасибо разработчикам twisted за столь стремительный фреймворк 🙂

Сборка debian пакета для дополнения к PHP из PECL

Я довольно часто использую удобный класс HTTPRequest из дополнения pecl_http, который описан в официальной документации по PHP. Но в очередной раз устанавливая его из PECL поразился тому сколько шагов нужно сделать для его сборки на чистой системе, после чего решил подсобить админам, собрав для него стандартный debian-пакет.

Continue reading Сборка debian пакета для дополнения к PHP из PECL

Польза новых задач

По-настоящему мощь очередного фреймворка понимаешь, когда наконец-то сталкиваешься с задачей под которую он очевидно был заточен и вокруг базы под которую он обрастал. Как сейчас столкнулся на работе с необходимостью реализации немного извращённого соединения с обменом данными через TCP-сокеты сообщениями по ISO 8583. Быстрый любопытный взгляд в классы Twisted открыл что всё написано до нас, и всё, что остаётся – обернуть в красивую запускалку, дописать чуток логики и поработать над тестами, которые открыли несколько скрытых болезней. Ну и спасибо нашим админам, ещё поучиться засовывать получившийся модуль в красивый debian-пакет со скриптами и прочими свистелками :).

Оптимизация для Python

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

Do it satchmo way

Недавно потребовалось быстро развернуть более-менее универсальный магазин для нашего нового проекта торговли велотоварами. PHP-системы мне как-то не нравились и из симпатии к python начал было писать проект на django, но вскоре понял, что скорее всего получается велосипед, и начал искать что-то готовое. Оно пришло в виде Satchmo, весьма универсального и накручиваемого решения для электронной торговли. Что понравилось – немало настроек, в которых поначалу можно запутаться. Есть тонкости в адаптации под себя, но они описаны в документации (один отсутствующий момент – это как обновлять sitemaps, пришлось додумывать и доделывать самома). Но главное, магазин развернулся из коробки и через пару часов в нём уже можно было добавлять товары. А вот допиливания мелочей происходят уже по ходу, и зачастую незаметно для посетителей 🙂