20080930

Ошибка сохранения файла в GIMP при нехватке памяти

При редактировании больших изображений в GIMP иногда можно столкнуться с ситуацией, когда нужные правки уже сделаны, но файл сохранить не удаётся. Ошибка, которую выдаёт GIMP в этом случае связана с тем, что вся доступная память уже израсходована под хранение данных изображения, и запустить дочерний процесс, который сохранит файл, GIMP уже не может. К счастью, это совсем не означает, что результаты редактирования сохранить нельзя и они будут потеряны. Файл можно сохранить, очистив предварительно историю изменений.

Увидеть, сколько занимает изображение в памяти GIMP можно в строке состояния окна изображения. Например, в данном случае изображение занимает в памяти 164 МБ:


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

Однако при большом количестве изменений значительная часть памяти приходится не на хранение самого изображения, а на хранение промежуточных результатов (необходимых, чтобы работала функция «отмены»). Если удалить историю действий, то можно обычно освободить немало памяти. Выбираем в меню редактируемого узображения «Правка → История действий» и видим такой диалог:


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

Вообще, настроить желаемое количество уровней отмены можно в разделе «Окружение» настроек GIMP.

PS: Кто-нибудь знает, каким свободным софтом можно обрабатывать действительно большие изображения (т.е. такие, которые не помещаются в оперативную память)? Желательно, чтобы программа умела подгружать изображение «по частям». Меня интересуют прежде всего операции кадрирования, поворота на произвольный угол, коррекция кривых и цветов. Спасибо читателям за подсказку, что действительно большие изображения можно редактировать в nip2 (обзор здесь). Разбираюсь.

Смотрю с большой надеждой на формат JPEG2000, в котором есть поддержка произвольного доступа к областям изображения, но пока он, похоже, поддерживается только в ImageMagick. При этом ковертация JPEG→JPEG2000 требует много больше памяти, чем размер несжатого TIFF-а с тем же изображением. В придачу большинство просмотрщиков работать с JPEG2000 не могут.

20080918

Python внутри LaTeX (и математический пакет Sage тоже)

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

Для этого нужно:
  • скачать файл python.sty (копия python.sty на gist.github.com). Положить его в каталог с документом.
  • В документе в преамбуле включить \usepackage{python}
  • Внутри документа фрагменты кода на Python помещать в окружение \begin{python}\end{python}. Всё, что эти фрагменты кода будут печатать, станет частью конечного документа.
  • Запускать LaTeX нужно с опцией -shell-escape (разрешая тем самым запуск внешнего кода из-под LaTeX)
Вот, пример исходника LaTeX и PDF, который из него получается.

Дополнение 2008-09-22: Вот более интересные примеры использования Python внутри LaTeX, файл LaTeX и полученный из него PDF. В этих примерах: символические вычисления с помощью sympy, сохранение переменных между вызовами Python, построение графиков с помощью matplotlib.

P.S. Заодно узнал, что есть такая штука, как Sage, пакет для математических расчётов, объединяющий в себе многие разработки с открытым исходным кодом. Очень похоже на Matematica, но в отличие от последней с нормальным, питоническим синтаксисом:) Так вот, Sage тоже можно вызывать прямо из LaTeX (и подставлять в него результаты, картинки и прочее). Это делается пакетом sagetex. Да, кстати, начать пользоваться Sage можно не устанавливая его, а воспользовавшись web-версией. Das ist fantastisch. Google Docs отдыхают.

Ссылки по теме:
Embedding Python in LaTeX
Примеры использования Python внутри LaTeX: симолические вычисления, построение графиков, сохранение результатов
Sage, достойная альтернатива Математике
Пример использования Scheme внутри LaTeX

Этот пост по-английски: Python inside LaTeX (and Sage too)

Визуализация профилей высоты и скорости GPS-треков

Помимо нанесения GPS-трека на карту, одним из наиболее интересных способов его представления является, на мой взгляд, построение графика изменения высоты или скорости движения как функции пройденного расстояния или прошедшего времени. Такие графики я называю «профилями» трека.

Нарисовать такие графики можно, например, воспользовавшись сайтом gpsvisualizer.com. Однако мне не очень нравится иметь их метку на картинке (раз) и не иметь свободного ПО, чтобы проделать это же самое на своём собственном компьютере (два).

