Each time I need to package some software as .deb, I am not able to do it in one go. Because it is always a quite complex procedure that requires quite a lot of knowledge and context and you have to learn a lot of tools (million of debhelper tools, dpkg, debuild etc). It is designed to be comfortable for “large-scale” debian package maintainers who maintain a lot of packages for the Debian project, but is not very friendly for “indie” developers working on their own projects. And the process may vary a lot depending on what kind of software you need to package (what language, is it a library or shell tool or GUI etc). Also it strictly recommends that debian packaging files are stored separately from the software repo which might be somewhat inconvenient for small projects. We are going to include the debian
directory into the project.
Author Archives: P.S.
How to pair INA226 current and voltage sensor and Raspberry Pi using ina2xx kernel driver
INA226 is a popular microchip to measure the voltage and power consumption that uses i2c digital interface. There are a lot of articles describing how to make it work with Arduino, much fewer about how it can be connected and read using generic Linux i2c tools and seems to be none explaining how can it be paired with Linux ina2xx kernel driver so it can be manipulated via hwmon subsystem. Let’s fix ths!
Continue readingКак правильно распарсить access лог Nginx/Apache
Наверняка у многих возникает такая задача – извлечь какие-то данные из Access лога Apache или Nginx. Записи лога обычно выглядят как то так:
91.77.238.152 - - [02/Dec/2013:20:31:45 +0400] "GET /blog/2012/01/31/plagin-l2tp-dlya-networkmanager/ HTTP/1.1" 200 70666 "http://yandex.ru/clck/jsredir?text=%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%20l2tp%20%D0%B4%D0%BB%D1%8F%20networkmanager&uuid=..." "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.16) Gecko/20111108 Iceweasel/3.5.16 (like Firefox/3.5.16)"
На первый взгляд кажется, что форматирование этой строки какое-то нелогичное и ничем не оправданное: где то значения заключены в кавычки, где-то в квадратные скобки, где то значение записано как есть. Из за этого кто-то пытается сконструировать огромную нечитаемую регулярку, которую приходится каждый раз писать заново, из за того, что через неделю понять что же она делает нереально. Кто то разбивает строку по пробелам и надеется на лучшее, при этом поле даты разрезается на 2 части а User-Agent
превращается вообще в необрабатываемое месиво.
Мы же поступим иначе – попробуем найти систему в структуре этой строки и напишем полноценный лексический анализатор. Continue reading
[ПЕРЕВОД] Коллбеки императивны, обещания функциональны: крупнейшее упущение NodeJS.
Перевод статьи James Coglan Callbacks are imperative, promises are functional: Node’s biggest missed opportunity
“Главная особенность обещаний в том, что они невосприимчивы к изменяющимся обстоятельствам”
Франк Андервуд, “Карточный домик”
Возможно, вы часто слышите, что JavaScript это “функциональный” язык программирования. Его так называют просто потому, что функции в нём – объекты первого рода: многие другие особенности, присущие функциональным языкам, такие как неизменяемые данные, предпочтение циклам рекурсии, алгебраические системы типов, избежание побочных эффектов – полностью отсутствуют. И, хотя функции высшего порядка, безусловно, полезны и позволяют программирвать в функциональном стиле, но представление, что JS это функциональный язык, зачастую затмевает основной аспект функционального программирования – программирование со значениями.
Continue readingБенчмарк HTML парсеров
Переписывал на работе кусок одного сервиса с Python на Erlang. Сам сервис занимается тем, что скачивает по HTTP значительное количество однотипных HTML страниц и извлекает из них некоторую информацию. Основная CPU нагрузка сервиса приходится на парсинг HTML в DOM дерево.
Сперва захотелось сравнить производительность Erlang парсера mochiweb_html с используемым из Python lxml.etree.HTML(). Провел простейший бенчмарк, нужные выводы сделал, а потом подумал что неплохо было бы добавить в бенчмарк ещё парочку-другую парсеров и платформ, оформить покрасивее, опубликовать код и написать статью.
На данный момент успел написать бенчмарки на Erlang, Python, PyPy, NodeJS и С в следующих комбинациях:
- Erlang – mochiweb_html
- CPython – lxml.etree.HTML
- CPython – BeautifulSoup 3
- CPython – BeautifulSoup 4
- CPython – html5lib
- PyPy – BeautifulSoup 3
- PyPy – BeautifulSoup 4
- PyPy – html5lib
- Node.JS – cheerio
- Node.JS – htmlparser
- Node.JS – jsdom
- C – libxml2 (скорее для справки)
В тесте сравниваются скорость обработки N итераций парсера и пиковое потребление памяти.
Интрига: кто быстрее – Python или PyPy? Как сказывается иммутабельность Erlang на скорости парсинга и потреблении памяти? Насколько быстра V8 NodeJS? И как на всё это смотрит код на чистом C. Continue reading
Как удалить миллионы файлов из одной папки
Очередной пост-ответ на статью на хабре. Прочитал статью Необычное переполнение жесткого диска или как удалить миллионы файлов из одной папки и очень удивился. Неужели в стандартном инструментарии Linux нет простых средств для работы с переполненными директориями и необходимо прибегать к столь низкоуровневым способам, как вызов getdents()
напрямую.
Для тех, кто не в курсе проблемы, краткое описание: если вы случайно создали в одной директории огромное количество файлов без иерархии – т.е. от 5 млн файлов, лежащих в одной единственной директории, то быстро удалить их не получится. Кроме того, не все утилиты в linux могут это сделать в принципе – либо будут сильно нагружать процессор/HDD, либо займут очень много памяти.
Так что я выделил время, организовал тестовый полигон и попробовал различные средства, как предложенные в комментариях, так и найденные в различных статьях и свои собственные.
Своего рода, расстановка точек над i в вопросе удаления файлов из переполненной директории. Continue reading
Самая короткая запись асинхронных вызовов в tornado v2, или патчим Python AST
Меня очень заинтересовала статья Самая короткая запись асинхронных вызовов в tornado или патчим байткод в декораторе, не столько с практической точки зрения, сколько с точки зрения реализации.
Всё-таки модификация байткода в рантайме это слишком опасная и ненадежная операция. И уж наверняка не поддерживаемая альтернативными интерпретаторами Python.
Попробуем исправить этот недостаток способом, который для этого куда больше предназначен и который применяется для схожих целей во многих других языках (я точно встречал в Lisp и Erlang). Этот способ – модификация Абстрактного синтаксического дерева (AST) программы.
Continue reading
Раздача больших файлов через сервер TornadoWEB
TornadoWeb – это легковесный веб-сервер, написанный на Python и использующий неблокирующие сокеты и epool/kqueue для работы с сетью. Сам по себе сервер неплохой, довольно популярный. Привлекает своим крайне простым API (по сравнению с тем-же Twisted) и высокой производительностью.
Первый вопрос, который может возникнуть – “зачем раздавать большие файлы через Tornado?” Ведь даже официальная документация рекомендует использовать для этого Nginx. Что-ж, в большинстве случаев так и есть. Но ситуации могут быть разные. В моём случае через Tornado успешно раздавалось большое количество мелких страничек, хранящихся в SQLite и один большой файл на 200МБ со списком всех доступных URL. Поднимать ради одного этого файла Nginx совершенно не хотелось.
Второй вопрос – “ну так в чем проблема – раздавай на здоровье!”. Вот тут мы и сталкиваемся с неприятной особенностью этого сервера – стандартный StaticFileHandler
загружает весь файл целиком в память перед тем как отдать его клиенту (пруфлинк). Помимо этого, занятая память не освобождается, если клиент разорвал подключение не скачав весь файл целиком.
Вот эти 2 проблемы и будем решать. Continue reading
На стачку! Впечатления и обзор конференции. День 2.
Вечер прогулок по городу, ночь в гостинице и вот он – второй день конференции. Решил доклады не пропускать (не зря же 12 часов в поезде ехал!) и пошел сразу на первый доклад.
На стачку! Впечатления и обзор конференции. День 1.
Давненько не бывал на конференциях, наконец-то удалось совместить наличие хорошей конференции с возможностью на нее пойти. И так, 13 и 14-го апреля в г. Ульяновск проходила конференция “Стачка!” на которой я имел удовольствие поприсутствовать. Сразу отмечу, что несмотря на то, что конференция была бесплатной, уровень организации и качество докладов были на уровне вполне известных платных конференций. Выбрали отличное живописное место, организовали онлайн трансляцию (на сайте выложены архивы с видео докладов). Спасибо организаторам, постарались на славу!
Теперь расскажу о докладах (в общем-то краткий пересказ докладов, много букв! Если нужны подробности – смотрите видео на сайте). Continue reading
Плагин L2TP для NetworkManager
UPD: Сейчас поддержкой и разработкой плагина я не занимаюсь, т.к. перестал сам им пользоваться. Но его разработкой продолжили заниматься тут. Где взять новые DEB пакеты я не знаю, возможно их не существует вообще.
TL;DR: теперь подключаться к L2TP VPN можно через NetworkManager.
Continue readingИспользование Django ORM отдельно от Django
Понадобилось использовать Django ORM вне контекста самой Django. Конечно, проще и правильнее было бы использовать SQLAlchemy т.к. она рассчитана на такое использование, но мне нужно было написать паука, сохраняющего данные в БД и веб-интерфейс к этим данным. Веб-интерфейс точно решил делать на Django, а в пауке использовать те-же самые модели, чтобы не проделывать одну и ту же работу дважды. Т.к. паук был первым этапом работ а админка – вторым, появилась необходимость создавать таблицы из моделей без использования “syncdb”.
В качестве основы использовалкод модуля django-standalone и статью Django ORM без Джанги – эта статья практически полностью решает проблему, но есть и несколько недостатков:
- Модели для создания таблиц нужно перечислять вручную
- Не создаются внешние ключи
- По – мелочи – нужно каждой модели вручную задавать app_label
Попытаемся исправить эти недостатки.
Плагин Vkontakte.ru для Gwibber
Вступление
Не так давно решил вплотную познакомиться со всей кухней OpenSource со стороны разработчика и в качестве первой пробы решил написать плагин к Gwibber для поддержки Вконтакте. Надо сказать, что тикет на Launchpad на эту тему висит с середины 2010 года (датирован 2010-05-01) с довольно длинным обсуждением, было несколько попыток реализовать поддержку, но готового решения никто не предложил. Помимо Launchpad, появился топик на форуме Ubuntu.ru, в котором топикстартер сообщил, что реализовал поддержку ВК, но код так никому и не показал.
Так что в начале декабря взялся за работу и через 2 месяца рабочая протестированная версия плагина была готова. На данный момент я уже отправил запрос о включении плагина в официальную ветку Gwibber и буквально сегодня разработчики отметили его для включения в релиз 2.91.5.
Описание функционала, инструкция для желающих протестировать плагин в работе уже сейчас под катом… Continue reading
Отчет о конференции ADD-2010 в Ярославле
Побывал 23-24 сентября на конференции Application developer days в Ярославле. Вот решил написать краткий отчет. Continue reading
Интеграция Redmine и Eclipse
Вступление
Большую часть времени разработчики проводят в двух местах – в IDE и в багтрекере/системе управления задачами (ну и, естественно, за гуглением/чтением всяких блогов, литературы etc). При этом, как правило, работая над конкретной задачей, разработчик использует весьма небольшое количество файлов проекта и возможностей IDE. Таким образом, все остальное окружение, не затронутое данной конкретной задачей, только отвлекает и сбивает с толку. Помочь решить эту проблему призван замечательный плагин для не менее замечательной IDE Eclipse под названием mylyn. Continue reading