Tuesday, June 17, 2014

Простой эффективный логгер на C++

Проект начинается с логгера

Хотя... некоторые проекты логгером и заканчиваются :-)

Обычно начинающие кодеры полагают, что логгер не нужен. Ведь приложение можно погонять под отладчиком. 
Ну что сказать, отладчик вешь хорошая, пока не придется отлаживать многопоточные приложения с проблемами временнОй синхронизации. Или ставить приложения на платформу, где отладка затруднена. Или получать от заказчика невнятное: "У вас не работает", вместо лога с регулируемой детализацией.

Есть еще одно заблуждение, что достаточно понатыкать в код что-то подобное: 
std::out << "message";
OutputDebugStr("message");

Почему это не катит? Потому что логгер это не только простой вывод сообщений куда-то, логгер должен решать множество задач.

Какие задачи решает логгер:

  • Фильтрация (какие сообщения показывать, а какие блокировать)
  • Форматирование (текстовое представления разнотипных данных)
  • Атрибутирование (добавление в лог маркеров, упрощающих анализ)
  • Буфферизация (накапливание фрагментов сообщения в для ускорения работы)
  • Вывод.

Thursday, June 5, 2014

C/C++. Парсер и калькуллятор выражений, заданных текстовой строкой

Выражения состоят из double-констант, операторов +-*/ и скобок.
Ловятся синтаксические ошибки. Результат выдается в double.
38 строк исходного текста - просто, прямолинейно, расширяемо, без использования сторонних библиотек.
in english

Sunday, February 23, 2014

Бинарный формат для сериализации объектов

Я уже пару месяцев использую CatML для сохранения данных приложения в файлы, передачи объектов по сети и даже для дампа объектов в лог.
Формат хорош. В своих проектах я отказался от XML/Json/Yaml и не жалею.
Но с ростом объемов данных все более заметными становятся фундаментальные недостатки текстовых форматов:
- они избыточно-огромные,
- они долго записываются и еще дольше парсятся.

Поэтому, в общем, вот новый бинарный формат BinaryCatML.

  • Он однозначно конвертируется в текстовый CatML и обратно. Для этого есть консольная утилитка. Вы можете открыть бинарный файл, просмотреть его содержимое, если надо исправить в любом текстовом редакторе и уаковать обратно в бинарный вид.
  • Как и текстовый CatML, он имеет в себе всю метаинформацию и умеет кодировать произвольные графы объектов. 
  • Он разумно компактен. Любое имя поля, имя структуры или объект присутствуют в файле ровно один раз. Это не компрессия, компрессия - убирает избыточность, а BinaryCatML просто не вносит ненужной избыточности.
  • Он быстро записывается и быстро загружается. Все идентификаторы - стркутур, объектов - просто индексы в массивах. Никих look-up-ов в словари, никаких сравнений текстовых строк.
  • Кодек по минимуму использует память и может работать даже на очень слабых устройствах.
  • Он не зависит от разрядности или порядка байт архитектуры, в нем нет ни одного зашитого в формат ограничения.
  • Его кодек занимает меньше 300 строк на Java и может быть портирован на любой язык буквально за день.

Sunday, November 24, 2013

В поисках идеальной клавиатуры - 2. Вверх ногами.

Отличия от предыдущей модели:
  • Клавиатура плоская и горизонтальная, пальцам удобнее нажимать сверху вниз.
  • Для переключения регистров будет двигаться не корпус клавиатуры, а ладонь, лежащая на рычажке. Тогда единственным элементом, имеющим инерцию будет сама рука, что мало отличается от обычных клавиатур.

Saturday, November 23, 2013

Английский язык: Нуб для нубов.

Краткая шпаргалка по построению английских предложений.

Thursday, October 24, 2013

Текстовое представление объектов

Почему XML и JSON – плохо, и как сделать хорошо.

Краткое резюме:

  • XML, JSON, YAML, SDL – плохо пригодны для описания произвольных иерархий типизированных объектов.
  • Но теперь у нас есть альтернативный формат CatML:
    • простой,
    • интуитивно понятный,
    • не допускающий неоднозначности,
    • удобный для парсинга,
    • кодирующий и строго типизированные данные,
    • кодирующий перекрестные ссылки,
    • кодирующий глобально именованные объекты и ссылки на них.
  • Можно прямо сейчас скачать и использовать его енкодер и декодер для Java, который поддерживает:
    • сериализацию объектов
    • и DOM-like способ доступа.
  • Java-библиотека занимает около 1 тыс. строк и может легко портироваться на любой язык.
Скачать Библиотеку энкодера и декодера CatML