cd ~/.config/sublime-text-2/Packages/User/
curl -O https://raw.github.com/gist/1344471/open_file_at_cursor.pyOpen keyboard bindings file, and add a line to it
[
...
{ "keys": ["alt+o"], "command": "open_file_at_cursor" } // this one| # THIS VERSION IS OUTDATED | |
| # see .inplace(), .cloning(), ._clone() and .clone() methods of QuerySetMixin | |
| # in https://github.com/Suor/django-cacheops/blob/master/cacheops/query.py | |
| from django.conf import settings | |
| from django.db.models import Model, Manager | |
| MUTATING_QUERYSETS = getattr(settings, 'MUTATING_QUERYSETS', False) | |
| class QuerySetMixin(object): | |
| def __init__(self, *args, **kwargs): |
| 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() |
| from django.core.urlresolvers import get_callable | |
| from django.template import TemplateDoesNotExist | |
| from django.template.loader import BaseLoader | |
| from django.template.context import BaseContext | |
| from django.conf import settings | |
| import jinja2 | |
| def monkey_patch_django(): |
| from django.db.models import Model | |
| from itertools import izip | |
| def attnames(cls, _cache={}): | |
| try: | |
| return _cache[cls] | |
| except KeyError: | |
| _cache[cls] = [f.attname for f in cls._meta.fields] | |
| return _cache[cls] |
cd ~/.config/sublime-text-2/Packages/User/
curl -O https://raw.github.com/gist/1344471/open_file_at_cursor.pyOpen keyboard bindings file, and add a line to it
[
...
{ "keys": ["alt+o"], "command": "open_file_at_cursor" } // this one| #!/usr/bin/perl | |
| use v5.10; | |
| use strict; | |
| use warnings FATAL => 'all'; | |
| use Mojo::UserAgent; | |
| my $latest_url = Mojo::UserAgent->new->get('http://www.sublimetext.com/2') |
| FUNCTION LIMIT_API_CALL(ip) | |
| ts = CURRENT_UNIX_TIME() | |
| _, current, _ = MULTI | |
| SETNX(ip, ts * 10) | |
| INCR(ip, 1) | |
| EXPIRE(ip, 1) | |
| EXEC | |
| IF current - ts * 10 > 10 THEN | |
| ERROR "too many requests per second" | |
| ELSE |
Задача: нужно при активации услуги продлять жизнь объявления.
Как не писать одинаковый код в каждом обработчике активации?
Примеры возможного аспектно-ориентированного кода на разных языках.
Код на перле рабочий с библиотекой Aspect, на остальных языках просто возможные варианты.
Первый вариант использует простые обёртки - перед вызовом AdvertService.activate() навешивает обёртку на метод .save() отдельного объявления, которая уже его продляет. Второй вариант комбинирует два среза: вызов AbstractAdvert.save() и нахождение в потоке управления AdvertService.activate(), и накладывает обработчик на комбинированный срез.
Интересно как недостаточный синтаксис и семантика разных языков делают подобные операции неуклюжими.
P.S. Другой вариант - использование событий, но он более многословный.
| given (\@ARGV) { | |
| when ([]) { | |
| make_all(); | |
| } | |
| when ([qr/first|second|third/]) { | |
| make_source(@ARGV); | |
| } | |
| when ([qr/first|second|third/, qr/\d\d\d\d-\d\d-\d\d/]) { | |
| make_source_day(@ARGV); | |
| } |
| import re | |
| from django.core.management.base import LabelCommand, CommandError | |
| from django.db.models.loading import get_model | |
| class ModelCommand(LabelCommand): | |
| args = 'model+' | |
| def handle_label(self, label, **options): | |
| if not re.search(r'^\w+\.\w+$', label): |