All articles, tagged with “python”

Мысли по мотивам PyCamp Kyiv

Первое впечатление

Сразу вспомнился анекдот:

— Чем отличается программист-интраверт от программиста-экстраверта?
— Во время разговора программист-интраверт смотрит на свои ботинки, а программист-экстраверт смотрит на ботинки собеседника.

Видел Капитана Очевидность

Длинный первый доклад «Почему Python — тормоз и как заставить его меньше тормозить» был о том, что добавление уровней абстракции снижает производительность, а отказ от деструктивного присваивания сильно упрощает жизнь компилятору, интерпретатору и разработчику.

Докладчик не читал “Coders at Work”. Иначе воспользовался бы шуткой про “5 = 6”.

О взаимоотношениях

Привлек внимание доклад Дмитрия Кожевина «”Программирование на нервах” — короткий разговор об управлении проектом».

Мой коллега (Юра Сафроненко) является тренером НЛП и (совершенно бесплатно) ставит над нами опыты и делится своими тайными знаниями.

В своем докладе Дмитрий Кожевин только царапнул поверхность проблемы личностного взаимодействия между менеджером и разработчиком. В НЛП эти вещи проработаны вдоль и поперек. Не знаю, хорошо или плохо, что у ПМ-ов нет такого инструмента. Упоминание концепций “положительной” и “отрицательной” мотивации показывает, что в целом в этом направлении движение идет.

Об инструментарии

Доклад Андрея Светлова «Безопасная разработка ПО. Результат длинного пути и множества набитых шишек.» — ода отрицательной мотивации. “Не напишете тесты — проект не соберется”, “не запустите тесты — заказчик зарежет”, “не сделаете еще что-то — Земля налетит на небесную ось”.

А заказчику пофиг на тесты. Для него это непроизводственные расходы. Если сразу все писать правильно, то тесты можно не писать и не запускать.

Отрицательная мотивация в данном случае ведет к затратам времени со стороны разработчиков и денег со стороны заказчиков.

Ужас

Показанные в рамках доклада «Расширение и встраивание Python» фрагменты кода порадовали равномерной плотностью верстки. Как в хорошей книге, на всю ширину экрана сверху донизу.

Последние разы такой “бизнес-бизнес” я видел, разглядвая реализованный на C web-интерфейс сетевого хранилища данных и код motion-detect в в проекте ZoneMinder.

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

Велосипед

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

Чай с бутербродами

В беседе с Юревичем (резок, как ситро, доклад про декораторы прочитал за 15 минут) высказал мысль, что тесты, методологии, жилетка/пряник/кнут ПМ-а — приспособления, позволяющие среднему человеку почти сразу играть на пианино так, как это делают выпускники консерватории. Сразу не получается, но на безрыбье и жопа — соловей. Посадить за пианино выпускника консерватории нельзя. Играть надо “Мурку” в прокуренных кабаках, а профессиональные пианисты хотят играть Рахманинова.

Возня инженеров под столом математиков смешит.

О прекрасном

Девушка-оператор радовала глаз. Надо организовать фан-клуб.

Научный эксперимент

Читает Егор Егоров

Есть у меня внешний USB 2.5” винт, на котором живут бекапы Time Machine. И есть у меня к нему два шнурка: один тонкий, а второй толстый, длинный и с двумя разъемами (второй — для доп. питания). Обычно я пользовался длинным солидным шнуром, а в последние пару дней стал пользоваться тонким. Логика простая: винт либо работает, либо не работает. Раз уж ему удалось раскрутиться на тонком проводе — значит, питания хватает и он работает. А тонкий провод удобнее:)

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

На коротком проводе у меня полностью был разрушен раздел с бекапами Time Machine и едва выжил том с фотографиями (они сбекаплены в другом месте). Я переставил провод на толстый, создал новый раздел и все стало снова хорошо.

Моя гипотеза: на интенсивных операциях питания чуть-чуть недостает. Из-за этого на какое-то очень короткое время вырубается двигатель и головки паркуются на инерции движения блинов. Тут же моментально падает нагрузка по питанию, оно восстанавливается, двигатель банки снова запускается, блок головок снова ищет и находит адресные метки. И так — несколько раз в секунду или наоборот, раз в несколько секунд. Перепадов вращения блинов не слышно, а вот головки постоянно ездят и имитируют бурную деятельность. Электроника по питанию отключиться не успевает, а холостое вращение блинов, видимо, является штатной ситуацией, и поэтому винт ничего не сообщает операционке.

Вывод: USB-провод важен, и тот факт, что винт в принципе запустился на конкретном проводе — еще ничего не значит.

Дорогие радиослушатели, только что вы прослушали радиопостановку “Научный эксперимент”.

А теперь наш гость из MIT Gerald Jay Sussman расскажет, почему вводный курс “Структура и интерпретация компьютерных программ (SICP)” будет основан на языке Python вместо Scheme.

