Skip to content

Instantly share code, notes, and snippets.

Suor /
Created March 16, 2011 07:27
Django: mutating querysets
# see .inplace(), .cloning(), ._clone() and .clone() methods of QuerySetMixin
# in
from django.conf import settings
from django.db.models import Model, Manager
class QuerySetMixin(object):
def __init__(self, *args, **kwargs):
Suor / gist:876324
Created March 18, 2011 15:59
QuerySet which returns namedtuples
from itertools import imap
from collections import namedtuple
from django.db.models.query import QuerySet, ValuesQuerySet
class NamedTuplesQuerySet(ValuesQuerySet):
def iterator(self):
# Purge any extra columns that haven't been explicitly asked for
extra_names = self.query.extra_select.keys()
Suor /
Created May 14, 2011 12:08
Jinja2 template loader for django
Suor /
Created May 16, 2011 16:07
Efficient pickling of django models
from django.db.models import Model
from itertools import izip
def attnames(cls, _cache={}):
return _cache[cls]
except KeyError:
_cache[cls] = [f.attname for f in cls._meta.fields]
return _cache[cls]
Suor / INSTALL.markdown
Created November 7, 2011 08:41
open_file_at_cursor sublime command
cd ~/.config/sublime-text-2/Packages/User/
curl -O

Open keyboard bindings file, and add a line to it

 { "keys": ["alt+o"], "command": "open_file_at_cursor" } // this one
Suor /
Created February 4, 2012 03:01
Sublime Text 2 updater for Linux
use v5.10;
use strict;
use warnings FATAL => 'all';
use Mojo::UserAgent;
my $latest_url = Mojo::UserAgent->new->get('')
Suor / gist:2049656
Created March 16, 2012 11:22
Redis rate limiting
_, current, _ = MULTI
SETNX(ip, ts * 10)
INCR(ip, 1)
EXPIRE(ip, 1)
IF current - ts * 10 > 10 THEN
ERROR "too many requests per second"
Suor /
Created June 7, 2012 07:33
Примеры использования AOP

Задача: нужно при активации услуги продлять жизнь объявления. Как не писать одинаковый код в каждом обработчике активации? Примеры возможного аспектно-ориентированного кода на разных языках. Код на перле рабочий с библиотекой Aspect, на остальных языках просто возможные варианты.

Первый вариант использует простые обёртки - перед вызовом AdvertService.activate() навешивает обёртку на метод .save() отдельного объявления, которая уже его продляет. Второй вариант комбинирует два среза: вызов и нахождение в потоке управления AdvertService.activate(), и накладывает обработчик на комбинированный срез.

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

P.S. Другой вариант - использование событий, но он более многословный.

Suor /
Created July 11, 2012 10:00
Parse command line options with kind of pattern matching
given (\@ARGV) {
when ([]) {
when ([qr/first|second|third/]) {
when ([qr/first|second|third/, qr/\d\d\d\d-\d\d-\d\d/]) {
Suor /
Created September 7, 2012 06:15
django ModelCommand
import re
from import LabelCommand, CommandError
from django.db.models.loading import get_model
class ModelCommand(LabelCommand):
args = 'model+'
def handle_label(self, label, **options):
if not'^\w+\.\w+$', label):