Блог Ильи Барышева

О веб-разработке и не только…

Coveralls for python

There is one awesome service to show off the test coverage of your project: Coveralls. Besides it's cool name, it has a lot of advantages to offer for opensource developer: visualisation of repo coverage, history of your stats, individual file coverage reports.

Coveralls promo

The killer feature is definitely Github and Travis CI integration. Simply log in with your github account, choose repos to track coverage, add 2 lines to your Travis CI config and you're all set.

It even checks coverage for your pull requests and provides nice badges to embed in your docs: Coverage Status

Show me the code

Ruby/rails are officially supported, everyobdy else can use json API. So I've written a very simple python library to use coveralls in my projects:

pip install coveralls

After running tests with coverage, simply run coveralls console command and that's it.

coverage run your_test_suite_runner.py
coveralls

If you're not using Travis CI you need a bit of extra configuration, explained in the docs. I've been using coveralls myself for some time and it's great.

It makes custom report for data generated by coverage.py package and sends it to json API of coveralls.io service. All python files in your coverage analysis are posted to this service along with coverage stats, so please make sure you're not ruining your own security! For private projects there is Coveralls Pro.

Conclusion

Did I mention that service is completely free for opensource repos and offers plans for private ones?

I'm not an author of the service, I simply like the idea of sharing coverage stats for OSS projects and the implementation of coveralls.io by LemurHeavy. Thank you, guys!

Комментарии

Про то как я Moscowdjango на Python 3 портировал

В январе удалось вновь выступить на Moscow Django. Доклад про новинки пока ещё не вышедшего Django 1.5 оказался намного динамичней и бодрей прошлогоднего дебюта про 1.4. По ссылкам можно в этом убедиться воочию.

Как ни странно, в этот раз важных фич совсем немного, а ведь в прошлый раз их хватило, чтобы написать целый цикл из 8 статей в блоге Future Colors. В сухом остатке настраиваемая модель пользователя и небольшие улучшения в ORM и шаблонах. Про всё это уже многие написали. Даже про минорные, но от того не менее приятные новинки. Но самое главное, это, конечно же, поддежка python 3.2+.

Всё плохо?

После доклада Павла Зиновкина про то, как они пробовали перевести на python 3 один из своих проектов, у меня сложилось какое-то пессимистическое впечателние. Вывод был примерно таков: «Ситуация с библиотеками не позволяет использовать Python 3», а иными словами, пока не готово для продакшена. Не удалось завести django-celery под py3k, а стало быть запускать даже в стейджинг такое нельзя. Но ведь это не повод отчаиваться :) Возникло желание продемонстрировать, что некоторые проекты уже сейчас можно перевести на трёшку. Кандидата не пришлось долго искать: сайт Moscow Django для этого отлично подошёл.

Портируем на счёт три

Если кода немного, то портирование на python 3 обычно более-менее тривиально. Особенно помогает понимание того, что изменилось. А более всего осознание разницы между юникодом и строками. В своём выступлении я рекомендовал книжку Porting to Python 3 и библиотку six, которая де-факто стала стандартом разработки софта сразу под 2.x и 3.x. Этот подход избрали авторы множества известных мне библиотек, и не напрасно. Я считаю, что это намного проще в поддержке, чем 2to3 и уж точно удобней, чем писать свои слои абстракции для совместимости.

Для начала надо было решить, как завести свеженький питон на Хероку, где хостится MoscowDjango. К счастью, до того, как я погрузился в особенности устройства местных билдпаков, Kenneth Reitz анонсировал официальную поддержку всех актуальных версий питона на Хероку. Оставалось адаптировать код сайта и все зависимости.

Поскольку код сайта достаточно компактен, большую часть времени заняли чужие библиотеки. Из 21 пакета лишь 7 уже могли запускаться под py3k, ещё для 6 нашлись рабочие форки, а ещё 3 я спортировал сам. Стоит отметить, что пакеты без тестов или хорошего покрытия портировать на python 3 крайне тяжело, а иногда даже невозможно. Это ещё один достаточно весомый довод в пользу написания тестов для вашего проекта.

Ложка дёгтя

Больше всего проблем доставила django-storages, с помощью которой осуществляется заливка медиа-файлов на амазоновский s3. Выкинуть её полностью или заменить аналогом не получилось, а по-честному спортировать в короткий срок нереально из-за зависимости на внушительный boto, до сих пор возглавляющий python 3 wall of shame. Пришлось вытащить на свет deprecated версию python API от амазона бородатого года под python 2.4 и кое-как приспособить для своих нужд.

