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

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

Допустим, у вас есть модель, которая хранит состояние в базе данных, данная модель связана с пользователями. Но как быть в случае неавторизованного пользователя? Хранить состояние в кукисах браузера. Для этого пришлось бы пробежаться по модулю и ставить проверки, добавлять новые методы, переменные. В итоге код превратится в сплошной 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

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

Книги? да!

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

VLC

К вечной теме, на чем смотреть видео и слушать аудио. Ок?

Имхо для Linux систем VLC не подходит, ну никак! После мытарства по его плейлисту, который просто отвратителен в пользовании, я решил забить на него. Даже скины, которые на вид привлекательно изменяли внешность плеера, не помогут.

Два если:

- хотите слушать музыку, то поставьте foobar2000, да придется ставить wine, но линуксоиды? у кого он не стоит? -) Или можно поставить amarok, в общем для прослушивания музыки в линуксе достаточно софта, а вот с поддержкой cue не так уж и много, и все хромают когда в листе русские названия. А я любитель русского рока и lossless форматов :)

- хотите посмотреть видео, то пересоберите mplayer с выводом графики через видеокарту, потому что процессор со скаченными HD фильмам просто тупит. Да и вообще mplayer приятнее и пошустрее VLC.

Разбиение объектов на “равные” части

Предлагаю вашему вниманию небольшой снипет, который мы написали, когда понадобилось сделать вывод объектов по колонкам.

  1. from django import template
  2.  
  3.  
  4. register = template.Library()
  5.  
  6.  
  7. class SplitObjectsNode(template.Node):
  8.     def __init__(self, objects, list):
  9.         self._objects = template.Variable(objects)
  10.         self._list = list
  11.  
  12.     def render(self, context):
  13.         import math
  14.         columns_count = len(self._list)
  15.         objects = self._objects.resolve(context)
  16.  
  17.         for item in self._list:
  18.             context[item] = []
  19.  
  20.         if len(objects) == 0:
  21.             return
  22.  
  23.         dec = float(len(list(objects))) / columns_count
  24.         mid = int(math.ceil(dec))
  25.         pass_part = len(list(objects)) % columns_count
  26.         count_full_cols = columns_count – pass_part
  27.  
  28.         idx = 0
  29.         index = 0
  30.         for item in self._list:
  31.             step = mid
  32.             if idx >= pass_part and pass_part != 0:
  33.                 step = mid – 1
  34.             context[item] = objects[index: step + index]
  35.             index += step
  36.             idx += 1
  37.         return
  38.  
  39.  
  40. @register.tag
  41. def split_objects(parser, token):
  42.     """                                                                                                                                                                                                      
  43.    Split content of the objects to equal parts. Number of parts is a count of passed arguments to tag.                                                                                                      
  44.                                                                                                                                                                                                            
  45.    Example:                                                                                                                                                                                                
  46.    {% split_objects objects col1 col2 col3 %}                                                                                                                                                              
  47.    <table><tr><td>                                                                                                                                                                                          
  48.    {% for item in col1 %} {{ item.title }} {% endfor %}                                                                                                                                                    
  49.    </td><td>                                                                                                                                                                                                
  50.    {% for item in col2 %} {{ item.title }} {% endfor %}                                                                                                                                                    
  51.    </td><td>                                                                                                                                                                                                
  52.    {% for item in col3 %} {{ item.title }} {% endfor %}                                                                                                                                                    
  53.    </td></tr></table>                                                                                                                                                                                      
  54.    """
  55.     parts = token.contents.split()
  56.     if len(parts) < 3:
  57.         raise template.TemplateSyntaxError, "Tag should get at the least 3 arguments. Example usage is {% split_objects objects col1 col2 %}"
  58.  
  59.     tagname = parts.pop(0)
  60.     objects = parts.pop(0)
  61.     return SplitObjectsNode(objects, parts)

Набор горячих клавиш для работы с консолью

Если вы работаете с текстом в консоли, возможно правите какую то конфигурацию на сервере под никсами (к примеру генту), то возможно вам будет интересно и полезно узнать некоторые горячие клавиши которые вы вероятно никогда не использовали.

Возвратится на начало текущей строки Ctrl + A
Возвратится в конец текущей строки Ctrl + E
Удалить слово назад Alt + BackSpace
Удалить слово вперед Alt + D
Переместить курсор к началу следующего слова Alt + F
Переместить курсор к началу предыдущего слова Alt + B

Удалить символ перед курсором Ctrl + D

Данные комбинации поддерживаюца большинством никсовых систем.

PS.: имхо иногда удобно очень, чем тыкать мышкой

Zenwalk и мысль о укомплектованном пакете.

Сегодня установил себе на рабочий компьютер довольно занятный дистрибутив Zenwalk . Понравилось что зен это полноценный домашний десктоп да и еще к тому же абсолютно не избалованный гномами и кедами, и несет на своем борту такой легкий оконный менеджер xfce.

Очередным сюрпризом после установки явилось то, что версия питона стояла 2.6, так что обновлять его мне не пришлось, а сразу пошли установки пакетов – django, wxWidgets, wxPython, и еще всякого по мелочи.

Ну и плюс как обычно сделал себе полный набор девелоперского софта – Eclipse, lighttpd, php, mysql. Подумалось то что каждыйраз когда идет настройка новой оси или не совсем новой, то такие действия я повторяю из раза в раз. Пришла мысль сделать какой то пакет который бы при установке сразу же имел все необходимые мне вещи.

Возможно примусь за это в скором времени.