Configuration management: push vs. pull / Ian Bicking

Since I’ve been thinking about deployment I’ve been thinking a lot more about what "configuration management" means, how it should work, what it should do. I guess my quick summary of configuration management is that it is setting up a server correctly. "Correct" is an ambiguous term, but given that there are so many to [...]

Read full entry at origin

Joining Mozilla / Ian Bicking

As of last week, I am now an employee of Mozilla! Thanks to everyone who helped me out during my job search. I’ll be working both with the Mozilla Web Development (webdev) team, and Mozilla Labs. The first thing I’ll be working on is deployment. In part because I’ve been thinking about deployment lately, in [...]

Read full entry at origin

Перезагрузка блога / Александр Соловьев

Ну что, привет, в очередной раз на новый лад - я опять сменил себе движок блога. :) И на этот раз уже не очень важно, что это - потому что он просто генерирует статический сайт. ;)

Я даже пош?л на столь экстремальный шаг, как отсутствие комментариев - обдумав ситуацию, я понял, что пишу не ради комментариев, а ради того, чтоб поделиться с читателями мнением, новостью и т.п.

Надеюсь, что дизайн вам понравится, как нравится он мне - он достаточно ненапряжный и чистый. Единственное, что мне не нравится - это иконка, которая является ссылкой на блог в заголовке (третья справа). Заодно я планирую писать почаще (3 поста за последние полгода - это не очень кл?во, да?), потому что это теперь сделать проще - все посты являются файлами в репозитории, которые без проблем можно обновлять в редакторе, не открывая никакого сайта.

В любом случае, как говорит Джереми Кларксон - hello and welcome! И прошу прощения, если старые посты вдруг оказались новыми в ваших фидридерах. :)

The various ways of distributing Python source applications / Brett Cannon

I am currently cleaning up the CLI implementation of Oplop, and so I am beginning to think of the various ways I can distribute the source code as an application instead of a library without resorting to compiled solutions like py2exe or py2app. Turns out there are ton of options!

The traditional way of distributing a Python application that you didn't package up using a tool like py2exe was to have a single package that contained the application code. You then included a script with the term "python" in the shebang as pointed to by your setup.py file. The issue with this, though, is that scripts relying on a shebang are UNIX-specific and so leave Windows users out in the fold.

Luckily Python 2.7 and runpy fix this problem somewhat. You can now add a __main__.py file to a package containing your app's front-end code to make it executable using the -m option (this changes application layout best practices, which I will discuss later in this post)

Read full entry at origin

Mercurial 1.4.1 / Александр Соловьев

Хочу похвастаться - вышел Меркуриал 1.4.1, замечательный тем, что в него включили мо? расширение - schemes. Это аналог алиасов, но только для адресов. После его включения и добавления в ~/.hgrc таких строчек:

[schemes]
p = ssh://piranha.org.ua/hg/

можно писать hg push p://byteflow/ вместо полного адреса. В расширении уже есть предопредел?нные ссылки:

py = http://hg.python.org/
bb = https://bitbucket.org/
bb+ssh = ssh://hg@bitbucket.org/
gcode = https://{1}.googlecode.com/hg/

{1} в gcode означает, что первая часть урла (если считать их так: gcode://первая/вторая/етц/) будет вставлена в начало адреса, а не в конец.

Остальные изменения - в основном мелкие фиксы для 1.4 (который, кстати, вышел две недели назад).

GAE писали идиоты / Александр Соловьев

К сожалению, этот пост не изменит ничего, но тем не менее я не могу не поделиться наблюдением о том, что авторы питоновской части GAE - идиоты. Они попытались скопировать синтаксис джангового орма, при этом порядочно искалечив его, но не это самое плохое. Самое плохое, что я на сегодняшний день наш?л, выражается вот таким кусочком кода:

def improved(request):
    d = date.today()
    q = Stat.all().filter('date', d - timedelta(1))
    def value(q):
        try:
            return q.get().value
        except AttributeError:
            return 0
    return {
        'users': value(q.filter('type', Stat.TOTALUSERS)),
        'questions': value(q.filter('type', Stat.TOTALQUESTIONS)),
        }

Тут вс? выглядит кл?во, правда? Вот только есть один нюанс: в questions у меня тут попадает 0 (хотя судя по базе данных - должно попасть куда более другое число). Я долго-долго думал и поменял местами users и questions, и после этого 0 стал попадать в users ( questions в это время оказались заполнены как надо).

Я не знаю, какой идиот это сделал, но надеюсь, что он хотя бы икн?т. ;)

Opster / Александр Соловьев

Two months ago I've released little command line parsing library for Python called opster (actually it was called finaloption then, but I've renamed it because of remark from native speaker ;-)). What's the reason to write one more command line parser when Python already has getopt and optparse in standard library and not so long time ago argparse and optfunc were released?

Well... as usually, because I think that they are going wrong way and doing wrong things. Of course, IMO (but what matters if not opinion? :P).

It started to happen when Zed Shaw wrote big article on Python warts and mentioned that Lamson has much better command line parsing solution than argparse/optparse. I was interested in this topic a little at the time and I looked at the code. It would be lie to say that I liked it. In fact I thought that this is a heresy of the same level as optparse. ;-)

Read full entry at origin

Finaloption / Александр Соловьев

Я тут выпустил библиотеку для парсинга коммандлайновых аргументов. Зачем еще одна, когда уже в питоне есть getopt и optparse, когда не так давно появились argparse и optfunc?

Ну... как обычно, потому что они все неправильные и делают не то и не так, как хочется. ;)

Вс? началось тогда, когда Зед Шоу (Zed Shaw) написал здоровенную статью про проблемы в питоне и упомянул, что он в Lamson'e использует систему парсинга аргументов значительно более приятную, чем argparse/optparse. Меня в тот момент как раз беспокоила эта тема и я пош?л посмотреть. Сказать, что она мне понравилась, я не могу. Даже наоборот, мне она показалась не меньшей ересью, чем optparse, но с другого боку.

Read full entry at origin

Юникод в Python 2.x - что это и зачем? / Александр Соловьев

В реальном мире строковыми данными обмениваются в какой-то кодировке. Например, koi8-r, cp1251, utf-8. И когда тебе приходят данные, ты во многих случаях знаешь, какая это кодировка. Но когда тебе приезжают данные из разных мест в разных кодировках, работать с ними одновременно довольно напряжно - надо всегда об этом помнить.

Чтоб облегчить жизнь, внутри программ используют юникодные данные - это которые u'test'. Их можно получить декодированием обычной строки, типа 'test'.decode('utf-8'), и точно так же кодированием превратить в обычную строку: u'test'.encode('utf-8').

Юникод - это способ представления, а не хранения данных. Т.е. юникод - это стандарт, который сопоставляет символу какое-то число - те самые u<номер>. А кодировка - это способ хранения этого числа, например UTF-81 хранит числа таким образом, что символы латиницы (символы с номером меньше 128) кодируются в один байт, и таким образом соответствует ASCII. При этом у кириллицы - двухбайтные символы.

Read full entry at origin

Mercurial 1.3 / Александр Соловьев

Это, конечно, не полноценная статья в блог, но тем не менее довольно кл?вое событие - вышел Mercurial 1.3. Событие кл?вое тем, что в него добавили поддержку сабрепозиториев - аналог externals из svn. ;) Пока она еще не отполирована, поддерживает только меркуриаловые репозитории, но тем не менее - это уже отлично. Само собой, остальных изменений тоже немало.

Вообще выход крупного/популярного проекта с твоими патчами - это всегда приятно. :)

P.S. BTW, если есть желающие - меркуриал можно переводить на русский. ;-)