пятница, 4 декабря 2015 г.

Motor 0.5

Мы строили-строили и наконец построили.

Motor 0.5 (асинхронный драйвер для MongoDB) доехал до релиза.

Новая версия работает с asyncio.
Всем рекомендую

четверг, 12 ноября 2015 г.

uvloop -- альтернатива стандартному asyncio loop

В последнее время Юра Селиванов (ага, тот самый автор PEP-492 aka async/await и MagicPython) работал над тем чтобы сделать asyncio побыстрее.

Он взял libuv и построил с её помощью uvloop -- asyncio совместимый event loop.

Результаты замера производительности здесь.

Получается, что uvloop в 3.5 раза быстрее стандартного и в 1.25 раза обгоняет gevent.
Т.е. абсолютный победитель по скорости в мире Python.

Библиотека пока еще не имеет стабильной версии, скоро всё будет.

вторник, 10 ноября 2015 г.

Видео с PyCon RU 2015

Я, конечно, тормоз и пишу спустя две недели -- но это лучше чем совсем промолчать.

Ссылки на доклады на ХабраХабре, там и мой есть тоже.

Если интересно -- открываем и смотрим.

P.S. Слайды -- здесь.

воскресенье, 1 ноября 2015 г.

Англицизмы в нашей речи

Навеяно вопросом Русские иностранные слова

Я часто выступаю с лекциями на конференциях.

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

Это не всегда возможно. Рабочий язык программиста всё же английский.
Лично я предпочел бы ограничится родным, которым владею свободно -- но нет.

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

Иногда устоявшегося русского термина не существует (Александр Бельченко при переводе слова commit в статьях о bazaar использовал фиксацию что технически правильно но абсолютно непонятно).

В таких случаях лучше оставлять английское слово как есть, commit но не коммит/комит (опять же вас лучше поймут, вариантов транслитерации много и часто они выглядят ужасно).

Eсли используете английские термины при вербальной коммуникации (а без этого никуда) -- произносите их правильно.
Т.е. так как оно должно звучать на английском/американском а не на ломаном руссиан пингин инглиш.

Еще один момент: делать слайды на русском или на английском?

Александр Соловьёв высказался пару лет назад.

Полностью его поддерживаю.

Если доклад будет на русском -- и слайды должны быть на этом же языке, с минимумом английских слов.

Например, лекцию по aiohttp для PyCon RU 2015 я читал на русском -- и слайды были соответствующие.
На следующей неделе буду читать ту же лекцию для PyCON Hong Kong 2015 -- и там слайды будут уже на английском по очевидной причине: я не владею китайским.

Если нужно, вовсем не трудно перевести ваши слайды на английский, да?
И наоборот -- англоязычные слайды перевести на язык, понятный аудитории.



    

воскресенье, 25 октября 2015 г.

Google group for aiohttp and aio-libs

https://groups.google.com/forum/#!forum/aio-libs

Сделал гуглогруппу для вопросов по aiohttp и aiolibs (aiopg, aiomysql, aioredis, aiozmq, aiohttp_session, aiohttp_toolbar и еще десятка библиотек).

В общем если вы стеснялись сделать issue в github -- вам сюда.

Если писали мне лично на email -- тоже. 

Язык общения -- предпочтительно английский (так больше читателей поймут и смогут ответить).
Если с основным языком программиста затык -- пишите на русском.
Только, прошу, не смешивайте -- как и водку с пивом.
Если топик англоязычный -- комментарии должны быть на неродном.

среда, 21 октября 2015 г.

Слайды с hdconf.by

ссылка

Большое спасибо организаторам hdconf.by -- конференция получилась замечательной!

Интересные докладчики и любопытные слушатели -- что может быть лучше?

MagicPython -- Syntax Highlighter для SublimeText

Мой приятель Юра Селиванов попросил написать рекламный пост о его новом проекте MagicPython.

Это syntax highlighter для Sublime Text и Atom, который поддерживает все новые языковые конструкции Python 3.5 (async def и await например) плюс type annotations, string formatting и регулярные выражения.

Sublime поддерживает Python из коробки, но с Python 3 (а особенно с Python 3.5) у него проблемы. MagicPython понимает всё.
Разметка шаблонов для форматирования строк и регулярок заслуживает отдельного упоминания -- выглядит прекрасно и заметно облегчает жизнь.

Я сам использую ортодоксальный Emacs и переходить (пока) не собираюсь, но MagicPython работает исключительно хорошо и заслуживает доброго слова.

