понедельник, 5 декабря 2011 г.

Первая статья на хабре

Опубликовал свою первую статью на хабре. В статье проводится разбор исходного кода утилиты yes из набора GNU Coreutils. Моей целью было посмотреть, как программируют бородатые дядьки на C, чему-то научиться у них. Статью приняли хорошо, намного лучше, чем я ожидал. Многие добавили статью в избранное, что особенно приятно.

четверг, 24 ноября 2011 г.

ANTLR и java.lang.OutOfMemoryError

Если при разработке парсера с помощью ANTLR у вас появилась ошибка java.lang.OutOfMemoryError, то проверьте, нет ли у вас "пустых" правил. То есть таких правил, которые порождают пустые строки. Например, можно сделать ошибку в часто встречаемом правиле для пробелов и табуляций:

WS: (' ' | '\t')*        { $channel = HIDDEN; };

понедельник, 12 сентября 2011 г.

Храним TeX документы в Mercurial репозитории

TeX plus Mercurial

Недавно я переехал с Subversion на Mercurial. И похоже, что добровольно назад не вернусь :). Я действительно проникся той идеей, что поскольку процесс разработки ПО является сам по себе распределённым процессом, то и система контроля версий должна быть распределённой. И ещё тем, что начало работы с VCS должно быть максимально простым. Это позволяет использовать мощь VCS в любом проекте, не задумываясь, как в случае с централизованными системами, окупятся ли усилия по поднятию и/или созданию репозитория. И ещё... а, ладно, на тему CVCS vs. DVCS написано предостаточно ...

вторник, 16 августа 2011 г.

Тормозит Django development server

Django

Буквально ни с того, ни с сего начал жутко тормозить dev-сервер Django. Странички открывались по 5-8 секунд, что было само по себе раздражительным явлением и, кроме этого, очень тормозило разработку.

После первого подхода к гуглению выяснилось, что у некоторых людей dev-сервер тормозил на отдачи статики. Лечится это, по их словам, переносом статики на какой-нибудь взрослый web-сервер. Например, на nginx или даже Apache.

воскресенье, 17 июля 2011 г.

Установка django-photologue в virtualenv

Недавно я встал на путь истины и начал использовать virtualenv в своих Django-поделках. Моё мнение насчёт virtualenv кратко изложено в лирическом отступлении в конце статьи, а сейчас я расскажу о проблемах, с которыми я столкнулся при установке django-photologue в virtualenv под Ubuntu 11.04.

IOError: encoder jpeg not available

Итак, выполнив установив и подключив django-photologue:
virtualenv --no-site-packages gallery && cd gallery
source ./bin/activate
pip install Django PIL django-photologue
# создаём сайт и подключаем в него django-photologue
пытаемся загрузить изображение (photologue.models.Photo), хотя бы даже через административную панель, получаем ошибку
IOError: encoder jpeg not available

суббота, 2 июля 2011 г.

DD не туда? Не беddа!

Он самый
Буквально вчера, в процессе создания установочной USB флешки Ubuntu из под Debian, ко мне явился белоснежный песец в виде команды:
dd if=boot.img.gz of=/dev/sdb1
, которой я хотел записать образ boot.img.gz на флешку.  Но ВНЕЗАПНО оказалось, что флешка находится по адресу /dev/sdc, а /dev/sdb1 - это мой терабайтник со всеми бекапами, архивами фоток, проектов и т.п.

Если вы попали в подобную ситуацию, то читать простыни текста - это меньшее, что вам хочется.  Поэтому сразу решение, которое поправит потерянную ФС (в моём случае это один несистемный раздел ext3):
fsck -t ext3 -y /dev/sdb1
Ну а пока оно работает, можно почитать мою историю...

среда, 27 апреля 2011 г.

GNU Make и автоматическая генерация зависимостей для файлов исходного кода C/C++

Для знающих проблема известная и давно решённая, но я с этим столкнулся только сегодня.

Итак, у нас имеется небольшой проект на C/C++, который собирается с помощью make. Пусть это будет программа под названием «program». В Makefile написано примерно следующее:
OUT = program

CXXFLAGS = -Wall -c -O2

SRC = $(wildcard *.cpp)
# Expand SRC wildcard and replace extension from .cpp to .o
OBJ = $(patsubst %.cpp, %.o, $(SRC))

$(OUT): $(OBJ)
    $(CXX) -o $(OUT) $(OBJ)
Когда мы изменяем какой-нибудь файл исходного кода foo.cpp и собираем проект, всё работает как часы: make замечает изменение foo.cpp, заново его (и только его) компилирует и запускает линковщик. Но make не замечает изменений в заголовочном файле foo.h, который подключается из foo.cpp.