Saturday, August 2, 2014

В поисках идеальной клавиатуры 3. Аккорды.

Посвящается Дагласу Энгельбарту,
изобретателю мышки, гипертекста,
форумов и аккордной клавиатуры.



Это третья статья про клавиатуру.
Все статьи этой темы собраны тут: http://0x8d.blogspot.com/search/label/Klava

Мои почти полугодовые опыты с разными компоновками джойстико-клавиатур привели меня к мысли, что удобную и быструю клавиатуру таким способом не сделать.
  • Джойстик засунутый под ладонь заставляет двигаться всю руку, существенно замедляя набор.
  • Джойстик размещенный под каждым пальцем заставляет пальцы двигаться во всех направлениях,  что неестественно, и потому приводит к быстрой усталости и множественным ошибкам набора.
Оказалось, что пальцы любят двигаться вдоль своей оси. Сгибаться и разгибаться. При этом основное усилие они развивают на сгибании (Сюрприз :-).

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

Пробема в том, что у нас всего десять пальцев, а символов на стандартной  клавиатуре около ста, и всем символам пальцев не хватит.

Решение есть: пусть каждый символ вводится аккордом - одновременным нажатием нескольких кнопок.


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 и может быть портирован на любой язык буквально за день.