К сожалению, перевести все-все зависимости на новую версию языка не удалось из-за временных ограничений (хотел успеть к докладу). За бортом прогресса плещутся любимые django-debug-toolbar и django-admin-sso, ожидая своей очереди. Но и без них сайт прекрасно работает, а никто и не заметил, что они были.

Выводы

Итого, меньше, чем за месяц (в свободное время) получилось запустить в продакшене небольшой сайт на Django 1.5c1. Конечно, это никакое не достижение, просто иллюстрация тенденции: того, что авторы библиотек всё больше с каждым годом смотрят в сторону третей версии языка. И скоро наступит момент, когда вопрос, стартовать ли новый проект на python 3 перестанет быть лишь уделом энтузиастов.

Уже сейчас каждый, кто нашёл для себя что-то интересное в python 3, может начать помогать сообществу портировать библиотеки. Вот такой вывод я хотел бы видеть в докладе.

Комментарии

Про презентации

На Moscow Django Meetup 6 рассказал про свои взгляды на тестирование и поделился несколькими нехитрыми советами и инструментами. Всем неравнодушным к совершенствованию качества кода рекомендую. А в особенности пишущим на python и Django, но надеюсь и остальным понравится.

Пока что доступны слайды, но вскоре и видео подоспеет:

Опыт докладчика

За этот год я выступил уже 3 раза на Moscow Django: в феврале рассказал про новинки Django 1.4, в июле про Continuous Integration. Мотивация делать доклады такая же что и писать в блог: выкристаллизовать свои собственные знания в первую очередь. Чтобы объяснить что-то другим людям, надо самому это прекрасно понимать и разбираться. Советую попробовать, вам тоже может понравиться. Ну и приятные побочные эффекты никто не отменял.

Советы самому себе полгода назад

Размер шрифта как можно больше, переборщить не получится.
Не нужно много текста, только самая суть: остальное можно рассказать.
Списки должны появляться по пунктам, а не сразу.
А лучше всего сделать по слайду на каждый пункт.
Слайдов не может быть слишком много, нельзя экономить на слайдах.
Научись пользоваться кликером, а лучше ещё и лазрной указкой, если на слайде код.
Раскрашивай код на слайдах, если кода много. Но лучше меньше кода!
Код на слайдах должен быть моноширинным, легочитаемым шрифтом.
Присылай слайды организаторам заранее, лучше ещё и бэкап в формате PDF.
Пиши комментарии докладчика и пользуйся ими во время рассказа.

Не буду утверждать, что все советы я сам смог выполнить, но я на пути к этому.

P.S. Совет тем, кто не знает чем подсвечивать код в презентациях: я пользуюсь хорошей библиотекой highligh.js и копирую html код прямо на слайд Keynote. Для этого я сделал небольшой плейграунд на jsfiddle. Может быть и вам он пригодится.

Комментарии

Опенсорс на английском

Проекты с открытым исходным кодом должны быть на английском. Без исключений: документация, комментарии в коде, багтрекер в опенсорс-мире should be in English. При желании можно делать переводы доков на разные языки, но обычно их качество и актуальность оставляют желать лучшего. Основной мотив не делать проект исключительно на русском/немецком/испанском и т.п. это возможность привлечения как можно более широкой аудитории. Это касаестя как userbase девелоперов (им важна англоязычная документация и поддержка), так и коллег-контрибуторов (им также пригодятся понятные без словаря комментарии в коде и тексты коммитов).

Не замыкайтесь на русскоязычную аудиторию, она не составляет и десятой доли пользователей интернета (гитхаба). Даже если ваш проект пока что целиком ориентирован на локальный сегмент, вам вовсе не обязательно заранее ограничивать себя, ведь подавляющее большинство разработчиков знают английский язык и умеют на нём хотя бы читать.

На написание поста сподвиг вот этот твит, и некоторые обсуждения в нашей команде. Поначалу делать проект для русскоязычной аудитории с сорцами и коммитами на английском может показаться оверкиллом, но со временем это обязательно принесёт свою пользу.

Комментарии

Новый движок блога

Пришла пора отказаться от вордпресса в пользу легко настраиваемого Pelican.

Вы наверняка слышали про "статические" блоги, которые рендерятся из Markdown-разметки, самый популярный, конечно же, Octopress на основе Jekyll. Отличная платформа, с прекрасной стандартной темой, но, к сожалению, на Ruby. Решил не полениться и перенёс свой бложек на похожий движок, но на питоне. Так привычней и проще настраивать под себя, да и геморроя с rvm нет. Зато налицо полное отсутсвтие хоть сколько-нибудь приятных стандартных шаблонов, все они ужасны чуть менее чем полностью.