К слову, Юра (https://twitter.com/1st1) Python Core Developer и автор PEP 492 aka async/await -- т.е. очень грамотный спец, который знает как делать качественные продукты.

Пользуйтесь с удовольствием.

P.S.

О редакторе Atom узнал только на этой неделе.
На первый взгляд выглядит как Sublime но при этом Open Source.
Уважаемые читатели, кто-нибудь его использует? Какие ваши впечатления?

среда, 13 мая 2015 г.

Почему я не люблю конфигурацию в django-style

Введение

Сегодня работал над добавлением в aiohttp.web свойства scheme для request object.

Идея простая: отвечать что request.scheme "http" для HTTP запросов, иначе "https".

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

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

Так вышло что сегодня я смотрел код Django.

И было в том коде примерно такое:

@property
def scheme(self):
    if settings.SECURE_PROXY_SSL_HEADER:
        try:
            header, value = settings.SECURE_PROXY_SSL_HEADER
        except ValueError:
            raise ImproperlyConfigured(
                'The SECURE_PROXY_SSL_HEADER setting must be a tuple containing two values.'
            )
        if self.META.get(header, None) == value:
            return 'https'
    return 'http'

В целом очень хорошо: Django показала, как работать с HTTP и что делать если сервер расположен за HTTPS Reverse Proxy (Nginx, например).

В последнем случае я сконфигурирую Nginx чтобы он добавил несколько полезных HTTP HEADERS для HTTPS connection:

  proxy_set_header        Host $host;
  proxy_set_header        X-Real-IP $remote_addr;
  proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header        X-Forwarded-Proto $scheme;

По X-Forwarded-Proto я пойму что это был HTTPS.

В целом стандартная и всем (надеюсь) известная процедура.

У aiohttp свободы чуть больше: оно может понять что сокет, по которому подключились напрямую, сам уже SSL -- но это пригодно только если мы готовы выставить наш aiohttp сервер прямо в веб.

Куда чаще его прячут за Nginx, HAProxy или похожим reverse proxy и там уже работают с сертификататами, проксируя обычный HTTP connection.

В общем всё прекрасно: Nginx выставит X-Forwarded-Proto HTTP HEADER который будет или "http" или "https".

Django глянет на settings.SECURE_PROXY_SSL_HEADER и если там ("X-Forwarded-Proto", "https") то scheme тоже будет "https".

Очень грамотно сделано, мне нравится.

Проблема

Так почему я этот пост написал?

А потому что settings.SECURE_PROXY_SSL_HEADER может быть чем угодно -- строкой, числом или ещё какой непотребной константой.

Проверка выполняется на момент получения request.scheme.

Нам, питонщикам, плевать на производительность в данном случае -- на самом деле try/except обходится дешево и никак не отразится на работе сайта.

Беда в другом -- ошибка неправильной конфигурации выявится не на этапе старта приложения а тогда, когда его выкатят в production.

У тестов будет свой правильный settings.py, а на production server админ чуть-чуть ошибётся.

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

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

Решение

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

Для начала нужно отказаться от использования общего конфига в API.

Строить код библиотеки так, чтобы она никогда не лезла в settings.py (это и Flask касается если что).

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

Тогда можно быстро понять, что формат параметра не тот или IP address недоступен.

Разделение на этапы:

  • чтение конфига, анализ его и подготовка приложения к работе
  • запуск и работа

помогает избежать досадных недоразумений.

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

вторник, 24 марта 2015 г.

Подкаст

Неделю назад принимал участие в записи подкаста о Питоне вообще и asyncio в частности.
Прослушать результат нечеловеческих усилий можно здесь.

суббота, 14 февраля 2015 г.

vagga

Паша Коломиец работает над проектом vagga.

Коротко говоря, это система виртуализации на linux контейнерах, предназначенная для разработки программ.

Выполняет роль, в чем-то похожую на virtualenv, но со своими отличиями и особенностями.

Рекомендую прочесть свежую Пашину статью, в которой он даёт обзор возможностей vagga и показывает преимущества над virtualenv.

P.S. Я лично к проекту никакого отношения не имею, поэтому все вопросы, пожалуйста, задавайте сразу Паше.


пятница, 16 января 2015 г.

aiohttp 0.14

Выпустил новую версию библиотеки.

Из вкусного -- Web Sockets для aiohttp.web серверов, оптимизация скорости работы, множество мелких улучшений.

Полный список изменений -- здесь.