Инженер должен научиться проводить научные эксперименты для выявления принципов работы программного и аппаратного обеспечения, по крайней мере до степени, позволяющей решить возникшую задачу. (The engineer must learn to perform scientific experiments to find out how the software and hardware actually work, at least enough to accomplish the job at hand.)

Сдается мне, господа, что старые пердуны в чем-то правы.

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

Moving SICP to Python

'-._                  ___.....___
    `.__           ,-'        ,-.`-,
        `''-------'          ( p )  `._        HAVE YOU READ
                              `-'      \       YOUR SICP TODAY?
                                        \
                              .         \ 
                               \---..,--'
   ................._           --...--,
                     `-.._         _.-'
                          `'-----''

О замыканиях в Python

В pythonua@c.j.r xa4a поднял интересный вопрос о замыканиях в Python.

Код, ставший камнем преткновения:

l = []
for i in range(2):
    for j in range(2):
        l.append(lambda: i + j)

По идее, список l должен содержать анонимные функции, возвращающие 0, 1, 1, 2 (порядок в данном случае не важен).

Проверяем в ipython:

In [1]: l = []
In [2]: for i in range(2):
   ...:     for j in range(2):
   ...:         l.append(lambda: i + j)
In [3]: for x in range(4):
   ...:     l[x]()
Out[3]: 2
Out[3]: 2
Out[3]: 2
Out[3]: 2

Облом.

Как одно из решений, была предложена конструкция следующего вида:

l = []
for i in range(2):
    for j in range(2):
        l.append(lambda i=i, j=j: i + j)

Проверяем.

In [3]: for x in range(4):
   ...:     l[x]()
   ...:     
   ...:     
Out[3]: 0
Out[3]: 1
Out[3]: 1
Out[3]: 2

Работает.

Это пример простого и понятного всем неправильного решения.

Почему решение неправильное? Потому что в первом случае в список добавляются анонимные функции с 0 (нулем) аргументов и двумя свободными переменными. Во втором случае в список попадают уже анонимные функции от 2-х аргументов, для которых (аргументов) указаны значения по умолчанию. Для понятности второй вариант анонимной функции можно переписать так:

lambda n=i, m=j: n + m

То есть “мы шли на Одессу, а вышли к Херсону”.

Перед тем, как рассмотреть правильное решение, рассмотрим почему получается то, что получается.

In [1]: l = []
In [2]: i = 3
In [3]: f = lambda: i + 3
In [4]: f()
Out[4]: 6
In [5]: i = 5
In [6]: f()
Out[6]: 8

Очевидно, что i в анонимной функции и i снаружи от нее — смотрят в одно и то же место памяти, хотя я ждал, что i внутри функции переопределит i снаружи.

Что делать?

Правильное решение:

def lsum(n, m):
    return lambda: n + m

l = []
for i in range(2):
    for j in range(2):
        l.append(lsum(i, j))

При использовании дополнительной функции значения i и j копируются, после её завершения ссылки на копии остаются только внутри анонимной функции, а циклы доступа к копии не имеют.

Проверяем:

In [4]: for x in range(4):
   ...:     l[x]()
Out[4]: 0
Out[4]: 1
Out[4]: 1
Out[4]: 2

В PLT Scheme ситуация аналогичная:

(define i 3)
(define f (lambda () i))
(f)

3

(set! i 5)
(f)

5

но на фоне предпочтитения рекурсии циклам неожиданности возникают значительно реже.

Мораль придумайте сами.

Создание пакетов Debian из пакетов Python

Решил еще раз посмотреть на Orbited (который с последнего раза успел подрасти на четыре версии).

Сразу задумался о том, что если ставить пакеты Python рекомендуемым в их туториале методом (easy_install), то потом придется долго и мучительно все это вычищать.

 

Orbited dependency on Python 2.5

Looks like Orbited depends on Python 2.5 (instead of 2.4+). With default 2.4 in Debian it becomes a little problem.

With if you (like me) are using Orbited/Django/Debian combination you should use easy-install-2.5 during installation and add python2.5 instead python in the beginning of manage.py.

It will be necessary until 2.5 becomes default python in Debian (dottedmag, I’m looking at you).

OpenID server as Django application in Byteflow engine

So now I have a working OpenID server implementation. Its based on Djangoid project by Nicolas Trangez, but implemented as almost self-contained Django application (it lost some guts during transplantation; lets hope it regrows them later).

It uses python-openid library and currently serves auth requests only for superuser on Byteflow blog.

Its not ready to be included in main Byteflow tree because of syncdb problems when using MySQL, really ugly templates and incorrect python-openid behavior.

To track current state of this application you can use this branch of Byteflow repository.

Byteflow installation

So you decided to try Byteflow blog engine. Good for you. We need more users of the Byteflow. “More meat for the grinder.”

Here I will describe installation of Byteflow on Debian Unstable/Sid with Apache2/mod_python. I assume you already set up your /etc/sudoers file and use sudo for any operations requiring root privileges.