Так что предлагаю свой скрипт gpxplot, который строит такие графики по данному GPX-файлу. Прямая ссылка на скрипт: gpxplot.py. Собственно, тут всего две важных особенности:

1) GPX-файл может содержать несколько несвязных треков, каждый из которых может состоять из нескольких «сегментов», поэтому хотелось сохранить возможность показывать их на графике именно как отдельные участки трека.

2) Информации о пройденном расстоянии в GPX-файле нет. Скрипт рассчитывает его в предположении сферической формы земли. Думаю, для большинства приложений этого достаточно.

Будучи запущен без параметров, скрипт просто печатает таблицу с данными по всеми точкам трека. Построить какой угодно график по такой таблице можно в любой программе.

Скрипт может также построить график самостоятельно (с помощью gnuplot). Для этого используется опция -g:
$ ./gpxplot.py -g -x time -y elevation track.gpx
Если модуль python-gnuplot установлен, то картинка появится на экране. Если такого модуля нет, то будет напечатан скрипт для gnuplot. В этом случае запустить gnuplot можно так:
$ ./gpxplot.py -g -x time -y elevation track.gpx | gnuplot -persist -
Как уже, наверное, понятно, -x time указывает откладывать по оси абсцисс время (-x distance — пройденный путь), а -y elevation — откладывать по оси ординат высоту (-y velocity — скорость).

Чтобы сохранить результат в файл, указываем опцию -o имяфайла:
$ ./gpxplot.py -g -x time -y elevation -o track.png track.gpx
Поддерживаются форматы: SVG, EPS, PNG, JPG.

Указать местную временную зону можно опцией -t имя_зоны:
$ ./gpxplot.py -g -t 'Europe/Moscow' track.gpx
В этом случае необходимо присутствие в системе модуля pytz.

Получается примерно так:

пример графика в формате SVG

Может быть, в будущем добавлю всякую раскраску и украшательство графиков. Вероятно, добавлю другие механизмы отрисовки графиков (matplotlib, например). Было бы интересно сделать отрисовку средствами Google Charts (тогда уже и до веб-версии недалеко).

Впрочем, главное назначение скрипта — просто вытянуть из GPX файла данные нужные для построения профилей. Предварительную обработку и фильтрацию треков предлагаю делать с помощью gpsbabel.

Дополнение 2008-10-17: Скрипт заметно обновился, появилась поддержка Google Charts, а также теперь доступна онлайн-версия.

Ссылки:
скрипт для визуализации профилей высоты GPS-треков
Visualizing altitude and velocity profiles of GPS tracks
GPXplot онлайн

20080913

Знакомство с ConTeXt

Разглядывал такую вещь, как ConTeXt. Надстройку над Plain TeX, в некотором смысле альтернативу LaTeX. Достаточно взглянуть на мануал к нему, вот этот или вот этот, чтобы понять, на что он способен. Судя по этим руководствам, некоторые вещи делаются в ConTeXt лучше и проще, чем в LaTeX. Например:
  • размещение илюстраций и таблиц, обтекание их текстом естественны (кто возился с плавающими илюстрациями в LaTeX — знает, чего это стоит там)
  • есть нормально работающая многоколоночная вёрстка (опять же, подводные камни многоколоночной вёрстки в LaTeX на картах широко отмечены)
  • есть возможность вёрстки по сетке (например, возможно сохранение постоянного межстрочного интервала)
  • отложенный вывод материала является стандартным инструментом, а не высшим пилотажем для знатоков, есть возможность создания целой серии документов, использующих общий исходник и общие стилевые настройки (сказывается изначальная ориентация ConTeXt на создание учебных материалов, например, из одного исходника можно сформировать и лекционные записи, и задачник со списком ответов в конце, и решебник с объяснениеми решений, идея понятна)
  • большинство задач, касающихся вёрстки материала, решаемы встренными средствами самого ConTeXt, нет необходимости прибегать к сторонним пакетам (в случае LaTeX иногда имеется по несколько сходных пакетов, разной степени современности и с разными командами/разметкой)
  • есть развитые средства создания интерактивных и гипертекстовых документов
В общем, всё хорошо и интересно. Если не для написания статей, то для личного использования приспособить ConTeXt можно.

