s o m e t h i n g a b o u t m e

PNG chunks removing with Python

# working on pyips

I’ve already have the post about chunk removing in Java. But how to remove chunk from PNG file data stream in python?


maxs:/usr/local/www/eth0less.com/pyips>cat ./pngutils.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
 PyIPS - Python image processing server/script

 author: Sergey Polzunov aka Traut
 email: traut.box[at]gmail.com
 blog: http://out.com.ua/blog

 Version 0.1
'''

import string

chunk_min_length = 4 + 4 + 4 # data_length, chunk_name, crc

main_chunks = ["IHDR", "PLTE", "IDAT", "IEND"]
other_chunks = ["tRNS",                                 # transparency
                "cHRM", "gAMA", "iCCP", "sBIT", "sRGB", # colorspace
                "iTXt", "tEXt", "zTXt", "bKGD",         # textual info
                "hIST", "pHYs", "sPLT",                 # miscellaneous things
                "tIME"]                                 # time stamp

def compute_chunk_length(data, i):
    return (ord(data[i]) << 3) | (ord(data[i + 1]) << 2) | (ord(data[i + 2]) << 1) | ord(data[i + 3])

def remove_chunk(data, chunk_name):
    for i in range(0, len(data) - chunk_min_length + 1):
        j = i + 4
        maybe_chunk = data[j] + data[j + 1] + data[j + 2] + data[j + 3]
        if maybe_chunk == chunk_name and (main_chunks + other_chunks).count(maybe_chunk) == 1:
            chunk_data_length = compute_chunk_length(data, i);

            #print "removing %d blocks" % (chunk_min_length + chunk_data_length)

            return data[:i] + data[i + chunk_min_length + chunk_data_length:]
    print "Cannot find chunk with name", chunk_name

def browse_chunks(data):
    found_chunks = []
    for i in range(0, len(data) - chunk_min_length + 1):
        j = i + 4
        maybe_chunk = data[j] + data[j + 1] + data[j + 2] + data[j + 3]
        if (main_chunks + other_chunks).count(maybe_chunk) == 1:
            chunk_data_length = compute_chunk_length(data, i);
            found_chunks.append((maybe_chunk, chunk_data_length))
            i += chunk_data_length + chunk_min_length

    #return found_chunks

    for chunk_name, chunk_length in found_chunks:
       print "Chunk %s founded. Data length is %d" % (chunk_name, chunk_length)

def test():
    image_file = open("test.png", "rb")
    image_raw_data = image_file.read()
    browse_chunks(image_raw_data)
    chunk = "gAMA"
    print "Removing", chunk
    new_image_data = remove_chunk(image_raw_data, chunk)
    new_image_file = open("test2.png", "wb")
    new_image_file.write(new_image_data)

    image_file.close()
    new_image_file.close()
    print "Edited file:"
    image_file = open("test2.png", "rb")
    image_raw_data = image_file.read()
    browse_chunks(image_raw_data)
    image_file.close()

if __name__ == "__main__":
    test()


Qt4.3 + CSS -> PyQT

8-) нет слов!


self.frame.setStyleSheet(QtGui.QApplication.translate("MainWindow", "border-radius: 6px;\n"
        "border: 2px solid #8f8f91;\n"
        "background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
                                                       stop: 0 #f6f7fa, stop: 1 #dadbde);",
                                  None, QtGui.QApplication.UnicodeUTF8))

накопал в процессе написания маленького кастомного таймера. все-таки сел писать, устав забывать на плите то кофе, то молоко :) пишу на PyQT4


PyIPS aka Python Image Processing Server/Script

PyIPS (Python Image Processing Server/Script) - standalone server/script behind lighttpd/apache server that provides image processing service (PIL, Imagemagick as engines). The server caches results on file system (local, mogilefs, etc). PyIPS uses file storage specified by home directory property.

Project is in the early stage of development.

example urls:

http://eth0less.com/pyips/main.py/process?name=pic1.jpg&width=200&height=200&crop_type=top
http://eth0less.com/pyips/main.py/process?name=pic1.jpg&width=200&height=200&crop_type=center
http://eth0less.com/pyips/main.py/process?name=pic2.jpg&width=500&height=400
http://eth0less.com/pyips/main.py/process?name=pic2.jpg&width=600&height=600&scale_up_allowed=true
http://eth0less.com/pyips/main.py/process?name=pic3.jpg&width=500&height=400&crop_type=center

Soon I’ll add cache function (with ability to refresh/clean image cache), ImageMagick engine (currently PyIPS works only with PIL engine) and maybe mogilefs filestorage manager.

There are some additional files in repository - main.py and main.fcgi - these are for apache+mod_python and for lighttpd+FastCGI correspondingly.


faint echo of waltz

>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

easter eggs in python :)

* tired of labs :( *


feeds2fb2 v0.4

Обновление. v0.4

  • dirty html fixing.
    Исправление грязного html-кода с незакрытыми/неоткрытыми тэгами - теги закрываются/открываются. т.к. алгоритм не-умный, возможно неправильное отображение из-за чуть неверного закрытия тегов.
  • bug-fixes and hacks.
    Исправления, мелкие дополнения. Из-за несовершенства fb2-плагина для lbook v3, предприняты некоторые пляско-бубные-действия по замене спец. символов и тэгов. Ждем исправленного и усовершенствованного fb2-плагина с полной поддержкой стилей и тэгов.

скачать/описание - feed2fb2 home


feeds2fb2 v0.3

Обновление. v0.3

  • timestamps. Запоминается последнее время скачивания rss feed-а и следующий раз при конвертации скачиваются только новые посты. Но все так же можно скачать все посты, выставив флаг — get-all-posts
  • output name. Задавая имя результата вы задаете
    1. если включен режим “каждый фид в отдельную книгу” - имя директории, куда кладутся все книги-фиды
    2. по умолчанию - это имя книги-результата конвертации
  • zip. по умолчанию все fb2 книги сжимаются zip-ом

скачать/описание - feed2fb2 home


lost in

мне вот интересно, у python в работе с utf8 наблюдается перманетный п**дец или я просто не умею готовить default encoding?


feeds2fb2

Обновление конвертора.

Добавил конвертацию картинок. Т.к. иногда они могут существенно увеличить размер fb2-книги, конвертация картинок по-умолчанию выключена (включается флагом --enable-pics).

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

подробнее - feeds2fb2

скриншоты:

баг-репорты приветствуются :)


feeds to fb2

Задумал сделать RSS ленты на jinke — дабы отделить время чтения в отдельную категорию :) и не мешать с браузингом и работой. Потому реализовал конвертор feeds2fb2:

feeds2fb2.zip
feeds2fb2.tar.gz

изначально набросал конвертер на XSLT (получил удовольствие, вспоминая былое :) ), но потом захотелось большего — захотелось, чтоб конвертор сам скачивал фиды и потом их парсил, сливая в один fb2 файл. Т.к. xslt научить скачивать линки я не знаю как, а строить конвеер xslt[opml—>txt] —> wget —> xslt[rss—>fb2] —> cat[merge fb2s to single fb2] было интересно, но лень :) , то окончательно сделано в виде скрипта на python-е c использованием шарового rss-парсера. пришлось чуть поплясать с преобразованием тегов из html в понятные для fb2 парсера на jinke, но, как оказалось, fb2 простой как стол.

для запуска:

  1. поставить Python 2.5.1
  2. распаковать архив feeds2fb2
  3. запустить “python feeds2fb2.py” и получить подсказку о формате задания аргументов в коммандной строке

входными данными являются два типа файлов — OPML файлы и обычный текстовый файл, в каждой строке которого - ссылка на ленту

пример использования:

traut@traut-laptop:~/_devel/feeds2fb2$ ./feeds2fb2.py -t text --title="My Title" ./some.txt feeds.fb2
[ http://bash.org.ru/rss ]      Bash.Org.Ru
[ http://googlerussiablog.blogspot.com/atom.xml ]       Официальный блог - Google Россия
[ http://www.the-ebook.org/e107/e107_files/backend/news.xml ]   The-eBook Russia

В windows так же просто — может только прийдется указать полный путь к python.exe

результат:

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


dancing around MPI. Python approach

I chose Python because of its simplicity and the size of coverage area :) there are a lot more docs about Python&MPI friendship then about Java&MPI (there are no tutorials/manuals about mpijava at all)

MPIJava seems to me complicated and confusing. And PyMPI is great, simple and fast-to-implement.

So, the result is: 70 lines of code on Python (create 5 matrixes, split 2 of them on equal parts, spread them through all workers, gather computation results) and one evening of fun coding :) because I’m a newbie in Python and it is very impressive and it admires me

example:

if mpi.rank == 0 :
    MB = MT = MC = MD = ME = create_matrix(n)
    mpi.bcast((MT, MD, ME))
    print mpi.rank, "MT, MD, ME broadcasted"
else :
    print mpi.rank, "Waiting for messages"
    MB = MC = []
    MT, MD, ME = mpi.bcast()

localMB = mpi.scatter(MB)
localMC = mpi.scatter(MC)

print mpi.rank,"MB, MC scattered"

MAr = sub_matrix(mult_matrix(localMB, MT), mult_matrix(mult_matrix(localMC, MD), ME))
MA = mpi.gather(MAr)

if mpi.rank == 0 :
    #print "String received", masterString
    print mpi.rank,"Results gathered"
    print print_matrix(MA)
else:
    print mpi.rank,"Worker finished his work"