Блог Толика Вострякова

Живой опыт программирования, Python, Django, современные языки и немного фотографий
Блог - новые записи и ссылки (Atom)
 

South 0.7 и Django 1.2 -

Для тех кто не знает South - это система миграции структуры базы данных или самих данных для Django/Джанго. До версии 0.7 она была сыровата, но с недавним выходом версии 0.7 наконец South довели до ума и даже добавили поддержку нескольких баз, появившуюся в Django 1.2 и alfa-поддержку Oracle. В том числе поправлен досадный баг, делавший невозможной миграцию many-to-many fields.

Отмечу, что есть конечно и другие системы миграции для Django, типа deseb или django-evolution, но или проекты заброшены или нет поддержки распространенных баз данных. Так что South на данный момент определенно мэйнстрим. Итак, зачем и как использовать South?

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

Читать дальше →
Комментарии: 4589

Google summer of code / GSoC 2010 -

Во-первых, ежели кто из читающих студент-программист, то вам срочно на Google Summer of Code 2010 site. Заявки на участие начинают принимать с 29 марта по 9 апреля. Я же в связи с этим хотел написать, что Джанго в числе участвующих в этом году проектов. Подробнее об этом на сайте Джанго. Среди предложенных идей - это ускорение системы генерации темплэйтов в Джанго за которую хочет взяться Alex Gaynor со своим предложением. Это тот же парень, который реализовал в Django 1.2 поддержку MultyDB. Так что с высокой вероятность к концу лета в Джанго будет новая система генерации темплейтов в 2-3 раза быстрее существующей и в тоже время совместимой с текущими тэмплэйтами.

Комментарии: 4528

Новый взгляд на генераторы в Питоне/Python Generators -

Презентация "Generator Tricks for Systems Programmers" сильно изменила мое представление об использовании генераторов. Кратко перескажу почему ниже, а лучше сами почитайте презентацию целиком.

Как известно получить генератор можно двумя способами:

  1. Создав функцию, например:
    def countdown(n): 
        while n > 0: 
          yield n
          n -= 1
  2. Создав generator expression, например:
    squares = (x*x for x in s)

Думаю это всем известно. Но вот идея объединение генераторов в один трубопровод (pipeline) для решения задачи оказалась для меня новой. Рассмотрим на примере чтения лог-файла Апача и подсчета кол-ва прочитанных байт:

Читать дальше →
Комментарии: 6059

Открываю заново IPython -

IPython - расширение стандартной интерактивной оболочки Питона. Легко ставить с помощью pip:

sudo pip install ipython

Джанго использует IPython, если выполнить: ./manage.py shell

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

Но мимо меня прошла клевая функцональность IPython, как TAB completition. То есть набираете например import fun нажимаете TAB и видите варианты всех модулей начинающихся на fun. Тоже работает для классов, аттрибутов классов и модулей. В том числе и объявленных в интерактивной оболочке вами!

Основные фишки IPython

Дополнение: Спасибо всем за комментарии, добавили много интересного для меня! IPython много чего еще умеет, упомяну в кратце: помощь по объектам используя ? в конце названия объекта, например напишите float? и нажмите Enter. Много магических команд: %run, %edit, профилирование с помощью %prun и т.д. Полный список возможностей можно получить набрав %quickref

Комментарии: 8578

Тестируем Unladen Swallow с Django 1.2 -

В продолжении темы Тестируем PyPy 1.2 с Джанго 1.2 решил проверить скорость работы тестового джанго-приложения (смотрите мой пост по ссылке выше) под Unladen Swallow из транка (выкачивал сегодня). Условия тестирования теже.

Скачивание и настройку Unladen Swallow опускаю, так она достаточно тривиальна.

Для начала я попробовал запустить свой блог. Не получилось и тоже из-за библиотеки для работы с MySQL. Правда ошибка отличается от ошибок под PyPy 1.2, и происходит в коде библиотеки. Возможно после перекомпиляция данной библиотеки под Unladen Swallow ошибка пропадет, но я дальше не копал. Так же не заработала и библиотека для работы с Postgresql (psycopg2).

Само тестирование скорости показало незначительный, но прирост скорости:

Unladen Swallow:
4.30 секунды

Python 2.6.4:
4.65 секунды

Комментарии: 5954

Тестируем PyPy 1.2 с Джанго 1.2 -

