Sunday, January 8, 2017

Краткое изложение Policode

Имел глупость опубликовать описание Поликода на некоторых русскоязычных форумах и получил массу негативного фидбэка.
Как я понял, основная причина в том, что я недостаточно кратко и структурированно описал, что такое Поликод и для чего он нужен.
Поэтому я подготовил вот такое краткое тезисное описание.

Тезисы 

Предлагается формат для хранения текста в файлах и передачи по сетям.
Внутри приложений он преобразуется в какое-то внутреннее представление, которое никак не описывается данным форматом.

1. Вместо фиксированных кодов символов из диапазона 0..0x10ffff вводятся имена переменной длины, количество которых не лимитировано.

2. Вводятся пространства имен — алфавиты (латиница, польский, древнеславянский).
Один и тот же символ может иметь разные смыслы в разных алфавитах.
Алфавиты также задаются именами их может быть сколько угодно.

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

  • разные семантические операции,
  • сортировку,
  • озвучивание разными голосами,
  • визуализацию разными шрифтами и т. д.

Алфавиты могут определяться с нуля или расширять какие-то другие алфавиты.
Например "Древнегерманский" наследует у "Германского", который в свою очередь наследует у "Латиницы". Текст начинается с имени, например, древнегерманского алфавита, и за которым идет последовательность имен символов.
И эти имена вначале ищутся в древнегерманском алфавите, если не найдены — в современном германском, если их нет и там, в общелатинском.

Символ опознанный алфавитом отображается и обрабатывается этим алфавитом.
Алфавит может трактовать символ как отображаемый, модифицирующий или управляющий.

Текст может состоять из множества фрагментов, написанных разными алфавитами.

Символ не опознанный алфавитом отображается дефолтным (fail-safe) рендерером.
Это возможно потому, что имена символов — это не строки текста, а команды рисования.
В вышеприведенном примере на моем компьютере была установлена только общелатинская культура, поэтому я увижу:
— пометку, что текст древнегерманский,
— обычные латинские буквы,
— несколько странных угловатых древнегерманских букв (отображенных дефолтным рендерером).

3. Имена символов являются командами рисования и задают их внешний вид, и для этого существует две нотации:
— условное грубое начертание — оно компактно и пригодно для 99% случаев,
— полиграфически аккуратное начертание — позволяет кодировать многоцветные комбинации полигонов, заданных сплайнами, но занимает немного больше места.

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

4. Нет централизованного управляющего комитета. Любой человек может создать свой символ и придумать свой алфавит, дающий новый семантический смысл существующим символам.
На тех устройствах, где этот алфавит не поддержан или этот символ неизвестен, он все равно будет отображаться.

5. Работа с именами символов вместо кодов — затратное дело. Они занимают много памяти, и их приходится искать в хеш-мапах.
Поэтому существет таблица на 252 элемента, которая строится автоматически в процессе парсинга текста.
Благодаря этой таблице последние 252 символа или имени языковой культуры использованные в тексте могут быть закодированы одним байтом и обработаны без поиска текстовых строк.

Все детали и технические подробности можно найти в оригинальном посте

Monday, November 28, 2016

Игры, которые играют нами. История Рокмана

Часть первая, 1989 год.

27 лет назад компьютеры были большими, программы - маленькими, cоюз - нерушимым, а я - повернутым на компьютерах школьником-старшеклассником.
Наш школьный компьютерный класс состоял из Агат-7 - неудачных "аналогов" Apple II.
Агат-7
Игр для него было исчезающе мало, поэтому мы писали их сами (что есть хорошо: многие стали программистами).
Я уже написал игру а ассемблере про какого-то робота в лабиринте и ходил гоголем (возняком?), снисходительно поглядывая на одноклассников, искавших на клавиатуре any key.

Sunday, June 21, 2015

Чехол-геймпад для телефона

Собственно все описывается одной картинкой
На задней панели удобно располагаются несколько кнопок, на верхней панели - шифты под большие пальцы.
Андроид и iOS игры (и эмуляторы консолей) страдают  от отсутствия аппаратных кнопок.
Раскладные, выдвижные и пристегивающие геймпады ломают идею портативности. А такой чехол... я бы купил :-)

Saturday, June 20, 2015

Чем плох Юникод и как его можно улучшить.

Предлагается замена Юникоду - новый формат кодирования текста со следующими свойствами:
  • Кодирует все теоретически возможные виды символов.
  • Не требует централизованного стандартизирующего органа.
  • Позволяет увидеть текст на любом языке даже при отсутствии подходящих шрифтов.
  • Раздельно сохраняет визуальную и лингвистическую информацию о символах, позволяя приложениям игнорировать те части, которые им не нужны.
  • Позволяет включать в текст индивидуальные авторские символы и рисунки.
  • Обратно совместим с ASCII.
  • Поддерживается всеми приложениями, которые работают с однобайтными строками с 0-терминированием.
  • Может быть конвертирован из Юникода без ограничений и конвертирован в Юникод в той части, которая поддерживается Юникодом.
  • Обеспечивает быстрое декодирование во внутренний формат приложений и быстрое кодирование.
  • Компактен.

Под катом - детали и пример реализации.

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