понедельник, 17 августа 2009 г.

MuPDF and Fitz: reference counting and documentation

I am currently trying to wrap MuPDF (which uses Fitz graphics library) with Python and create PDF editing application. At first I aim for very simple (but practical!) things: crop, reorder pages...

So far MuPDF source is very readable, I like it. But for some reason MuPDF doesn't have essential things you would normally expect from an open source project:
  • no decent web site (current page doesn't count),
  • no mailing list (well, there's fitz-dev, but it's basically dead - maybe crazy anti spam technique is to blame?),
  • no documentation.
Yes, virtually no documentation. For example, I'm currently trying to understand reference counting in MuPDF. I don't want to create a memory leaking monster! Getting refcounting right seems to be not an easy thing. Even MuPDF author has had some issues with it recently. It's even more difficult without the docs.

But, after some googling I found there was some documentation in now-not-working wiki.ghostscript.com. Fortunately, some information survived thanks to archive.org. It's very old (from 2004!), but it seems core concepts hasn't changes since then. Below are some extracts from the wiki, mostly about reference counting (that's what I am currently interested in).

Dynamic Objects:
The objects are reference counted. It is up to the creator of an object to drop it once it is no longer needed. Getting an element from an array or dictionary object does not modify the elements reference count, so if you need to hold on to the object for a longer amount of time, make damn sure you call keep on it.

Coding Style on memory allocation:
In general, when a function (verb) acts on an object or structure (noun), the name shall be fz_verbnoun. The following verbs shall be used consistently:

  • new: for heap-allocating new objects.
  • free: for destroying objects created by new. Alternate name: destroy
  • keep: increment a refcnt.
  • drop: decrement a refcnt.

среда, 12 августа 2009 г.

Языки программирования и наркотики

Из выступления Дейкстры (Edsger W. Dijkstra), The Humble Programmer (1972), перевод мой:
Если попробовать описать влияние языка PL/1 на своих пользователей, самая подходящее сравнение, которое приходит в голову, - это наркотик. Помню, на посвящённом языкам высокого уровня симпозиуме была лекция в защиту PL/1. Лекцию читал человек, назвавший себя его преданным поклонником. Но, в течение часа восхвалений PL/1, он умудрился предложить добавить около 50 новых "функций" в язык. Он не подумал о том, что основным источником проблем с PL/1 можно считать как раз слишком много "функций". Лектор продемонстрировал все гнетущие симптомы наркотической зависимости. Дошедший до такого психического состояния, он мог только просить: ещё, ещё, ещё...
Я не достаточно стар, чтобы застать программы на PL/1. Однако мне хватило одного примера:
IF IF = THEN THEN THEN = ELSE; ELSE ELSE = IF;
Но я не про PL/1, а про некоторые современные языки, которые грешат нарко-проблемой. Не буду показывать пальцем на C++ и Perl...

Кстати, в своём выступлении Дейкстра ссылается на интереснейший доклад (pdf), создавший язык ALGOL. Пожалуй, прочту его как-нибудь...

пятница, 29 августа 2008 г.

"Хорошее" - враг "вообще"

Наконец-то я решил последовать совету от Paul Buchheit, главного разработчика Gmail:
"Лучшее" - враг "хорошего", ... а "Хорошее" - враг "вообще"! ...

Забудьте о нехватке таланта, умений, знаний, времени, ресурсов или чего ещё вам нужно, чтобы достичь "хорошего" (качества). Начните бессмысленный блог, делайте плохие фотографии, загружайте скучные видео на YouTube, пишите плохие программы, создавайте ненужную продукцию, играйте плохую музыку и создавайте уродливые картины. Забудьте о "хорошем". Просто получайте удовольствие от созидания.
(Перевод мой)

Что ж, начнем с бессмысленного блога!