Сегодня узнал о выпуске PyPy 1.2 и конечно сразу решил попробовать, что это такое :) Все эксперименты ниже проводил на MacBook Pro (Mac OS X Snow Leopard) с процессором 2.26Гц Intel Core 2 Duo и 2Гб памяти. Тесты производительности заявляли об ускорении работы Джанго в 2.86 раз. Проверим :)

Настройка работы Джанго

Скачал и поставил себе готовую версию под Mac OS X c JIT компилятором. Узнал, где у PyPy лежат сторонние библиотеки командой:

pypy -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

и создал по этому пути simlink на директорию с библиотеками Python 2.6.4, чтобы не ставить все библиотеки заново под PyPy:

sudo ln -s /path/to/pypy/site-package/folder /path/to/python/site-package/folder

Для начала запустил pypy и импортировал Джанго: import django. Ошибок не возникло. Уже хорошо! Несколько других библиотек тоже импортировалось без ошибок: jinja2, html5lib, debug_toolbar, memcache и т.д. Следующим шагом, попробовал запустить свой блог под PyPy из папки проекта блога:

pypy manage.py runserver

Читать дальше →
Комментарии: 3706

Переход от Django темплэйтов к Jinja2 -

Весь день переводил свой блог со стандартных Django темплэйтов на Jinja2, а на второй день тестировал скорость работы. Очень было интересно попробовать :) Опять же из-за в несколько раз более высокой скорости рендеринга темплэйтов. Сейчас блог работает на Jinja2. Делюсь опытом перехода.

Установка

Ставим Jinja2 с помощью pip:

sudo pip-2.6 install jinja2

Можно поставить и из исходников, как описано в документации, в чем вроде есть преимущество, так как можно использовать опцию "--with-speedups", для еще большей скорости работы.

Читать дальше →
Комментарии: 5743

Комментарии к постам -

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

Комментарии: 7200

Кэширование темплэйтов в Джанго 1.2 -

В Джанго 1.2 появилась небольшая приятная оптимизация: кэширование темплэйтов. Включить ее очень просто, в settings.py вместо примерно такого кода:


TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
    #'django.template.loaders.eggs.load_template_source',
)

добавляем такой код:


TEMPLATE_LOADERS = (
    ('django.template.loaders.cached.Loader', (
        'django.template.loaders.filesystem.Loader',
        'django.template.loaders.app_directories.Loader',
    )),
)

Кэширование должно дать резкое сокращение операций чтения с диска, особенно, когда в вашем проекте много приложений и вы используете загрузчик:

django.template.loaders.app_directories.Loader

Более подробно об изменениях в системе тэмплэйтов читайте Django template improvements

Upd: Применил у себя в блоге это кэширование, работает :) Дальше хочу попробовать jinja2 для тэмплэйтов

Комментарии: 4977

Улучшения bash completion -

Кто работает на маке и линуксе известна функциональность bash completion: начинаешь набирать название файла или директории, нажимаешь TAB (по умолчанию два раза) и название файла или директории "допечатывается" за вас. Оказывается всю эту магию можно применить и для manage.py и django-admin.py команд, например, чтобы быстрее набирать: ./manage.py runserver. Эта же магия, начиная с Django 1.2 будет работать и для ваших команд управления. Казалось бы мелочь, но все что можно автоматизировать, лучше автоматизировать.

Настройка простая, ставим библиотеку bash-completion:


sudo port install bash-completion

Добавляем в конец файла ~/.bash_profile следующий текст:

if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi

source ~/django-trunk/extras/django_bash_completion

, где ~/django-trunk - путь к исходникам Django из транка

Читать дальше →
Комментарии: 6723

Подключение интернет-магазина к WebMoney на Python -

Когда нам в проекте потребовалось подключиться к WebMoney, я погуглил и c ходу не нашел готовых статей описывающих пример подключения к WebMoney на языке Python, поэтому подключался по документации от WebMoney и примеров на PHP. Ни то ни другое радости не вызывает, так как документация содержит, как много грубых орфографических ошибок, так и неточностей в описании API. Да и язык PHP после Python выглядит странно и некрасиво :) Поэтому я решил написать эту небольшую статью. Надеюсь она будет полезна, тем кто хочет подключить WebMoney в своих проектах на Python (например, в проекте на Джанго). Примеры кода иногда содержат немного Джанго-специфики, но их не сложно будет изменить для использования в любом проекте на Python.

Организационная часть

