Генераторы сериализаторов-десериализаторов.
Меня немного удивляет существование protocol buffers, и еще больше удивляет, когда кроме них изобретают еще и Apache Thrift, а потом еще и https://capnproto.org/ и https://google.github.io/flatbuffers/.
Все эти протоколы подразумевают, что система разрабатывается одной и той же командой (или двумя тесно взаимодействующими) с обоих сторон, что типы передаваемых меняются достаточно синхронно, т.е. что протокол за 2-3 итерации не превратится во что-нибудь вроде "у нас тут 100 опциональных полей на каждый случай жизни".
А вот генератора парсеров на случай "протокол дали ембеддеры-психи, засунув в 8 бит 2 флага и 2 поля по 3 бита с длиной дополнительных данных в пакете" или "обвязка протокол описана в виде ABNF в RFC, а в payload опять поселились эмбеддеры с бинарными форматами" я чего-то не видел.
Все эти протоколы подразумевают, что система разрабатывается одной и той же командой (или двумя тесно взаимодействующими) с обоих сторон, что типы передаваемых меняются достаточно синхронно, т.е. что протокол за 2-3 итерации не превратится во что-нибудь вроде "у нас тут 100 опциональных полей на каждый случай жизни".
А вот генератора парсеров на случай "протокол дали ембеддеры-психи, засунув в 8 бит 2 флага и 2 поля по 3 бита с длиной дополнительных данных в пакете" или "обвязка протокол описана в виде ABNF в RFC, а в payload опять поселились эмбеддеры с бинарными форматами" я чего-то не видел.
no subject
no subject
no subject
Ну да, и перечисленные условия - довольно частая и обыденная вещь, когда разным частям одной системы надо общаться. Для таких ситуаций и делаются.
В эрланге и эликсире весьма удобно сделан парсинг таких бинарных данных. А в других языках как-то ничего сразу на ум не приходит, да. Все привыкли текст парсить.
no subject
никаким Wireshark нельзя закапчурить и пропарсить... =( прямо вот СИЛЬНО бесит
no subject
no subject
let (|Digits|) (b:byte) = decimal(b >>> 4), decimal(b &&& 0x0Fuy)
let (|DecNums2|_|) (Digits (b1,b2)) = if b1<10m && b2<10m then Some(b1,b2) else None
let (|SignComa|) x =
let coma = (x &&& 0b111uy ) |> decimal
let sign = if (x >>> 7) = 0uy then 1m else (-1m)
sign, coma
что бы потом сказать что-то вроде
let (|Bcd6|_|) = function
| SignComa(sign,coma)::
DecNums2(d'100'000,d10'000)::DecNums2(d1000,d100)::DecNums2(d10,d1)::_ ->
Some( sign*(d'100'000*100000m + d10'000*10000m + d1000*1000m + d100*100m + d10*10m + d1 )/( pow 10m coma ) )
| _ -> None
а по другому хз как
no subject
no subject
no subject
no subject
В зеркало посмотри.
no subject
no subject
no subject
no subject
ну да, микросервисы типа
no subject
Рэбе, ну елки-палки - http://broadcast.oreilly.com/2009/03/the-power-of-erlang-bit-syntax.html
no subject
type X = { A : int }
и попытаться считать
type Y = { A : int }
то будет БинариФорматЭксепшн.
no subject
no subject
no subject
no subject
no subject
никаким Wireshark нельзя закапчурить и пропарсить... =( прямо вот СИЛЬНО бесит
no subject
А если надо с чем то снаружи общаться, то все равно ничего кроме json нет
no subject
no subject
no subject
Ну и более новые протоколы умеют больше - контейнеры там всякие вроде map/list/set, и вроде чуть-чуть эффективнее.
no subject
никаким Wireshark нельзя закапчурить и пропарсить... =( прямо вот СИЛЬНО бесит
no subject
no subject
http://thesz.livejournal.com/672967.html
Разборщики не так уж беспомощны, надо сказать.
no subject
погуглить нынче это не тот скилл которым стоит хвастаться перед незнакомыми лично вам людьми =)
так что повторю свою точку зрения
protobuf
весьма неприятная штука для отладки клиент серверных взаимодействий
no subject
Какие бинарные варианты более удобны для отладки на ваш взгляд?
no subject
бинарность тут в общем то не принципиальна, с точки зрения отладки
no subject
no subject
no subject
ну я не думаю что алгоритм на каком нибудь Си будет проще (двоично-десятичное число из шести цифр):
надеюсь, это менее ужасно