Алексей Махоткин

домашняя страница

Bash History в терминале Mac OS X

Для Mac OS X оказалось очень удобно поместить в ~/.bash_profile две строчки:

export HISTFILE=~/.bash_history-`tty | sed -e 's/\/dev\///'`
export HISTCONTROL=ignoreboth

Первая строчка делает так, что у bash’ей из разных табов стандартного Terminal теперь будут раздельные файлы с историей команд.

Вторая строчка делает так, чтобы в history не сохранялись а) команды, начинающиеся с пробела (полезно для так или иначе опасных команд) и б) дублирующиеся команды.

Теперь после рестарта компьютера и открытия терминала мы получаем полностью сохранившийся контекст: текущие каталоги, выдачу команд до перезагрузки, а также полную историю каждого окна.

Полезный пример использования Git Stash и Git Diff

В посте ”The second-order-diff Git trick” излагается полезный пример использования git stash.

Вносим массовые изменения в дереве. Если все ок, то делаем git commit, если не все ок — то делаем git stash (а вовсе не git reset, как сделали бы многие). Состояние дерева откатывается до исходного. Вносим исправленные массовые изменения в дереве. Теперь мы можем сказать git diff stash@{0} и увидеть, чем отличаются друг от друга два результата массовых изменений.

Trinity: Fuzz-тестирование системных вызовов Linux

Очень интересный проект Trinity предназначен для fuzz-тестирования системных вызовов ядра Linux.

Каждый системный вызов аннотирован информацией об аргументах системного вызова — например, является ли аргумент набором флагов, адресом памяти или номером файлового дескриптора. При работе Trinity генерирует случайные входные данные для каждого известного syscall, и вызывает его. Так как структура аргументов известна, то эффективность тестирования существенно выше, чем при использовании наивного тестирования, которое просто генерирует случайные числа и скармливает их ядру. Например, можно особое внимание уделить адресам памяти, которые находятся рядом с четырехкилобайтными границами страниц, чтобы отлавливать ошибки off-by-one.

Практика, описанная в статье ”LCA: The Trinity fuzz tester” на прекрасном ресурсе LWN.net, демонстрирует интересные результаты. За 2012 год только сам автор обнаружил больше 150 багов в ядре. Еще больше багов нашли другие пользователи системы. Помимо багов в коде системных вызовов, были обнаружены различные проблемы с сетевой и дисковой подсистемами, а также в многочисленных драйверах. При тестировании системного вызова execve также можно очень быстро обнаружить множество ошибок в системных утилитах, которые запускаются со случайными аргументами командной строки (и падают от того).

В планах автора, помимо прочего — улучшение работы с системным вызовом ioctl, который в силу своей природы традиционно неряшлив — как по структуре (диспетчеризация через номер запроса), так и в силу того, что в коде для работы с оборудованием сложно обработать все возможные варианты.

Кабаний лес

Один из эпизодов романа Ши Найаня «Речные заводи». Обработка Ши Хуана. Рисунки Бу Сяо-хуая.

Издательство литературы на иностранных языках. Пекин, 1960 г. Отпечатано в Китайской Народной Республике.

PDF: kaban.pdf

PDF Metadata в Unicode

Метаданные (такие, как Author, Title и т. п. — видны в Document Properties) в стандарте PDF хранятся в совершенно ужасном формате.

Например, информация об авторе будет записана так:

/Author (...)

Вместо многоточия будет написано собственно имя, в виде строки байтов в одном из двух основных вариантов: Latin1 или Unicode.

Если ваша строка помещается в Latin1, то достаточно записать вместо многоточия сроку в этой кодировке, нужно только искейпить (добавив backslash) как минимум скобки и backslash (tiff2pdf искейпит еще несколько символов: возможно, от ужаса или для обратной совместимости неизвестно с чем).

Если ваша строка требует более полного Unicode, то вам придется сконструировать байтовую строку, состоящую из: а) BOM (Byte-Order Mark) в big-endian UTF-16; б) собственно текста в big-endian UTF-16. После этого нужно еще раз пройтись по этой байтовой строке, и искейпить в ней скобки и backslash (да, прямо «внутри» UTF-16BE). Полученную байтовую строку можно поместить внутрь скобок.

Удивительно здесь, что стандарт требует big endianness, и одновременно с этим требует указывать BOM. Казалось бы — с помощью BOM можно было бы совершенно стандартно поддержать UTF-16BE, UTF-16LE и UTF-8!

Я написал несколько патчей, которые исправляют поддержку Unicode в tiff2pdf.

Алгоритмы и структуры данных

Масштабируемые и высокопроизводительные веб-приложения, гл. II

Алгоритмы и структуры данных

Вычислительная сложность

Вычислительная сложность — базовое понятие алгоритмической теории. Вычислительная сложность алгоритма — это попросту оценка количества операций, требуемых для достижения результата, в зависимости от количества обрабатываемых элементов. Чаще всего встречаются такие виды вычислительной сложности: константная, логарифмическая, линейная, квадратичная, экспоненциальная и факториальная. Каждая следующая — «хуже» предыдущей. Вычислительная сложность обозначается как O(…) (читается «O-большое»).

Протокол HTTP

Клиенты (то есть браузеры или роботы) общаются с веб-серверами именно по протоколу HTTP. Тонкие детали работы HTTP и его взаимодействия с нижними и верхними слоями технологии — один из ключей к высокой производительности.

Subversion Moves to ASF; Predicting Bugs; Updated SCM-Comparison.

I’ll try to restart the version control blog with a new digest format.

Ben Collins-Sussman announced that Subversion makes transition under the wings of Apache Software Foundation. We also learn that Ben is Mercurial user now, at least for open-source projects :)

Jim Whitehead “Predicting bugs in code changes using SCM information” describes the experiment to try and predict bugs location, using historical information from SCM.

Our own SCM Comparison was updated to the recent master copy from Better SCM Initiative.

Full text of “Pro Git” book by Scott Chacon is available online: progit.org.