Существует несколько вариантов подключения к системе WebMoney. В данной статье я опишу два варианта: WebMoney XML-interface (по сути WebMoney API для продавцов) и Web Merchant Interface (переход на страницу оплаты WebMoney по специально сформированной ссылке).

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

Читать дальше →
Комментарии: 8402

Развертывание сайта на Джанго, используя FastCGI -

Данную статью я прочитал на Django Advent приуроченному к уже скорому выходу Django 1.2 и она показалось мне настолько интересной, что я решил ее перевести. Далее текст статьи.

Вступление

Когда разрабатываешь сайт на Джанго, так легко просто открыть консоль и напечатать:

python manage.py runserver

С этой простой командой управления наши медиа файлы админки сайта поддерживаются правильным образом, PYTHONPATH правильно настроен и включает корневую папку нашего проекта, а так же запущен автоматически перегружающийся веб-сервер на указанном нами порту (от переводчика: по умолчанию порт 8000). Это так просто!

Не удивительно, что люди так разочаровываются, когда приходит время положить их сайт на боевой сервер: существует так много шагов в этом процессе и поэтому сложно все их выучить и сделать все правильно. Неудивительно, что вся эта сложность приводит к тому, что написано много статей о развертывании веб-сайта на Джанго. Но почти все из этих статей фокусируются на развертывании сайта используя Apache и mod_wsgi или mod_python.

Однако иногда Apache не идеальное решение. Может быть ваш VPS имеет только 256 МБ памяти, а может быть мы хотим избежать сложности настройки Apache при установке. Или может быть нам просто не нравиться Apache. По любой из этих причин мы можем обратить свое внимание на FastCGI.

Читать дальше →
Комментарии: 476

pylibmc и новый memcached backend -

Пару месяцев назад я обратил внимание, что в качестве клиента для работы с memcached, django использует по умолчанию устаревший cmemcache (http://gijsbert.org/cmemcache/) или медленный python-memcached. И вот недавно в django developers google group я увидел, что оказывается есть отличная замена вышеуказанным клиентам: pylibmc.

Тесты обещали повышение скорости работы с memcached в два раза по сравнению с python-memcached, а я не могу равнодушно на такое смотреть, так как люблю по возможности оптимизировать :) А тут сразу двойное ускорение! Плюс в стандартном memcached cache backend есть пара недостатков устраненных в django-cache.

В результате получился "идеальный" memcached backend:


import pylibmc as memcache
from django.core.cache.backends import memcached

import time
from django.core.cache.backends.base import BaseCache
from django.utils.encoding import smart_str

class CacheClass(memcached.CacheClass):
    def init(self, server, params):
        BaseCache.init(self, params)
        self._cache = memcache.Client(server.split(';'))

def _get_memcache_timeout(self, timeout):
    """
    Memcached deals with long (> 30 days) timeouts in a special
    way. Call this function to obtain a safe value for your timeout.
    """
    # Allow infinite timeouts
    if timeout is None:
        timeout = self.default_timeout
    if timeout > 2592000: # 60*60*24*30, 30 days
        # See http://code.google.com/p/memcached/wiki/FAQ
        # "You can set expire times up to 30 days in the future. After that
        # memcached interprets it as a date, and will expire the item after
        # said date. This is a simple (but obscure) mechanic."
        #
        # This means that we have to switch to absolute timestamps.
        timeout += int(time.time())
    return timeout

def add(self, key, value, timeout=None, min_compress_len=150000):
    if isinstance(value, unicode):
        value = value.encode('utf-8')
    return self._cache.add(smart_str(key), value, 
                                    self._get_memcache_timeout(timeout), 
                                    min_compress_len)

def set(self, key, value, timeout=None, min_compress_len=150000):
    if isinstance(value, unicode):
        value = value.encode('utf-8')
    self._cache.set(smart_str(key), value, 
                        self._get_memcache_timeout(timeout), 
                        min_compress_len)

Достаточно положить этот код в отдельный файл (например в cache_class.py) в вашем джанго приложении и прописать в settings.py:

CACHE_BACKEND = '"your app".cache_class://127.0.0.1:11211/?timeout=300'

Забыл самое главное, для работы pylibmc сначала нужно поставить библиотеку libmemcached. На маке пришлось скачивать и компилировать ее из исходников. На убунту тоже поставил из исходников. pylibmc поставил из исходников последней 1.0 alpha версии:


wget http://download.tangent.org/libmemcached-0.38.tar.gz
tar -xvvzf libmemcached-0.38.tar.gz
cd libmemcached-0.38/
./configurate
make
sudo make install

