Показаны сообщения с ярлыком snippet. Показать все сообщения
Показаны сообщения с ярлыком snippet. Показать все сообщения

понедельник, 18 августа 2014 г.

Запускаем Sublime Text 2 из консоли в OS X

Если /usr/local/bin/ существует, то:


ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl

Все, теперь можно открывать файлы, например, вот так

subl /etc/hosts

пятница, 24 января 2014 г.

Вывод локальных переменных функции с ошибкой

Иногда бывает необходимость посмотреть локальные переменные функции в python, которая вызвала Exception в самом верху стека вызовов.

Проще всего сделать это, воспользовавшись штатным модулем inspect внутри блока except:

inspect.trace()[-1][0].f_locals

среда, 8 августа 2012 г.

Декоратор для автоматической регистрации сигналов Django

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

from functools import wraps
from django.db.models.signals import pre_save
from django.db.models.signals import post_save

def autoconnect_signals(cls):
    """ 
    Class decorator that automatically connects pre_save/post_save signals on 
    a model class to its pre_save_handler()/post_save_handler() methods.
    """
    def connect(signal, func):
        cls.func = staticmethod(func)
        @wraps(func)
        def wrapper(sender, *args, **kwargs):
            return func(kwargs.get('instance'), args, kwargs)

        signal.connect(wrapper, sender=cls)
        return wrapper

    if hasattr(cls, 'pre_save_handler'):
        cls.pre_save_handler = connect(pre_save, cls.pre_save_handler)

    if hasattr(cls, 'post_save_handler'):
        cls.post_save_handler = connect(post_save, cls.post_save_handler)
    
    return cls

Пользоваться декоратором просто. Создаете модель, в ней делаете методы pre_save_handler и/или post_save_handler и оборачиваете класс декоратором:

@autoconnect_signals    
class Book(models.Model):    
    
    #...
    name = models.SlugField(_("Name"), max_length = 150, unique = True)

    def pre_save_handler(self,*args, **kwargs):
        u"""Сигнал, получаемый перед сохранением модели."""
        print self.name #в self передается сам инстанс модели.
                        #Остальное есть в аргументах.

    def post_save_handler(self,*args, **kwargs):
        u"""Сигнал, получаемый после сохранения модели."""
        print self.name

Вот и все. pre_save_handler и post_save_handler сами вызовуться по соответствующим сигналам сохранения модели.


пятница, 11 мая 2012 г.

Заставляем Microsoft Word for Mac вставлять текст без форматирования

Microsoft Word для мака ужасен. Причем, надо заметить, что версия для Windows еще более неудобна и нестабильна, но тем не менее это не делает версию для мака лучше. Мало того, что при работе с большими документами (более ста страниц), приложение зачастую просто зависает или внезапно отказывается сохраняться, мотивируя это тем, что диск якобы переполнен (хотя свободно более 70%, а остальные приложения работают норрмально), а резервные копии иногда просто не сохраняются, так еще и стандартных фич вроде вставки текста без форматирования в ворде нет (вернее, они есть, но запрятаны в дебри меню Paste Special).

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

Для начала откроем редактор скриптов (/Applications/AppleScript/Script Editor) и вставим следующий сниппет:

try
    set theClip to Unicode text of (the clipboard as record)
    tell application "Microsoft Word" to tell selection to type text text theClip
end try

Теперь сохраним его в папке /Users/<имя вашего пользователя>/Documents/Microsoft User Data/Word Script под названием Paste unformatted\msV.scpt , где обратный слеш - это не разделитель папки, его нужно указать в названии файла.

Перезагружаем ворд и теперь спокойно вставляем неотформатированный текст сочетанием клавиш shift+cmd+V

пятница, 6 января 2012 г.

Как прожечь фид в Django

Простейший способ прожечь фид в Django 1.3+, если вдруг кому-то понадобится:


#views.py
from django.http import HttpResponseRedirect
from feeds import MyFeed  


def burnedFeed(request, **kwargs):
    if request.META.get('HTTP_USER_AGENT', '').startswith('FeedBurner'):
        feed = MyFeed()
        return feed(request)
    else:
        return HttpResponseRedirect('http://feeds2.feedburner.com/MyFeedName')


Где MyFeed - класс вашего фида (см. докуменатацию), где MyFeedName - правильный адрес в FeedBurner