Писать статьи прямо .md или .rst привычно и удобно для программистов и прочих гиков, авось и новые статьи начнут появляться тут.

Комментарии

Твиты Future Colors, 3 неделя сентября

Мы ежедневно делимся в твитере @futurecolors полезными ссылками, новостями вебразработки, еженедельно — фотками с работы. Раз в неделю-две я буду собирать всё это в один пост, чтобы это легко было найти потом. Хронология специально нарушена, это не так важно. Кое-где мои комментарии к твитам.

Django

Иван Сагалаев в своём блоге делится впечатлениями о прошедешем DjangoCon US.

Опубликованы видеозаписи с DjangoCon US 2011 Всем смотреть!

Целых 40 записей, 16 гигабайт видео, часов ещё больше. Смотрите описания выступлений и изучайте, это очень интересно.

А вы уже обновили django до 1.3.1 и 1.2.7 соответственно?

Благодаря django-fab-deploy, обновить фреймворк не составило особого труда.

Хорошая заметка о различиях между Django ORM и SQLAlchemy. Ещё холивор с похожей темой

Как помочь улучшить документацию django (две заметки из блога девушки с татуировкой пони). Вторая

Подменяем /admin/ фальшивой авторизацией и следим за "хакерами"

Наконец-то начались какие-топопытки портировать Django на python3

Ветка теперь доступна и на гитхабе

На новых проектах будем использовать django-jenkins и django-any. Очень полезные штуки.

Используем ежедневно. не без недостатков, но очень правильные идеи.

JetBrains радуют новыми фичами и апдейтами старых. Пост из блога pycharm про дебаг шаблонов джанги в их IDE

HTML и Javascript

Какие фичи html5 поддерживают мобильные браузеры. Полезная табличка

Утилита для вырезания из js-библиотек неспользуемого вами кода. Насколько хорошо она почикает jquery?

CoffeeScript (и django)

Весёлая презентация CoffeeScript: JavaScript without the Fail

Думаете только поклонники руби уважают CoffeeScript? Всовсе нет, например: django-coffeescript

Впрочем, необязательно ставить дополнительный пакет, достаточно нашего любимого django-compressor (django + coffeescript)

Всерьёз задумались о внедрении кофескрипта как замены js на будущих проектах.

Разработка

Команда git bisect выручает при борьбе с нетривиальными регрессиями. Очень полезно

Познавательно про разработку в СКБ Контур

Проектирование моделей (тех самых, которые являются частью
  MVC). На фото - Илья Барышев

Комментарии

Боремся с Clickjacking

Что такое clickjacking

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

Как это работает

