Django и TEMPLATE_CONTEXT_PROCESSORS

Начиная с Django 1.3, переменная TEMPLATE_CONTEXT_PROCESSORS отсутствует в модуле settings. Чтобы добавить свои контекстные процессоры к существующим по-умолчанию — пишем:


from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
...
TEMPLATE_CONTEXT_PROCESSORS += (
    ...
)

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

robots.txt и class-based generic views в Django

В свое время мне, как не очень искушенному разработчику на Django, было совсем не очевидно как обеспечить отдачу статичного текстового файла. Примером такого файла может быть robots.txt или файлы верификации, часто требующиеся для подтверждения владения сайтом на разнообразных сервисах. При этом, мне бы хотелось, чтобы файл лежал на диске в директории с шаблонами и механизм его отдачи не требовал большого количества кода. Решение было найдено на просторах сети и заключалось в использовании обобщенных представлений (Generic Views) Django. Абстрагируя общеупотребительные идиомы и шаблоны проектирования, обобщенные представления позволяют быстро создавать типичные представления данных с минимумом кода.

Конкретно в данном случае нам может помочь direct_to_template. Для этого в urls.py в соответствующие места добавляем:

...
from django.views.generic.simple import direct_to_template
...
url(
    r'^robots\.txt$',
    render,
    {'template': 'robots.txt','mimetype': 'text/plain'}
),
...

Но с версии 1.3 разработчики Django решили перейти от обобщенных представлений на основе функций (function-based generic views) к обобщенным представлениям на основе классов (class-based generic views). Так что теперь вместо direct_to_template следует использовать TemplateView.as_view(). Но тут возникает небольшая проблема — обобщенные представления на основе классов не поддерживают параметр mimetype. Разработчики сами предлагают решение — отнаследоваться от TemplateView и переопределить метод render_to_response:

...
from django.views.generic.base import TemplateView

class PlainTextTemplateView(TemplateView):
    def render_to_response(self, context, **kwargs):
        return super(PlainTextTemplateView, self).render_to_response(
            context,
            content_type='text/plain',
            **kwargs
        )
...
url(
    r'^robots\.txt$',
    PlainTextTemplateView.as_view(template_name='robots.txt')
),
...

Английский интерфейс в Netbeans 7.1 под Ubuntu

Отличная IDE NetBeans имеет неприятную особенность: интерфейс среды выбирается исходя из системной локали независимо от выбора языка дистрибутива. При этом возможности сменить интерфейс в настройках IDE нет.

Задать локаль можно в конфигурационном файле. В общем случае это path_to_netbeans_folder/etc/netbeans.conf. В моем случае для Ubuntu это /usr/local/netbeans-7.1/etc/netbeans.conf.
В этом файле есть параметр netbeans_default_options в конец его надо добавить конфигураторы -J-Duser.language=en -J-Duser.region=US.

До редактирования:
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.zip.disableMemoryMapping=true"

После редактирования:
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.zip.disableMemoryMapping=true -J-Duser.language=en -J-Duser.region=US"

Тонкости создания анимации в jQuery

На днях коллега попросил помочь разобраться с небольшой проблемой, с которой он столкнулся при разработке анимационного эффекта на jQuery. Честно говоря, я и сам с ней неоднократно сталкивался, но мне всегда удавалось уклониться от ее решения, используя иные средства.

А суть вот в чем: если навешивать на некое событие анимационные эффекты типа slideDown/slideUp или fadeIn/fadeOut, то отработки анимации последовательно выстраиваются в очередь и выполняются пока очередь не закончится. При этом, если событие происходит с большой частотой, так что анимация не успевает отработать, можно получить нежелательные артефакты в виде долгого дерганья и мигания для slide* и fade* функций соответственно.
Пример 1: http://jsfiddle.net/hrF9k/. Попробуйте быстро поводить мышью над серым квадратом.

Чтобы прервать исполнение очереди вызовов анимации, можно использовать функцию stop(). Но тут возникает неприятный эффект, про который я так и не понял баг это или фича. Значение CSS свойств в момент вызова stop() запоминаются и в последствии используются как максимальные.
Пример 2: http://jsfiddle.net/zGc4w/.

Раньше это ставило меня в тупик, и мне приходилось искать обходные пути реализации задачи. А секрет оказался прост: функция stop() принимает два логических параметра, отвечающих за очистку очереди и переход к предельному значению анимации соответственно.
Пример 3: http://jsfiddle.net/SRAsT/3/

Обновление PyCharm и значки запуска в Ubuntu Unity

В PyCharm на данный момент не реализовано автоматическое обновление. Обновится IDE предлагает, просто скачав очередную версию с сайта разработчиков.
Если при обновлении PyCharm захотелось распаковать дистрибутив в директорию не соответствующую текущей директории установки, то обновить значок запуска Unity можно, отредактировав файл ~/.local/share/applications/jetbrains-pycharm.desktop.
Выходу PyCharm 2.0.2 посвящается.

Событие change элемента select в Jquery

На часах 5 утра. Только что потерял около часа на такой вот хитрушке в Jquery. Есть на странице элемент select, и написал я к нему обработчик события change. И все отлично работало, но понадобилось мне устанавливать значение select-а после загрузки страницы.
То есть что-то типа:


$(function(){
    $('#select_id').val('foo');
});

Да вот незадача — не происходит чендж после этого и все тут.
Решение простое:


$(function(){
    $('#select_id').val('foo').change();
});

Т.е. после смены значения элемента, необходимо вызвать событие change вручную.

А теперь спать.

Я.Субботник в Санкт-Петербурге, 3 декабря

Я.Субботник в Санкт-Петербурге пройдет 3 декабря в офисе Яндекса.

Регистрация на мероприятие начнется 23 ноября. Количество мест ограничено.

Для тех, кто не попадёт в число участников или не сможет лично присутствовать на Я.Субботнике, будет организована онлайн-трансляция.

Подробную информацию о мероприятии читайте здесь.

Список публичных API

После прочтения этой чудесной книги, у меня возникло естественное желание и самому сотворить что-нибудь эдакое на базе большого публичного массива данных. И вот что выяснилось: если в западном сегменте сети полно сервисов, предоставляющих открытые API к своим базам, то в рунете ощущается их явный недостаток. Да и  выискивать в поисковиках ссылки на страницы документации API — дело довольно муторное. Поэтому я решил собрать в одном месте ссылки на самые интересные API рунета и мира. Читать далее Список публичных API

Безопасность PHP приложений

Периодически читая разнообразные книги, статьи и мануалы по разработке на PHP, я мечтал встретить краткий сводный список моментов, на которые стоит обратить внимание при разработке и эксплуатации PHP приложений. И вот этот счастливый день наступил, и я наткнулся на шпаргалку неизвестного мне иностранного камрада SK89Q. Далее следует перевод статьи больше для себя, но вдруг еще кому-то пригодится. Оригинал, кстати, удобно распечатать и приколотить на стену над рабочим местом, дабы бдить что:
Читать далее Безопасность PHP приложений