cd ..
wget http://pypi.python.org/packages/source/p/pylibmc/pylibmc-1.0-alpha.tar.gz
tar -xvvzf pylibmc-1.0-alpha.tar.gz
cd pylibmc-1.0-alpha/
python setup.py build
sudo python setup.py install

Свои собственные замеры скорости работы команд get и set подтвердили почти двухкратное ускорение!

Update: для дополнительного ускорения можно перейти на использование бинарного протокола при работе с memcached. На моем MacBook Pro это дало прирост скорости на 8%. Чтобы перейти на использование бинарного протокола, пишем:

self._cache = memcache.Client(server.split(';'), binary=True)
Комментарии: 4691

Django Coverage -

Возможно не все знают, я например не знал, что помимо юнит-тестов в питоне есть еще такая небольшая библиотека: coverage. Делает простую вещь: показывается какой код выполнялся, а какой нет. Результаты показывает в нескольких форматах. Особенно красиво это выглядит в формате html - создается целая папка где по каждому модулю показывается с цветовой раскраской сколько в процентах покрытие кода, сколько всего строк и сколько покрыто. Можно открыть исходники каждого модуля и увидеть с подсветкой какой код не выполнялся. Дополнительно для Django написано небольшое приложение django-coverage, которое заменяет стандартный класс тестирования.

Настроить все это для django-проекта просто:

1. Ставим coverage и django-coverage


sudo port install py26-coverage (mac-way, на линуксе ставим из пакетов)
sudo pip-2.6 install django-coverage

2. Создаем папку, куда будут класться html-файлы отчетов покрытия кода


sudo chown "your-user-name" build (обычна папка build уже есть в проекте)
mkdir build/coverage

3. В settings.py проекта добавляем две строчки


TEST_RUNNER = 'django_coverage.coverage_runner.run_tests'
COVERAGE_REPORT_HTML_OUTPUT_DIR = './build/coverage'

4. Запускаем юнит-тесты джанго-проекта:

./manage.py test
и смотрим степень покрытия кода в папке
build/coverage

Результаты нескольких дней использования: coverage рулит! Реально нашел около четырех багов за счет увеличения площади покрытия кода тестами!

Комментарии: 7080

Tokyo Tyrant cache backend for Django -

Написал и выложил на Github первую свою небольшую библиотеку для Django:

Tokyo Tyrant cache backend for Django

Написал свое, так как полностью хорошей аналогичной бибилиотеки не нашел. Ее можно использовать вместо стандартного memcached, чтобы хранить закэшированные данные в Tokyo Tyrant. Он, так же как и memcached является key-value хранилищем данных, но хранит свои данные на диске, то есть persistent. Позволяет настраивать репликации и много других интересных штук.

Комментарии: 417

Django и MultiTextInputWidget field -

В Django можно создать widget, который позволяет редактировать сразу словарь, если в поле модели храниться словарь (в моем примере он храниться в json). Принцип работы: при рендеринге элемента формы словарь рендериться на несколько TextInput полей формы (метод render), а при сохранении значения собираются обратно в методе value_from_datadict.
Получившийся код класса виджета:

class MultiTextInputWidget(forms.TextInput):

def __init__(self, attrs=None):
    super(MultiTextInputWidget, self).__init__(attrs)

def render(self, name, value, attrs=None):
    # value is a dictionary in json format or string
    final_attrs = self.build_attrs(attrs)
    id_ = final_attrs.get('id', None)
    output = []
    try:
        value = json_loads(value)
        if isinstance(value, dict):
            for i, key in enumerate(value):
                if id_:
                    final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
                output.append(u'<label for="%s">%s:</label>%s' % \
                           (final_attrs['id'], key, 
                            super(MultiTextInputWidget, self).render(name + \
                                      '_%s' % key, value[key], final_attrs)))

        else:
            raise ValueError()
    except ValueError:
        final_attrs = dict(final_attrs, id='%s_%s' % (id_, 0))
        output.append(super(MultiTextInputWidget, self).render(name, value, 
                               final_attrs))
    return mark_safe(u''.join(output))

def id_for_label(self, id_):
    if id_:
        id_ += '_0'
    return id_
id_for_label = classmethod(id_for_label)

def value_from_datadict(self, data, files, name):
    """
    Combine values of the field from data-dictionary.
    """
    if name in data:
        value = data.get(name, None)
    else:
        value = {}
        for key in data:
            if key.startswith(name):
                n, suffix = key.rsplit('_', 1)
                value[suffix] = data.get(key, None)
    return value