Атакуемый сайт оборачивается в прозрачный ифрейм. Поверх него располагают какую-нибудь привлекательную ссылку, на которую захочет кликнуть «жертва» (при атаке на твитер в 2009 такой приманкой стала кнопка c текстом «Don't click»). Теперь вместо клика на неё будет происходить клик в ифрейме (так как он находится поверх кнопки).

Демонстрация кликджекинга

(абсолютно безвредно) Замечу, что защита от clickjacking совершенно иная, чем от CSRF, хотя цели злоумышленников в обоих атаках - заставить пользователя совершить запрос к сайту под своими правами.

Защищаемся через javascript

Самый простой способ - сделать редирект с помощью js, если сайт открыт в ифрейме (пример):

if(top != self) {
  top.location = self.location;
}

К сожалению, это код неуниверсален, существуют несколько способов его обхода разной степени изощрённости и применимости в браузерах. Подробнее можно почитать в исследовании Busting Frame Busting: a Study of Clickjacking Vulnerabilities on Popular Sites.

Защищаемся через заголовки

В дополнение к предыдущему методу, разработчики браузеров ввели новый заголовок ответа сервера X-Frame-Options. Он позволяет не отображать сайт, если он загружается c другого домена через ифрейм. Пример настроек для Apache и nginx:

Header always append X-Frame-Options SAMEORIGIN

add_header X-Frame-Options SAMEORIGIN;

Работает в IE 8.0+, FF 3.6.9+, Opera 10.50+, Safari 4.0+ и Chrome 4.1+, на момент написания поста по рунету это более 70% пользователей.

В новой версии Django 1.4 для добавления этого заголовка есть настраиваемый XFrameOptionsMiddleware.

Подробно про Clickjacking на сайте Open Web Application Security Project.

Комментарии

HttpOnly куки и с чем их едят

HttpOnly cookie — это такие куки, которые невозможно прочитать с помощью javascript, но доступные серверным скриптам, как и любые другие. Несмотря на то, что это совсем не новая технология (HttpOnly cookie появились 8 лет назад в IE6 SP1), далеко не все знают, почему их обязательно стоит использовать.

Зачем это нужно

Куки, недоступные из джаваскипта, помогут защитить от XSS-атак, как второй рубеж обороны от злоумышленников. Прокравшийся на страницу вредоносный код не сможет утащить пользовательские куки с помощью document.cookie.

Где это работает

Основная мысль: это работает во всех популярных и современных браузерах (IE6+, Firefox 2.0+, Chrome 1.0+, Opera 9.5+, Safari 4.0+) Подробнее можно ознакомиться на сайте browserscope (раздел Security).

HttpOnly cookie легко установить в php, django. Чтобы установить куки собственноручно через передачу заголовка ответа, достаточко добавить параметр ; HttpOnly

Set-Cookie: =[; =]
[; expires=][; domain=]
[; path=][; secure][; HttpOnly]

Демо

Подробно про HttpOnly cookie на сайте Open Web Application Security Project

Комментарии

VPC-EC3S1R и Убунта 10.10

Взамен старого ноута приобрёл новый VAIO серии E. Машинка отличная, а пока пара советов для убунтоводов, обзаведшихся ноутом сони, почерпнутых в одном из блогов.

Sony VAIO VPC-EC3S1R

Под свежеустановленным Мавериком (10.10) почти всё завелось "из коробки": видео, аудио, вебкамера, но не обошлось и без досадных недоразумений в виде нерабочего тачпада и кнопок управления яркости.

Убунта и яркость экрана

Сидеть за дисплеем со 100-процентной яркостью совершенно невозможно, поэтому, пока не отказали глаза срочно понижаем её в меню "Система → Параметры → Управления питанием". Данный трюк не проходит, если питание от сети отсутствует, поэтому надо оживить кнопки Fn+F5 и Fn+F6, отвечающие за яркость.

1) Правим файл /etc/acpi/events/sony-brightness-down, который будет выполняться при нажатии Fn+F5.

# /etc/acpi/events/sony-brightness-down
event=sony/hotkey SNC 00000001 00000010
action=/etc/acpi/brightdown.sh

Код клавиши может отличаться для других моделей ноутбуков Сони (можно определить с помощью команды acpi_listen)

2) Правим скрипт /etc/acpi/brightdown.sh, который понижает яркость

#!/bin/bash
curr=`cat /sys/class/backlight/acpi_video0/actual_brightness`
if [ $curr -gt 0 ]; then
curr=$((curr-1));
echo $curr  > /sys/class/backlight/acpi_video0/brightness;
fi

Главное, не забыть про права на исполнение.

3) Аналогично редактируем файл /etc/acpi/events/sony-brightness-up

# /etc/acpi/events/sony-brightness-up
event=sony/hotkey SNC 00000001 00000011
action=/etc/acpi/brightup.sh

4) А вот скрипт повышения яркости для файла /etc/acpi/brightup.sh

#!/bin/bash
curr=`cat /sys/class/backlight/acpi_video0/actual_brightness`
if [ $curr -lt 8 ]; then
curr=$((curr+1));
echo $curr  > /sys/class/backlight/acpi_video0/brightness;
fi

Убунта и тачпад

Тачпад особенно не нужен на 17-дюймовом ноуте, который заменяет десктоп, но для порядка надо оживить и его. Нужно отредактировать /etc/default/grub, добавив следующую строчку

GRUB_CMDLINE_LINUX=i8042.noloop i8042.nomux i8042.reset i8042.nopnp splash"

После этого надо пересоздать grub.conf

sudo update-grub

После этого перезагружаемся и тачпад работает. Удачной работы.

Комментарии

День рождения API Яндекс.Карт

В пятницу команда Яндекс.Карт вместе с активистами клуба отмечали двухлетие API и предоставили возможность рассказать про наш скромный проект «Банкоматор». Послушали любопытное выступление Кащея про то, как работает продвинутая кластеризация, как сильно ускорить вывод объектов на карте и без хотспотов. А также немного статистики о том, как растёт и становится лучше API карт. Очень здорово, что поддержка в клубе такая оперативная и полная. А вот фото и видео со встречи.

Народу было немного, познакомились с командой, кого не видели на прошлогоднем семинаре. Встреча закончилась вкусным тортом и небольшой экскурсию по офису. Спасибо!

Фото на память

Комментарии