Generation LOST Time to get lost

23Май/110

Я по наивности думал, что на django нельзя писать говнокод. Оказывается можно.

22Фев/110

DOC / RTF / ODT / … -> HTML / PDF / DOC / ODT / RTF / …

Немного рабочих моментов и полезного кода. Может кому пригодиться.

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

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

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

# -*- coding: utf-8 -*-
#!/usr/bin/env python
# Copyright (C) 2011 DMZ <dmz@the-island.ru>
# 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):

# Find OpenOffice.
_oopaths=(
        ('/usr/lib64/libreoffice/program', '/usr/lib64/libreoffice/program'),
     )

Пример: python o2o.py -i document.odt -o document.pdf -f pdf

3Авг/100

Сегодня я узнал о Python PEP342. Нужно срочно найти этой фиче какое-нибудь интересное (и практическое) применение

17Июн/100

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

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

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

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

9Июн/100

Я все таки запилил на хабр статью о скробблинге музыки из mpd через официальный клиент. Так что можно ставить плюсики или минусики

2Июн/100

Python GTP

Давно не выкладывал полезного ненужного кода...

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

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

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

31Май/100

GEdit

GEdit — отличный редактор кода под Linux

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

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

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

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

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

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

18Май/100

Django 1.2

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

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

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

17Окт/091

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)

А потом уже можно играться с самим модулем для Яндекс.Фоток. Я комментарии кое-как написал, должно быть понятно.

Связано с категорией: API, Python, Программирование 1 комментарий