понедельник, 12 мая 2008 г.

Почему я люблю Python ?

Название поста - калька названия презентахи Брюса Эккеля. Он большой специалист по C++, и поэтому я был очень удивлён тем фактом, что его любимый язык - Python. Удивлён потому, что его практические знания C++ позволили написать классную книжку, одну из лучших, какие вообще есть про С++ (конечно, если Вы вообще признаёте какие-либо книги по C++, кроме стандарта :-) ). Советую почитать презенташку (если вы её ещё не читали), она в ppt, но ОО её открывает ОК.

Мой вариант ответа прост - для меня это единственный из языков, при использовании которого 90%, а может и 99% времени я трачу на то, что думаю о том, что будет написано.

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

:-)

четверг, 8 мая 2008 г.

Задавайте размер шрифта в em, %#@^% !

Поубивал бы всех, кто в css задаёт размер шрифта не в em, а особенно тех, у кого размер шрифта по дефолту не 1em (ну или хотя бы 0.8-0.9em) !!!!!!

Дальше, по идее, ругательства, но, пожалуй, пропущу этот момент.

Django консоль в PyDev Eclipse

Должен сразу сказать, что не смог настроить работу PyDev консоли с IPython. Без IPython всё работает ОК. Ключ --plain в составе argv не сработал. Конечно, IPython рулез, но имхо, PyCrust поудобнее будет. _Имхо_.

Итак, есть PyDev, есть его консоль. Как сделать так, чтобы она загружала shell Django со всеми модельками ? Пошаговая инструкция:

1) Забираем django-command-extensions, копируем файл

shell_plus.py
в
django/core/management/commands
2) Window->Preferences->Pydev->Interactive Console->Initial interpreter commands.
Вводим следующее одной строкой (здесь с переносами для красоты):
import os;f=open(os.path.expanduser('~')+"/"+".pyconsole_path","r");
project_path=f.readline();f.close();import sys;sys.path.append(project_path);
import settings;from django.core.management import execute_manager; execute_manager(settings,['','shell_plus'])
3) текст этой незамысловатой программки сохраняем под каким-нибудь именем в домашний каталог:
#!/usr/bin/python
import sys
import os.path

def main():
if len(sys.argv) < 2:
sys.exit(1)
f= open(os.path.expanduser('~') + "/" + ".pyconsole_path", "w")
f.write(sys.argv[1])

if __name__ == "__main__":
main()
chmod само собой, далее, в Eclipse: Run->External Tools->Open external tools dialog, прописывается какое-нибудь название для программки, путь к ней, и в Arguments пишется:
${workspace_loc}${project_path}
Что получается в результате ? Строка инициализации PyDev читает из файла ~/.pyconsole_path путь к каталогу проекта, который попадает туда после запуска программки. Добавляет этот путь с PYTHON_PATH, считывается файл settings и запускается менеджер с параметром shell_plus, в результате - шелл с загруженными моделями в Eclipse.

Т.е. пользоваться так - сначала запустить программку, которая в External Tools, потом запускать консоль. Программку нужно запускать, когда в Eclipse меняется рабочий проект.

Есть один косяк - после запуска шелла приходится один раз нажимать Enter. Это связано с тем, как интерпретатор обрабатывает код, размещённый в одну строку. Если знаете, как побороть, пишите !

среда, 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))

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