Комментарии: 7346

Свойства в языке Python -

Захотел недавно создать свойство у класса, то есть поле из которого можно как читать, так и писать в него c какой-то дополнительной обработкой. Поискав в интернете с удивлением обнаружил как минимум четыре решения задачи :) В результате исследования нашел самое красивое от создателя языка Guido van Rossum, тем неменее привожу так же и остальные варианты:

1. Самое элегантное решение (доступно с версии Python 2.6):

class Requisite(models.Model):
    requisite = models.CharField(max_length=100, verbose_name=u'реквизиты')

    @property
    def requisite_dict(self):
        return json.loads(self.requisite)
    @requisite_dict.setter
    def requisite_dict(self, value=None):
        self.requisite = json.dumps(value)
2. Менее красивое, но терпимо:

class Requisite(models.Model):
    requisite = models.CharField(max_length=100, verbose_name=u'реквизиты')

    def requisite_get(self):
        return json.loads(self.requisite)
    def requisite_set(self, value):
        self.requisite = json.dumps(value)
    requisite_dict = property(requisite_get, requisite_set)
3. Старое замороченное решение:

def Property(func):
    return property(**func())

class Requisite(models.Model):
    requisite = models.CharField(max_length=100, verbose_name=u'реквизиты')

    @Property
    def requisite_dict():
        def fget(self):
            return json.loads(self.requisite)
        def fset(self, value):
            self.requisite = json.dumps(value)
    return locals()
4. А еще можно создать свойство на основе дескрипторов языка Python :) Но об этом в следующий раз :)
Комментарии: 8224

Традиционный первый пост :) -

В своем блоге я буду писать от своем опыте программирования, сейчас это в основном Python + Django. Об интересных штуках, которые встречаю в процессе работы над проектами. Об интересных библиотеках и технологиях.

Цвета блога соответствуют моему любимому году Тигра и сняты пипеткой с моей горнолыжной куртки :)

Привет! :)

Комментарии: 4944

предыдущая страница

 

 

Автор

Толик Востряков
Ник: magic
Мой ЖЖ

Интересное

psycopg2 + ctypes -

Переписанный psycopg2 для работы с ctypes под PyPy 1.6+

Simulating select_related() on a GenericForeignKey -

Django patterns, part 4: forwards generic relations Очень пригодилось для проекта - выборка всем GenericForeignKeys одним запросом к базе. Рекомендую, кто сталкивался.

python-handler-socket library -

Библиотека на питоне для работы с HandlerSocket - специальным плагином для работы с MySQL в режиме NoSQL. Производительность сравнима или превосходит memcached. http://l-o-n-g.livejournal.com/153756.html - описание использования и тестирования HandlerSocket

Realtime Web: TornadoIO + Socket.io -

Интересная серверная библиотека поверх Торнадо + клиентская часть в виде библиотеки Secket.io поддерживающая следующие протоколы для организации непрерывного канала с сервером: Websocket, Flashsocket, XHR multipart, XHR polling, JSONp, HTMLFile (IE only)

Django 1.3 Cache improvements -

В Django 1.3 систему кэширования довели до ума. Из новых прикольных штук: 1. можно указывать несколько кэш-бэкэндов (так же как в случае баз данных): новая переменная CACHES; 2. появилось понятие версии кэша (есть функция для инкрементирования версии); 3. можно задать свою функцию для формирования префикса для ключа; 4. Добавлена поддержка библиотеки pylibmc (самая быстрая из всех для работы с memcached)

django-multihost -

Приложение упрощающее работу с несколькими сайтами в одном проекте, меняя SITE_ID на лету в зависимости от названия домена.

django-test-utils -

Набор утилит для тестирования Джанго проектов. Спасибо Роме Ворушину за наводку

PyPy 1.4 -

Сравнение скорости работы Джанго с cPython 2.6.2

Быстрее в 7 раз! Наконец-то 64 битная версия! Версия уже используется в production

django-extauth -

Extended authorization framework for Django (also 1.2), including field-level permissions and role-based permissions

Javascript templates -

Сохраню пару ссылок на интересные шаблонизаторы на javascript, как замена шаблонам на сервере. Второй с поддержкой джанго-шаблонов. И еще один очень интересный tempest: jquery + django template синтаксис

django packages site -

