среда, 30 апреля 2008 г.

Про код

Чтобы вился код,
и душа пела,
не будь художником слов,
будь художником дела.

espeak

В Ubuntu 8.04 этот пакет установлен по умолчанию (я его не ставил). Нашёл в процессе поиска лишних программ для удаления :-)

espeak -v russian_test "Привет, Стас ! Как дела ?"
Может быть полезно в сценариях, говорит сносно.

понедельник, 28 апреля 2008 г.

Django 7477, он же queryset-refactor

В общем-то, не 7477 на самом деле, а 7497 (20 коммитов спустя) , 7477 я не застал :-). Вот смотрю, уже 7499 :-)

Суть изменений хорошо описал Александр Кошелев.

В моём проекте как раз была ситуация с многократным повторением одного поля во всех моделях (наследования-то не было).

Обновился, переписал код моделей, syncdb вообще ничего не сказал, всё работает так же.

Читаем доку !

пятница, 25 апреля 2008 г.

Ubuntu 8.04 Lenovo R60 WiFi

В 8.04 поставляются новые дрова под WiFi, но с ними он не работает.

Магическая строка

sudo apt-get install linux-backports-modules-hardy-generic
решает проблему. Нашёл тут.

четверг, 24 апреля 2008 г.

Иконки для сайтов

Понадобилось найти иконку "инвертирует фильтр". Например, "найти все, которые не".

Очень люблю маленькие иконки (16х16), т.к. они занимают мало пространства, и, если хорошие, всегда к месту (главное не переборщить с количеством !).

Не помню, что вписал в гугль, но в результате нашёл потрясающую коллекцию из 700 иконок, как раз, как мне нужно - 16х16. Самое главное, они отличного качества (насколько я в этом понимаю), и лицензия подходящая (грубо говоря, free).

Результат: ту, что мне была нужна, подобрал, до конца все не досмотрел (_много_ их там !).

Особенно понравилась иконка bug :-)

Если баян, не пинайте, лучше добавьте в комменты ссылок на хорошие бесплатные иконки. :-)

среда, 23 апреля 2008 г.

Дзен ума

Посчитай себя умным - обязательно окажешься глупцом.
Посчитай себя глупцом - может быть, окажешься умным.


:-)

вторник, 22 апреля 2008 г.

decorator

UPD: Александр Соловьёв написал про это лучше, здесь.

---

Хорошая библиотека для создания декораторов:


from decorator import decorator

def trace(f, *args, **kw):
print "calling %s with args %s, %s" % (f.func_name, args, kw)
return f(*args, **kw)

@decorator(trace)
def f1(x):
pass

>>> f1(0)
calling f1 with args (0,), {}

Не нарушает сигнатуры функций:


>>> print getargspec(f1)
(['x'], None, None, None)

@decorator(trace)
def f(x, y=1, z=2, *args, **kw):
pass

>>> f(0, 3)
calling f with args (0, 3, 2), {}

>>> print getargspec(f)
(['x', 'y', 'z'], 'args', 'kw', (1, 2))

находится тут.

суббота, 19 апреля 2008 г.

Жизнь

Поискал на гугле и яндексе по слову жизнь: на обоих первый результат - газета жизнь. Специально пишу с маленькой буквы.

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

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

Автор, взявший на себя ответственность за такой вопрос, должен первым ответить здесь:

Жизнь, как мне кажется, дана для того, чтобы сначала стать человеком, а потом остаться человеком.

Специально не написал "остаться им", потому что иначе это может трактоваться по-разному.

Ваши версии ?

четверг, 17 апреля 2008 г.

Про идеомы Python

Между делом нашёл хорошее, короткое и понятное описание сабжа:
http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

среда, 16 апреля 2008 г.

Термометр

Вчера чего-то съел, видимо, отравился. Сегодня болею, температура.

В связи с этим, жена заставила мерять (измерять, не знаю, как правильно) температуру. И вот о чём я подумал, глядя на термометр: я узнал, какая была температура в последний раз, просто поглядев на шкалу перед резетом.

