Опубликовал: vitaly volkov.

django-sendmail

Не используйте email backend в django, если конечно вам достаточно smtp. А если нет? Вот я лучше прибегну к серверной команде sendmail для отправки почты, чем буду использовать smtp для приложения.

При этом подходе мы получаем возможность очереди отправки, нам не надо писать отдельный скрипт и ложить его в крон задачу. Улучшается производительность системы за счет того, что операций запроса, авторизации и отправки прямо из приложения нет. Вместо этого весь контент писем идет сплошным текстом к созданному sendmail каналу (pipe).

Приведу очень простой пример:

from django.conf import settings
from django.utils.encoding import smart_str
import os

def sendmail(to, subject, body):
p = os.popen('/usr/bin/sendmail -t', 'w')
p.write("MIME-Version: 1.0\n")
p.write("Content-Type: text/html;charset=utf-8\n")
p.write("To: %s\n" % to)
p.write(smart_str("From: %s\n" % settings.EMAIL_FROM))
p.write(smart_str("Subject: %s\n" % subject))
p.write("\n")
p.write(smart_str(body))
p.close()

Такой скрипт не будет работать на windows, я не видел пакета sendmail в этой операционной системе. Да и я не встречал серверов Windows, на которых бы хостились django приложения.

Я не написал чего мы лишаемся при таком подходе. Мы не можем определить какие письма были успешно доставлены, а какие нет.

django теги для jccompressor

Буквально пару дней назад я выложил пакет с набором классов, которые позволяют сжимать скрипты в один файл, используя yui или google closure compiler. Продолжая развитие темы хочу сообщить что в пакете теперь присутствуют теги для django приложений. Я не буду расписывать как их использовать, это достаточно расписано в README файле репозитория. Вы еще не знаете в каком?

git@github.com:hash3g/jccompressor.git

Пользуйтесь на здоровье :)

Jabber клиент для Emacs

Нашел замечательный плагин для emacs, который позволяет легко и непринужденно посылать сообщения в мой jabber аккаунт. Конечно одним jabber я не ограничился и в основном использую google talk для разговора с собеседниками.

Для установки следует скачать пакет с официального сайта.

Итак вы скачали и распаковали архив, приступим к внедрению плагина в наш любимый редактор.

Я люблю, когда все плагины находятся в директории ~/.emacs.d и считаю это правильным, но ничего не мешает вам ложить его куда угодно.

В ваш .emacs файл пропишем строки

(add-to-list 'load-path "/path/to/your/emacs-jabber")
(require 'jabber-autoloads)

Обычно при внедрении нового плагина я рестартую редактор, но если вы знаете, как применить изменения, не делая перезапуска буду рад услышать. Итак редактор перезапущен и следующий шаг это добавить свои jabber-аккаунты.

M-x jabber-customize

Для настройки google talk аккаунта я использовал такие данные:
JID: GmailID
Network server: talk.google.com
Port: 5223
Connection type: Legacy SSL/TLS

Все, осталось сохранить параметры и выполнить M-x jabber-connect для одного аккаунта или M-x jabber-connect-all, если вы хотите активировать все заведенные аккаунты.

Чтобы при запуске постоянно не коннектится к jabber я прописал в самый конец своего .emacs строку (jabber-connect-all)

Приятного вам общения через ваш любимый редактор :)

python js/css compressor

В наших проектах всегда используется n-ное число клиентского кода, как js, так и css. Но на боевые сервера данные скрипты должны попадать сжатыми каким-нибудь компрессором. Каждый раз при обновлении css, добавлении нового js функционала приходится пересжимать скрипты по новой и отдавать клиенту. Это не самый лучший вариант. Поэтому был написан класс, который собирал все скрипты в один файл и травил его компоновщику. На стороне клиента оставалось только сделать апдейт скриптов и изменить версию файла и компоновщик сам пересобирал и сжимал скрипты через yuicompressor.

Функционал будет постепенно дополняться. Так к примеру в планах внедрить разбиение скриптов по размеру (IE имеет привычку не грузить css файл полностью если он превышает определенный размер).

Самую последнюю версию можно забрать с github’а

git clone git@github.com:hash3g/jccompressor.git

Дайте гостю печеньку, он тоже ее достоин!

Допустим, у вас есть модель, которая хранит состояние в базе данных, данная модель связана с пользователями. Но как быть в случае неавторизованного пользователя? Хранить состояние в кукисах браузера. Для этого пришлось бы пробежаться по модулю и ставить проверки, добавлять новые методы, переменные. В итоге код превратится в сплошной if… else, а оно нам надо? «А что делать?» — спросите вы. (Надеюсь что не спросите =) Без паники! Я, как-а-вот, ваш спаситель, расскажу и покажу на выход.


Выход — сделать фейковую модель и орудовать ею, как и с обычной джанговской моделью.

Пример


class UserBasket(models.Model):
user = models.ForeignKey(User)
shakedtimes = models.IntegerField(default = 0)

Тогда нашей фейковой моделью будет


class AnonymousBasket(object):

def __init__(self, request, response):
self.shakedtimes = request.COOKIES.get('sk_times', '0')
self.response = response

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


def save(self):
self.response.set_cookie('sk_times', self.shakedtimes)

Красяво? Думаю да. Минусом выступает то что в фейковую модель необходимо передать объект запроса и ответа, но как вы собрались считывать и сохранять куки, а? А? То-то же.

животный инстинкт

На балконе нашего здания, где мы находимся всегда стояла баночка для окурков, ну чтобы не сорить. Сегодня заметил что баночки-то нет и люди выходящие покурить бросают окурки на то место, где она была раньше. На такое наблюдать конечно забавно. Извините, а если у них в сортире убрать унитаз, они продолжуть срать в то место?

Вечером на Хрещатике

Киев замечательный город. Где еще можно увидеть в центре большого города гитариста, который поет Сплина, и кучу молодых людей, которые громко ему подпевали? И все это почти в 9 часов вечера.

Гитаристу просто огромный респект!

Gnome Drag’n Drop

Случайно обнаружил, что окна в оболочке Gnome можно тягать, зажав кнопку Alt и перемещая мышь.

HFS+ в Linux

Буквально на днях приобрел для себя внешний винчестер с расчетом на то, что в основном я этот винчестер буду в большинстве своем использовать под MacBook.
Другим для меня свойством было то что интернет у меня дома Волевский и на нем много не скачаешь. Поэтому подключать винт как минимум необходимо было и на моей рабочей машине, на которой стоит Ubuntu. И тут натолкнулся на грабли.

Первым делом отформатировал винчестер на HFS через дисковую утилиту. Отформатировал не подумавши с поддержкой журналирования, а драйвер на линуксе журналирование не поддерживал. Пришлось повторно очищать под обычный HFS (Mac OS Extended)

Второе стало то что после этого писать получалось с линукса только пользователю root. Починил это добавив запись в fstab файл:

/dev/sdb12 /home/hash3g/data auto rw,exec,auto,users 0

После этого перемонтировал диск и спокойно смог писать уже в линуксе.

Книги? да!

Книги читать полезно, они развивают сознание, расширяют твой кругозор, вот мне лично стыдно за то, что я не прочитал Властелина Колец еще до его премьеры в кино. Каюсь.