A shelter from pigs on the wing
DMZ
дневник заведен 09-08-2004
постоянные читатели [32]
3 CaHuTaPa, 517design, Arde, Art`Is, aviabaza, BlackDrago, CyberJoe, DeadMorozz, Depeche Mode, DMZ, d_r, Ewige, glv12 Marla Zinger, goldenandy, Grimble, Hydralisk, Jude, Katrine Himitsu, Leave-me-alone, MISTIK, My3a, Nash, Nicholas Hawkwood, Pingvin, Riskoff, VorteX DrAgON, Wolfram, Букля_, достало, Муть, Рика, Эль
закладки:
цитатник:
дневник:
местожительство:
Красноярск, Россия, Сибирь
интересы [24]
программирование, C++, Depeche Mode, Star Wars, perl, DVD, JavaScript, FAR, lost, 80е, Half Life 2, долго спать, Miami Vice, веб-роботы, кентаврицы
антиресы [9]
грибы, грейпфрутовый сок, мёртвые люди, табличка обед, долго спать
Вторник, 17 Апреля 2012 г.
11:22 PyCharm 2.5
  • Remote interpreters — full integration with Python interpreters running on remote hosts is ensured.
  • Added ability to browse and install packagesfrom PyPI.
  • The new version provides virtualenv integration including virtualenvs creation and auto-detection of existing ones
Минорный релиз не слишком густ на обновления, но вот эти три пункта очень радуют

Суббота, 24 Марта 2012 г.
20:17 1.4

Спустя ровно год, Django-пони снова появляется на горизонте, чтобы принести нам релиз 1.4

Самое главное — это, конечно, решение проблемы N+1. При последней работе с абитуриентом я даже начал бояться m2m-связей. А теперь встречаем prefetch_related

Улучшенная поддержка WSGI. Пока все проекты в deployment у нас работают в связке cherrypy + nginx. От CherryPy используется только встроенный сервер, так что накладно таскать каждый раз всю библиотеку. И в django-cherrypy, который для связки используется тоже есть свои проблемы. А выбрано оно все было ради скорости, согласно тестам. Правда uwsgi и тогда лидировал, но его поддержка в django была не на высоте и сам он считался нестабильным. А теперь можно и попробовать. Еще интересно как там gunicorn поживает. На тестах он не в лидерах, но теперь, спустя время, все чаще вижу его рекомендации в статьях.

Именованные аргументы в пользовательских шаблонах. Я тут как раз изучаю Twig под PHP и это одна из фишек шаблонизатора, которой мне теперь не хватает django. Но главное не увлекаться этим, а то потом придется писать шаблонизатор для шаблонизатор. assignment_tag и {% static %} тоже пригодятся. Приходилось писать пользовательские теги, которые только меняют контекст. Теперь будет проще.

Остальное изучится по ходу работы.

Обзор новых фич на русском есть на blog.futurecolors.ru

Вторник, 6 Марта 2012 г.
20:07
На brainbench, который вроде как считается крутым, раздают бесплатные тесты.

Зарегистрировался, поискал Python. Нашелся только 2.4 почему-то (большинство пишут на 2.6 все же, кажется). Но прошел:

Test: Python 2.4
Date: 06-Mar-2012
Score: 4.36
Weights: 100% Python 2.4
Elapsed time: 56 min
3 sec
</td> </tr> <tr> <td>
Python 2.4
Score: 4.36
Percentile: Scored higher than 94% of previous examinees


Demonstrates a clear understanding of many advanced concepts within this topic. Appears capable of mentoring others on most projects in this area.
Strong Areas
  • Classes
  • Standard Library
  • Language
  • Built-in Features
Weak Areas
  • None noted
На $4.95 можно получить сертификат для печати. Или бумажный за $14.95

Четверг, 2 Февраля 2012 г.
09:14
Есть скрипт на dev-машине, есть на production. На production валится с ошибками, а на dev все работает. Окружение, вроде, совпадает. assert-ы и логгинг явных проблем не выдали и понятно, что только ими уже не обойдешься. К счастью у PyCharm есть удаленный дебаг:

  1. настраиваем
  2. запускаем дебаггер на dev-машине, а скрипт на production.
  3. ????
  4. ЭВРИКА!
(Как оказалось в итоге, окружения все таки не совпадали и я нашел модуль, который гадил в чужие пространства.)

Удаленный debug в PyCharm пока все же имеет некоторые ограничения:

  • пути до скриптов на разных машинах могут отличаться и это нормально. Для этого PyCharm предлагает настроить соответствие этих путей. Это работает пока не надо спуститься в глубь third-party библиотек, которые в случае того же virtualenv так же могут лежать по разным путям. Тут приходится выбирать что отлаживать: скрипты или чужие библиотеки, но не одновременно
  • окружение (точнее тот срез, с которым мы должны работать) должно совпадать на 100%
Наверно можно было бы еще на самом сервере через pdb сделать, но PyCharm сработал и дальше я не копал

Понедельник, 1 Августа 2011 г.
10:24 PyCharm
За полтора месяца государственная машина раскрутилась и бюджет России опустел на $200 долларов, чтобы купить PyCharm (на это пошли наши налоги!), которым я уже пользуюсь как раз два месяца.

У меня раньше не было опыта с IDE для Python (да их вообще мало). Я пробовал Python для NetBeans (который в 7-й версии не работает и его делают заного). Там была подсветка синтаксиса, интеграция с системами контроля версий и все. Учитывая сколько памяти жрет Java использовать NetBeans было нерационально. Поэтому я полгода работал с gedit и делал все то же самое (работу с SVN освоил с консоли).

А вот PyCharm заточен именно под Python и, что тоже важно, под Django (работа с шаблонами, готовые шаблоны кода). Он тоже на Java и тоже жрет кучу памяти, но с 6Gb на рабочей машине работать уже можно без проблем.

Из того, что я пользуюсь:

  • подсветка года
  • автоматический импорт и очистка импорта
  • автоматическое создание видов и шаблонов
  • подсветка ошибок и несуществующих файлов
  • автодополнение (переменные, параметры функций, ...)
  • рефакторинг! (перенос функций и классов в другие модули с необходимым импортом)
  • встроенный дебаггер.
  • SVN/git, diff
  • работа с отдельными списками правок в SVN/git
  • быстрая навигация по структуре файла и кода (суперклассы, дочерние классы, место объявления переменной)
  • синтаксический анализатор кода (правила хорошего тона, чтобы ваш код был гладкий и шелковистый)
Чего пока нет, но хочется:
  • встроенная работа с gettext
  • чтобы в списках изменений минимальной единицей была правка, а не файл
  • системный рендеринг шрифтов в Linux
И наверно что-то еще, что я забыл записать или пока не заметил.
Рабочий процесс:


Вторник, 28 Июня 2011 г.
08:08 Django и ODF (ODS, ODT)
Вроде OpenOffice весь из себя формат открытый-преоткрытый, свободный-пресвободный, но функциональной библиотеки для генерации документов я не нашел. Нужный функционал только в самом OpenOffice, к которому можно цепляться по сетевому протоколу.

Но на наше счастье внутри ODF сидит обычный xml (плюс пара файлов и все это обернуто в zip).

Поэтому результат вышел даже лучше чем планировал.

  • Шаблон документа можно подготовить в самом openoffice;
  • Распаковать odf-документ, извлечь content.xml;
  • подстановку переменных и повторение строк можно поручить обычным таким шаблонам django;
  • собрать zip-файл с content.xml, блэк-джеком, манифестом и mime можно на лету средствами стандартной библиотеки python;
Личный профит: шаблоны можно теперь не рисовать самому, а поручить кому-нибудь другому

Теперь надо обкатать технологию и попробовать как-нибудь скрестить с генерацией PDF

В копилку валидатор, который помог в отладке.

Четверг, 16 Июня 2011 г.
11:45
Ради соблюдения DRY-принципа в ход пошли уже метаклассы.

Зато если что теперь и поломается, то строго в одном месте.

Пятница, 10 Июня 2011 г.
07:20
Основная опасность в Django при создании чего-нибудь более крупного, чем сайт визитка — это возможность увлечься метапрограммированием, вместо создания полезного кода. Тем более, что Python с его богатыми ООП и интроспекцией этому только способствует.

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

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

Четверг, 9 Июня 2011 г.
07:42 PyCharm
Еще до того как в NetBeans 7 вырезали поддержку Python (потом добавили плагином, который лежит еще где-то в dev-репах) я перестал им пользоваться. Уж больно тяжелая эта Java

Но gedit, конечно, хорошо, но как минимум грамотного рефакторинга, быстрого перехода между файлами и других не таких уж мелочей там не хватало.

И тут я скачал и попробовал PyCharm, благо у него 30 дней пробного срока имеется.

По описанию, IDE резко заточено под Python и, что самое приятное, поддержка Django у них тоже приоритетна. После двух дней становится ясно, что надо брать. Есть и рефакторинг и переход между вьюхами-шаблонами, классами-суперклассами, импорт, автозаполнение параметров функций, методов, шаблонных тегов и всего остального, подсветка ошибок. Распознает модели django, в том числе как и явно указанные поля, так и то, что появляется по FK/m2m связям из RelatedManager.

И наконец-то я могу дебажить Python, а не разбрасывать assert-ы где попало

Наверняка еще много чего полезного там есть. За два дня не найдешь всего.

Конечно, опять Java и уже почти 700Mb оперативы и с хинтингом шрифтов Java на Линуксе не хочет дружить, но пока плюсы перевешивают

Начальству обрисовал цель, что неплохо бы заиметь коммерческую лицензию.

Кроме того у них есть PhpStorm для PHP, WebStorm для HTML, RubyMine для Ruby и Rails, IDEA для Java (и Android из коробки) и IDEA Ultimate, где есть все осразу и дешевле чем по отдельности.

Понедельник, 23 Мая 2011 г.
10:48
Я по наивности думал, что на django нельзя писать говнокод. Оказывается можно.

Вторник, 22 Февраля 2011 г.
08:11 DOC / RTF / ODT / ... -> HTML / PDF / DOC / ODT / RTF / ...
Немного рабочих моментов и полезного кода. Может кому пригодится.

Конвертируем все что угодно в что-то другое с помощью OpenOffice/LibreOffice. Понадобилось тут автоматизировать наконец это дело.

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

Принцип работы — uno. Первый раз слышу. Похоже на COM в Windows. Запускает OpenOffice в фоне и общается с ним по TCP.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# -*- coding: utf-8 -*-
#!/usr/bin/env python
# Copyright (C) 2011 DMZ &lt;dmz @the-island.ru&gt;
# Licensed under the GNU LGPL v2.1 - or any later version.
 
from ooutils import oo_properties as oop, OORunner
from optparse import OptionParser, OptionValueError
import sys
import re
import os
 
from unohelper import systemPathToFileUrl
from com.sun.star.beans import PropertyValue
 
# http://wiki.services.openoffice.org/wiki/Framework/Article/Filter/FilterList_OOo_3_0
CONVERT = {
    'html': 'HTML (StarWriter)',
    'xhtml': "XHTML Writer File",
    'rtf': "Rich Text Format",
    'doc': "MS Word 97",
    'odt': "StarOffice XML (Writer)",
    'pdf': "writer_pdf_Export",
}
 
def read_format(option, opt, value, parser):
    value = value.lower()
    if value not in CONVERT:
        formats = ', '.join(CONVERT.keys())
        raise OptionValueError(
            'Формат вывода не поддерживается. Доступные форматы: %s' % formats)
    setattr(parser.values, option.dest, CONVERT[value])
 
if __name__ == '__main__':
    parser = OptionParser()
    parser.add_option('-i', '--input', dest='input')
    parser.add_option('-o', '--output', dest='output')
    parser.add_option('-f', '--format', action='callback', type='string',
        callback=read_format, dest='format', default=CONVERT['html'])
    (options, args) = parser.parse_args()
 
    if not options.input:
        print >>sys.stderr, u"Укажите месторасположение входящего файла (-i)"
        sys.exit(1)
 
    if not options.output:
        print >>sys.stderr, u"Укажите месторасположение итогового файла (-o)"
        sys.exit(1)
 
    odir = os.path.dirname(options.output)
    if not os.path.isdir(odir):
        print >>sys.stderr, u"Путь для сохранения (%s) не существует" % odir
        sys.exit(1)
 
    if not os.path.isfile(options.input):
        print >>sys.stderr, u"%s: Указанный файл не существует" % options.input
        sys.exit(1)
 
    oor = OORunner()
    desktop = oor.connect()
 
    document = desktop.loadComponentFromURL(systemPathToFileUrl(options.input),
        "_blank", 0, oop(ReadOnly=True, Hidden=True))
 
    print u"Сохраняем документ в %s" % options.output
 
    document.storeToURL(systemPathToFileUrl(options.output),
        oop(Overwrite=True, FilterName=options.format))
 
    document.close(True)
    oor.shutdown()
ooutils можно взять тут и сохранить в отдельный файл (положить или в папку со скриптом или в питоновские пути)

Фикс для нахождения LibreOffice (amd64):

1
2
3
4
# Find OpenOffice.
    _oopaths=(
        ('/usr/lib64/libreoffice/program', '/usr/lib64/libreoffice/program'),
     )
Пример:

1
python o2o.py -i document.odt -o document.pdf -f pdf
Вторник, 3 Августа 2010 г.
00:35
Сегодня я узнал о Python PEP342. Нужно срочно найти этой фиче какое-нибудь интересное (и практическое) применение

Четверг, 17 Июня 2010 г.
14:59

И снова про освоение новых рубежов

Как написать на python веб-приложение с минимальной начинкой фреймворков? Ну чтобы не генерировать кучу оберточного кода для простого 'Hello World'?

Вроде в nginx так и не допилили поддержку WSGI, чтобы раз! и поставился из репов. Надо патчить руками.

Вообще-то можно было сделать даже чистый wsgi + apache/mod_wsgi, но так как апач всё равно спрятан глубоко за nginx и приложение простое и некритичное, то решил в качестве прослойки попробовать что-нибудь новое

Среда, 9 Июня 2010 г.
08:24
Я все таки запилил на хабр статью о скробблинге музыки из mpd через официальный клиент. Так что можно ставить плюсики или минусики

Среда, 2 Июня 2010 г.
19:34 Python GTP
Давно не выкладывал полезного ненужного кода...

Питоний модуль для вытаскивания исполнителя/названия трека из gpt/gp3/gp4/gp5 файлов

Основа нашлась в глубинах Google Code Search, а потом опробована на over 9000 файлов из несортированной свалки. А там были файлы, наверное, всех версий. Ну кроме шестой, конечно

Лицензия — BSD, все дела

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import struct
import sys
from locale import getpreferredencoding
class NotGPFile(Exception):
    pass
 
class GuitarProFileSimple(object):
    _encoding = getpreferredencoding()
 
    def read_long_string(self, fo):
        s = fo.read(4)
        size = struct.unpack('l', s)[0]
        s = fo.read(1)
        if size == 0:
            size = ord(s)
 
        string = fo.read(size - 1)
 
        return string.decode(self._encoding)
 
    def read_byte_string(self, fo):
        s = fo.read(1)
        size_block = ord(s)
        s = fo.read(1)
        size_string = ord(s)
 
        string = fo.read(size_string)
 
        fo.read(size_block - size_string - 1)
 
        return string.decode(self._encoding)
 
    def __init__(self, fo):
        fo.seek(0)
 
        head = fo.read(20)
 
        header_len = 0
        if head[1:19] == "FICHIER GUITAR PRO":
            header_len = 19
            fo.read(1)
 
        if head[1:20] == "FICHIER GUITARE PRO":
            header_len = 20
            fo.read(2)
 
        if header_len:
            self.version = fo.read(4)
            hsize = ord(head[0])
            fo.seek(hsize + 5 + 1)
 
            if self.version in ['1T\x03\x04']:
                fo.read(3)
                title = self.read_byte_string(fo)
                subtitle = ''
                artist = self.read_byte_string(fo)
            elif self.version in ['1.04', '1.02', '1.03']:
                title = self.read_byte_string(fo)
                subtitle = ''
                artist = self.read_byte_string(fo)
            elif self.version in ['2.21']:
                fo.read(1)
                title = self.read_byte_string(fo)
                subtitle = ''
                artist = self.read_byte_string(fo)
            else:
                fo.read(1)
                title = self.read_long_string(fo)
                subtitle = self.read_long_string(fo)
                artist = self.read_long_string(fo)
 
            if title:
                if subtitle:
                    self.title = '%s (%s)' % (title, subtitle)
                else:
                    self.title = title
            else:
                if subtitle:
                    self.title = title
                else:
                    self.title = ''
 
            self.artist = artist or ''
 
            return
 
        raise NotGPFile(u'Not a GP file')
Воскресенье, 30 Мая 2010 г.
23:11 GEdit
GEdit — отличный редактор кода под Linux

Сперва меня, конечно, подсадили на NetBeans, так как у на тут пытается родиться мега-проект на GWT. Но NetBeans под Python пока не так круто заточен, как под Java

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

То что сейчас у меня есть в GEdit и чего нет в NetBeans: автодополнение вводимых строк

То, что было в NetBeans и не хватает в GEdit:  динамическая подсветка diff-ов между текущим кодом и старой версией

Еще не хватало встроенного SVN, но SVN из консоли не такой сложный в обращении.

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

Вторник, 18 Мая 2010 г.
05:40 Django 1.2


Самая ожидаемая мною фича — это поддержка нескольких БД в одном проекте.

Вроде еще хотели запилить встроенную поддержку MongoDB, но не успели

Про остальные не менее интересные фичи пишут подробно на Django Advent

Суббота, 17 Октября 2009 г.
19:48 Python и Яндекс.Фотки
Понадобилось мне тут пообщаться с Яндекс.Фотками на программном уровне. API есть, описание есть, но реализаций я как-то не нашел. Даже сам Яндекс, большой любитель Python этого не предоставляет.

Так что за недельку с хвостиком неспешно набросал 90% того, что описано у них в документации.

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

Протокол представляет собой REST+Atom, так что ничего глобально сложного нет, кроме одной детальки. А деталька — это авторизация и шифрование паролей RSA ключем. Алгоритм у Яндекса свой, хитрый и написан на C++. Легко компилируется на Windows и Linux и работает с консоли. Но такой способе немного не трушный, так что это дело было быстро и безболезненно переписано в библиотечку на Python. Как оказалось, книжки не врут, и переделать код на C/C++ в бинарный модуль Python намного проще чем сделать это для Perl и PHP.

Так что порядок таков:

  1. Хватаем библиотеку от Яндекса
  2. Кидаем туда же файлы для компилирования модуля для Python
  3. Компилируем (python setup.py build)
  4. Получаем .pyd-файл, которые и есть искомый модуль. На всякий случай, то что получилось у меня: Win32, ActiveState Python 2.5.4; Linux x86_64, Python 2.5.2
  5. Файл размещаем там, где Python его сможет найти (python setup.py install)
А потом уже можно играться с самим модулем для Яндекс.Фоток. Я комментарии кое-как написал, должно быть понятно.

Воскресенье, 9 Августа 2009 г.
10:56 TwitterSpy
В твиттере пишут много всего интересного
И читать ненапряжно — сообщения короткие и от этого емкие
Но через браузер я смог себя приучить читать только одну вещь: френдленту в ЖЖ и Journals
Остальное я читаю через RSS
Но читать Twitter через RSS — это надругательство над его принципами. Twitter должен быть быстрым, мнгновенным и ни к чему не обязывющим.
То есть в идеале надо привязать Twitter к протоколу мнгновенных сообщений.
И это не проблема: API у Twitter-а открытое, а с другой стороны берем открытый протокол Jabber.
Теперь нужна программка, которая это дело свяжет
И естественно это будет Python, так как правило "import antigravity" работает.
import jabberbot
import import twitter

и понеслась!

Правда, самому разбираться с этим было лень, так что я нашел отличное рабочее решение: TwitterSpy. Тут два пути:

  • Зарегистрироваться у них на сервере (и скормить им свой пароль от twitter)
  • Либо, если есть возможности, запустить на своем сервере


Я пошел вторым путем и поставил бота у себя.
Правда у него что-то не срослось с локальный jabber-сервером, так что пришлось дополнительно сделать аккаунт на jabber.ru и дать боту этот адрес.
Хоть теперь сообщени ходят длинным крюком, но все работает как часы.

Теперь можно:

  • следить за своей лентой
  • писать в twitter (unicode работает, во всяком случае через миранду)
  • следить за ключевыми словами
  • добавлять и удалять пользователей


Каждые 5 минут бот лезет на twitter, скачивает обновления и, если вы в сети, скидывает их вам. Иначе ждет удобного случая.

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

"Полный список комманд"

А еще вот нашел jabberrss и много других рещультатов в гугле. Надо будет попробовать.
Вторник, 23 Июня 2009 г.
17:56
Открывая новые языки программирования узнаешь не только как делать старые трюки по новыми и не только получаешь новые библиотеки в комплекте.
Иногда узнаешь и новые удивительные приемы, которые в других языках не релизовали.
Вот Python радует чисто функциональными штуками и поддержкой сопрограмм-генераторов: yield — это красота, если суметь обратить его на свою сторону
Закрыть