среда, 23 ноября 2011 г.

Сниппет для быстрого удаления svn-файлов


На всякий случай положу сюда сниппет для быстрого удаления файлов svn из папки, которую нужно импортировать в другой репозиторий:


find ./ -name ".svn" | xargs rm -Rf

пятница, 29 июля 2011 г.

Сохранение пропорций изображения при масштабировании в одну строку

Кстати, а как вы обычно сохраняеете пропорции картинки при масштабировании? Делите одну сторону на другую?

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

image.scaleX < image.scaleY ? image.scaleY = image.scaleX : image.scaleX = image.scaleY;

Ленивые могут скопипастить себе полный метод:

function resizeObject(target:DisplayObject, maxWidth:Number, maxHeight:Number, keepAspect:Boolean=true):void
{
    target.width = maxWidth;
    target.height = maxHeight;
    if (keepAspect) 
    {
        target.scaleX < target.scaleY ? target.scaleY = target.scaleX : target.scaleX = target.scaleY;
    }
}

среда, 4 мая 2011 г.

Отправка писем с DKIM-подписью в Django

Если вы вдруг обеспокоились тем, чтобы ваши письма не попадали в черные списки почтовых сервисов и решили-таки прикрутить DKIM-подписи к своим письмам в Django, то нет ничего проще.

Начиная с версии 1.2, Django стала поддерживать почтовые backend'ы, что существенно облегчило жизнь разработчику в этом плане. Все, что требуется, так это установить pydkim и создать модуль с бекендом, например <ваше_приложение>/mail/backends.py:

from django.core.mail.backends.smtp import EmailBackend
from django.conf import settings
import dkim

class DKIMBackend(EmailBackend):
         u'''
         Бекенд, позволяющий вставлять в письма DKIM-подпись.
         Требует определения переменных в settings:
                 DKIM_SELECTOR - селектор, все что до точки в  "selector._domainkey.example.com"
                 DKIM_DOMAIN - домен например, "example.com"
                 DKIM_PRIVATE_KEY - приватный DKIM-ключ. Полностью, включая "-----BEGIN RSA PRIVATE KEY-----" и т.п.
         @requires: python-dkim, есть на http://hewgill.com/pydkim
         '''
     def _send(self, email_message):

         if not email_message.recipients():
             return False
         try:
             message_string = email_message.message().as_string()
             signature = dkim.sign(message_string,
                                   settings.DKIM_SELECTOR,
                                   settings.DKIM_DOMAIN,
                                   settings.DKIM_PRIVATE_KEY)
             self.connection.sendmail(email_message.from_email,
                     email_message.recipients(),
                     signature+message_string)
         except:
             if not self.fail_silently:
                 raise
             return False
         return True

Останется только сменить в settings.py параметр EMAIL_BACKEND на "<ваше_приложение>.mail.backends.DKIMBackend" и прописать там же DKIM_SELECTOR, DKIM_DOMAIN и DKIM_PRIVATE_KEY (смотрите докстринг в коде). Сгенерировать недостающие ключи можно тут.

понедельник, 11 апреля 2011 г.

Взвешенный выбор в Python

Очень часто встречаю людей, которые зачем-то пытаются сделать взвешенный выбор в питоне, создавая огромных размеров массивы с повторяющимися значениями и потом выбирая из них результат с помощью random.choice. Вариант, конечно, логичный и простой в реализации, но... как же он тормозит и сколько памяти расходует. Что если у меня у одного элемента вес 5000, а у другого 1? Зачем мне ради одной операции строить массив длинной в 5001 элемент? :)

Конечно же, есть варианты гораздо проще и изящнее. Списывайте:


import random 

def weighted_choice(choices):
    u'''
    Взвешенный псевдослучайный выбор. Чем выше вес, тем выше шанс выпадения значения.
    @param choices: список или кортеж пар вида: (   ('choice', 14), ('choice2', 11), ... (<значение>, <вес>  ) 
    '''
    total = sum(w for c,w in choices)
    r = random.uniform(0, total)
    upto = 0
    for c, w in choices:
        if upto+w > r:
            return c
        upto += w
    assert False, "Shouldn't get here"

Работает вот так:

test_choices = ( ('Foo', 8), ('Bar', 3), ('god damn!', 1) )
for i in xrange(10):
    print weighted_choice(test_choices)