Кириллица в ConTeXt вроде тоже должна поддерживаться. Как средствами pdfTeX, так и уникодного XeTeX. Быстренько поставил ConTeXt из репозиториев Debian, решил попробовать. Однако на практике, попытка собрать примеры с русскими буквами в ConTeXt, приводила к появлению на свет PDF, в котором русские слова записаны транслитом. Т.е. вроде и разные кодировки русские понимает, и не ругается, а вот со шрифтами что-то не то. Если кто разберётся с этим зверем — дайте знать.

Решение проблемы с кириллицей. Кажется, найдёно решение проблемы транлитерации русского текста. Эта ошибка в ConTeXt, похоже, появилась недавно и исправление уже есть (думаю, оно попадёт в будущие версии ConTeXt). На данный момент я сделал так:
  • скачал type-one.zip
  • распаковал файл type-one.tex и заменил им файл /usr/share/texmf/tex/context/base/type-one.tex (да, при следующем апгрейде пакета context эта замена пропадёт, по-хорошему надо собрать новый deb-пакет)
После этого стандартный пример
\enableregime[utf]
\useencoding[cyr]
\definetypeface [russian]
[rm] [serif] [computer-modern] [default] [encoding=t2a]
\setupbodyfont[russian,24pt]
\starttext
Немного русского текста для пробы.
\stoptext
сохраняем в файл. Чтобы скомпилировать, запускаем
$ texexec myfile.tex
Результат содержит русские буквы. Выглядят они не лучшим образом, но для начала неплохо:



См. также:
☙ TeX и его варианты

20080903

Простая CMS для AppEngine

Я далёк от серьёзной веб-разработки. Однако довольно регулярно мне приходится делать или браться поддерживать/изменять разные небольшие сайты (до 10–20 страниц). Надо сказать, что готовые решения в этой весовой категории меня ни разу не удовлетворяли.

  • Полноценные CMS всегда оказывались слишком тяжёлые (слишком универсальные) и навязывали слишком сложную (ИМХО) модель и структуру сайта. Их код слишком большой, чтобы можно было что-то быстро под себя переделать. В общем, в программировании я не любитель «отсекать лишнее».
  • Комбинирование языков облёгчённой разметки (Markdown, reST), щепотки PHP и готовых систем шаблонов (вроде Smarty) решало задачу, но требовало решать её каждый раз заново («лепить»).
  • Собственный набор макросов m4 для генерации сайтов был не очень удачен (но «велосипед был вновь изобретён»).
  • Попытки использовать Google Pages или облегчённые вики в качестве движка оставили смешанное чувство (здесь нужно долго и нудно «замазывать»).

В общем, на каникулах развлёк себя знакомством с Google AppEngine (который предоставляет бесплатный и масштабируемых хостинг для веб-приложений), а заодно, в свете того, что нужно сделать очередной мини-сайт, решил сделать для AppEngine простую мини-CMS. Требования у меня к ней были такие:

  • Максимально простая модель сайта: «плоский» сайт из нескольких страниц с автоматически генерируемым «меню».
  • Человек далёкий от веб-разработки должен иметь возможность легко изменять содержимое сайта. Легко — это значит не только «не зная HTML», но и «без страха перед навороченной админкой», и «не зная английского».
  • Должна быть возможность использовать облегчённые языков разметки (Markdown, reST), которые мне кажутся более предпочтительными, чем WYSIWYG-редакторы.
  • Код должен быть достаточно коротким и простым, чтобы понять и изменить его было легко.
  • Доступность бесплатного безрекламного хостинга для динамического сайта:)
В результате пары дней приятных усилий получилось вот что. Дабы подчеркнуть простоту кода (в данный момент это всего 5 кБ), я эту мини-систему управления сайтом нарёк Hello Web. Кое-что ещё надо доработать, но, в целом, уже вполне функциональная вещь. Сам сайт HelloWeb на ней же и работает.

Надеюсь, кому-то кроме меня эта мини-CMS окажется полезна. Лицензия — преданная гуглоанафеме, но свободная и мне симпатичная GNU Affero GPL. Собственно, узнал об этой политике Гугла по отношению к Affero GPL как раз попытавшись завести проект на Google Code. «Ну не хотят, так не хотят,» — решил я, — репозиторий исходного кода был размещён на freeHg.org.

В общем, исправления и дополнения кода приветствуются.