Суть проста: при создании любой системы с динамически меняющимися показателями, можно дополнять интерфейс одной фичей - "запомнить значения перед логаутом". После того, как юзер (оператор) подключается к системе, ему на экране выводятся 2 списка показателей - в момент, когда он отключился, и в текущий момент. Таким образом, он может легко понять, что изменилось за время его отсутствия.

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

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

Картинки не рисую, потому что болею.

вторник, 15 апреля 2008 г.

Отладка Django

В своё время долго искал, как это лучше сделать, поэтому пишу тут.

Значит, нам понадобятся три вещи:
  1. Eclipse
  2. PyDev
  3. время на установку и настройку
Я пользуюсь Ubuntu (в данный момент времени пока что 7.10, но скоро выйдет новая версия), поэтому процесс установки Eclipse опишу одной фразой - скачал и распаковал бинарный релиз в ~/eclipse. Как это под Windows, не знаю :-)
Ставить PyDev можно, как визуально описано тут. PYTHONPATH в настройках PyDev, я по-моему, даже не трогал, всё само настроилось.

После того, как установлены Eclipse и PyDev, нужно создать новый проект, указав в качестве рабочего каталога тот, в котором находятся исходники Django-проекта. Eclipse импортирует файлы, и они появятся в виде дерева каталогов проекта слева в навигаторе. Это если вы не пользуетесь svn.

Я пользуюсь, поэтому помимо вышеуказанных инструментов сразу поставил Subclipse. В такой конфигурации новый проект создаётся импортом из svn (File-New Project-Checkout Projects From SVN). Каталог для файлов будет использован либо тот, что по умолчанию, либо тот, что укажете. У меня есть ~/projects, там был создан каталог для проекта из SVN.

Итак, инструменты настроены (кстати, покопайтесь в настройках, там можно поменять под себя массу вещей), проект создан, как отладить ?

Очень просто. Открывается Run-Open Debug Dialog, Python Run, жмётся кнопка New (вверху слева), и задаются такие параметры: Project - текущий проект, Main Module - полный путь к manage.py проекта, проверяется PYTHONPATH (чтобы там был Django), переход на закладочку Arguments, в Program Arguments пишется runserver --noreload. Всё.

Теперь можно расставлять брейки и наслаждаться отладкой по кнопочке F11. Кстати, если не установлен psyco, лучше сразу поставить, т.к. это посоветует отладчик :-)

Мне Eclipse и PyDev сэкономили кучу времени, т.к. сами понимаете, без отладчика, как без рук.

Ещё на эту же тему есть отличный пост Максима Деркачёва про удалённую отладку.

В общем, советую !

четверг, 10 апреля 2008 г.

Python: создание объекта по имени класса

Столкнулся с тем, что оказывается, я никогда этого не делал, а нужно. Например:


IDLE 1.2.1 ==== No Subprocess ====
>>> class stub(object):
def hi(self):
print "Hi !"

>>> a = stub()
>>> a.hi()
Hi !
>>> a
<__main__.stub>
>>> str = u'stub'
>>> str
u'stub'
>>> b = str()
Traceback (most recent call last):
File "", line 1, in
b = str()
TypeError: 'unicode' object is not callable

Не работает - по имени не создаёт класс !
Порылся, нашёл такое. То есть, через globals():

>>> b = globals()[str]()
>>> b
<__main__.stub>
Потом решил поискать на русском (на английском ничего вразумительного на эту тему найти не удалось, далеко запрятано), и, как всегда, оказалось, что наши программисты самые программистые программисты в мире ! :-) No joke !
Итак, здесь тема сами знаете чего раскрыта!.

В данном случае (в idle) сработает и locals():

>>> c = locals()[str]()
>>> c
<__main__.stub>
По вышеуказанному линку на форуме также указано, как создать объект, если известно имя его класса и модуля:

>>> module_name = 'pprint'
>>> class_name = 'PrettyPrinter'
>>> imported_module_object = __import__(module_name)
>>> kls = getattr(imported_module_object, class_name)
>>> pp = kls()
>>> pp.__class__.__name__
'PrettyPrinter'
>>> repr(pp)
pprint.prettyprinter

Вообще, Портал Python-программистов читать очень рекомендую - хороший сайт.