Service name given as port is unknown

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

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

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

Экспорт-импорт данных django-cms

Приводил сегодня в порядок базу данных одного проекта на django-cms и в ходе этого процесса решил перенести накопившиеся данные в новую БД, инициализированную с нуля и с успешно прогнанными миграциями. И, т.к в документации об этом не было ни слова, пришлось искать решение, и наткнуться на пару ошибок, после которых удалось создать готовый рецепт:

  • Первым делом переносим данные из таблицы auth_user, например, средствами БД;
  • Далее делаем два файла с данными. Так нужно, чтобы избежать проблемы с ключами в таблице cms_placeholder (IntegrityError: duplicate key value violates unique constraint “cms_placeholder_pkey”), которые например описаны в рассылке django-cms:

    ./manage.py dumpdata --indent=2 cms.placeholder > initial_data.cms.01.json

    ./manage.py dumpdata --indent=2 cms.cmsplugin cms.page cms.pagemoderatorstate cms.pageuser \
    cms.title picture snippet text (сюда-же впишем и остальные плагины) > initial_data.cms.02.json

  • И теперь загружаем полученные данные в новую БД:

    ./manage.py loaddata initial_data.cms.01.json
    ./manage.py loaddata initial_data.cms.02.json

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

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

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

BCM4313 в Ubuntu 11.10

Вышла свежая Ubuntu Oneiric Ocelot и с ней появилась новая проблема с WiFi на моём Lenovo U165. Помимо того, что нужно было сделать для Ubuntu 11.04, теперь стоит поступить следующим образом:

  1. Снести, если установлены, драйвера broadcom-sta-common и файл /etc/modprobe.d/broadcom-sta-common.conf;
  2. Добавить в /etc/modprobe.d/blacklist.conf строку:

    blacklist bcma

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

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

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

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

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

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

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

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

Wi-Fi в Ubuntu 11.04

После установки свежей Ubuntu 11.04 (Natty Narwhal) на свой Ideapad U165 обнаружил, что Wi-Fi теперь не включается, даже если включить галочку «Беспроводные соединения» в Network Manager. Полдня было убито на копание в форумах, чтобы вытащить работающий рецепт для устройств broadcom с идентификатором 14e4:4727 (BCM4313): достаточно запретить модуль acer-wmi


modprobe -r acer-wmi

И после этого включить его в /etc/modprobe.d/blacklist.conf, чтобы этот поганец не мешался после перезагрузки.

об incrontab замолвите слово

Сегодня озадачился тем, как сделать так, чтобы при обновлении данных об остатках товаров (которые хранятся в 1С и выгружаются в виде .csv файла), происходило автоматическое обновление данных в Satchmo. Сам скрипт для чтения остатков из csv довольно простой, и на днях выложу его на github, хотя уверен, что подобное ищется в интернете легко и быстро. А вот проблему с тем, как угадать с моментом запуска, раньше решали просто — независимо от состояния файла, данные из него импортировались раз в 15 минут. Теперь же нашёл весьма изящное решение — incrontab, демон, работающий аналогично cron, но срабатывающий по событиям, связанным с созданием/удалением/изменением файлов и их атрибутов. Удобно и просто 🙂

django-cms, mptt и get_ancestors

Почему-то поисковики плохо выводят на решение проблемы с django-cms, когда, скажем, после обновления, попытка выполнить любую команду через manage.py приводит к ошибке:

File "/usr/local/lib/python2.6/dist-packages/publisher/mptt_support.py", line 142, in install_mptt 
    attrs[method_name] = getattr(mptt_models, method_name) 
AttributeError: 'module' object has no attribute 'get_ancestors'

Решение на самом деле простое: в django-cms есть уже встроенный модуль mptt. Но, если ставить через pip, то он устанавливает django-mptt, который естественно оказывается приоритетнее и несовместимым. Выход один: удалять django-mptt сразу после установки. Ну и использовать virtualenv, если есть необходимость в свежей версии django-mptt.

Дополнение: в django-cms версии 2.2 обещают прекратить эту порочную практику и нормально работать с django-mptt. Так-что ждём 🙂