Django Packages - reusable apps, sites, tools, and more for your Django projects. Очень полезный сайт. Все пакеты разбиты по категориям. Можно сравнить пакеты с одинаковой функциональностью по популярности, продолжается ли еще его разработка и т.д. и выбрать лучший.

django-sentry -

Логирование в базу джанго - ошибок, замена стандартной отправке писем об ошибках. Удобная панель просмотра результатов логирования. При использовании нескольких баз данных (Django => 1.2) позволяет указать базу в которую будет производиться логирование. Альтернативное джанго-приложение для логирования: django-lumberjack

django-formwizard -

Django-formwizard is a reusable app to work with multi-page forms. Besides normal Forms, it supports FormSets and ModelForms. То есть, если нужно разбить форму на несколько страниц (шагов) и сохранить данные из всех шагов в базе на последнем шаге, то django-formwizard - это то что нужно. Данное приложение постепенно идет на замену стандартного form-wizard.

Django Admin Tools -

Описание отличного приложения позволяющего очень гибко кастомизировать стандартную Джанго админку. Ссылка на сам проект

Релиз Django 1.2 -

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

Скорость разработки веб-приложений на Django -

В статье описывается измерение скорости разработки веб-приложений на Python + Django по сравнению с ASP.NET. В результате разработка на Python + Django оказалась в примерно в два раза бестрее, чем на ASP.NET

Using CPython extension modules with PyPy natively -

Парни не перестают радовать и скоро выпустят поддержку модулей расширения CPython. С моей точки зрения останется еще поддержка 64-битного режима и желательно Python 2.6-2.7 и PyPy действительно можно будет рассматирвать как замену CPython, дающую действительно большой прирост скорости

Erlang Factory SF Bay Area 2010 -

Так как в прошлом я программировал на Erlang, то тема развития этого языка мне близка. На странице представлены презентации многих интересных докладов с прошедшего Erlang Factory SF Bay Area 2010, такие как: Erjang - A JVM-based Erlang VM, Erlang SMP support - behind the scenes, Fast Enough (применение NIF, доклад от Майкрософт), JavaScript CouchApps with CouchDB, Latest news from the Erlang/OTP team at Ericsson и другие.

Вышел Python 2.6.5 -

19 марта был выпущен релиз Python 2.6.5, исправляющий несколько дюжин багов. Новый релиз уже доступен в мак-портах. Новой функциональности в ветке 2.6 больше не предполагается.

Thread-safe Django cache backend for pylibmc -

Реализация потокобезопасного кэш-бэкэнда для Джанго с использованием библиотеки pylibmc.

Hidden python features -

Отличная подборка интересных особенностей языка Питон в одном месте.

PyInstaller -

Программа для конвертирования приложений на Питоне в исполняемый файл под Windows, Linux и даже под мой любимый Mac OS X (пока из транка) со всеми нужными библиотеками для работы. Целью проекта является автоматическое отслеживание зависимостей со сторонними распространенными библиотеками прямо "из коробки" без каких либо дополнительных настроек. Проект активно развивается, в баг-трекере есть даже тикет для поддержки Джанго :)

Pip, virtualenv и virtualenvwrapper -

Рома Ворушин, понятным языком про pip, virtualenv и virtualenvwrapper. Про такие возможности pip я и не знал :)

johnny-cache -

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

Деревья в админке django -

Простой вариант подключения дерева в админку Джанги. В комментариях к статье есть ссылка на еще один вариант подключения дерева в админки, который на вскидку еще проще: FeinCMS tree editor И в завершении темы отличная библиотека для django работы с деревьями: treebeard

New GIL in Python 3.2 -

The new GIL does not eliminate the GIL--it makes it better. Namely, a significant reduction in all of that thrashing and extra signaling overhead

Описание новой функциональности Django 1.2 -

With each new release, Django offers new features and techniques to simplify web development. Django Advent brings you articles about these new features and the techniques they make possible, often written by the feature's author.

Context Manager for timing -

Прекрасный пример кода: одновременно Context Manager и декоратор для измерения времени выполнения кода

Материалы продвинутого уровня по Питону -

Подборка книг и статей для углубленного изучения языка

Easy fabric deployment -

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

django-pingback -

Джанго приложение от Ивана Сагалаева для реализации tracebacks, которое я скоро буду использовать в этом блоге

Декораторы Python -

Простое и понятное описание декараторов в Питоне от Ромы Ворушина с примерами кода