metaclass: (Default)
[personal profile] metaclass
Меня немного удивляет существование protocol buffers, и еще больше удивляет, когда кроме них изобретают еще и Apache Thrift, а потом еще и https://capnproto.org/ и https://google.github.io/flatbuffers/.

Все эти протоколы подразумевают, что система разрабатывается одной и той же командой (или двумя тесно взаимодействующими) с обоих сторон, что типы передаваемых меняются достаточно синхронно, т.е. что протокол за 2-3 итерации не превратится во что-нибудь вроде "у нас тут 100 опциональных полей на каждый случай жизни".

А вот генератора парсеров на случай "протокол дали ембеддеры-психи, засунув в 8 бит 2 флага и 2 поля по 3 бита с длиной дополнительных данных в пакете" или "обвязка протокол описана в виде ABNF в RFC, а в payload опять поселились эмбеддеры с бинарными форматами" я чего-то не видел.

Date: 2015-09-02 03:18 pm (UTC)
From: [identity profile] mikkim08.livejournal.com
А это (https://github.com/scodec/scodec) ?

Date: 2015-09-02 03:34 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
генератор парсера SMS в формате PDU

Date: 2015-09-02 03:38 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
>Все эти протоколы подразумевают, что..

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

В эрланге и эликсире весьма удобно сделан парсинг таких бинарных данных. А в других языках как-то ничего сразу на ум не приходит, да. Все привыкли текст парсить.

Date: 2015-09-02 05:05 pm (UTC)
From: [identity profile] binf.livejournal.com
ViewPatterns of Haskell - не?

Date: 2015-09-02 06:12 pm (UTC)
From: [identity profile] clayrat.livejournal.com
для скалы есть http://scodec.org/

Date: 2015-09-03 08:10 am (UTC)
From: [identity profile] grey-kristy.livejournal.com
ну да, именно так.
А если надо с чем то снаружи общаться, то все равно ничего кроме json нет

Date: 2015-09-03 01:12 pm (UTC)
From: [identity profile] thesz.livejournal.com
Я как-то проводил проверку производительности разбора двоичных данных (чисел Голомба) на Хаскеле с его комбинаторами и на Эрланге.

http://thesz.livejournal.com/672967.html

Разборщики не так уж беспомощны, надо сказать.

Date: 2015-09-02 03:42 pm (UTC)
From: [identity profile] slach.livejournal.com
а меня вот сильно бесит что этот самый protobuf
никаким Wireshark нельзя закапчурить и пропарсить... =( прямо вот СИЛЬНО бесит

Date: 2015-09-02 04:38 pm (UTC)
From: [identity profile] andrey yunoshev (from livejournal.com)
Для wireshark разве нельзя написать плагин который отображает любие бинарные данные в нужном виде? Хотя ладно написав вопрос сам погуглил - https://code.google.com/p/protobuf-wireshark/

Date: 2015-09-03 02:25 pm (UTC)
From: [identity profile] slach.livejournal.com
ну вы попробуйте воспользоваться этим плагином, потом ссылки кидайте =)
погуглить нынче это не тот скилл которым стоит хвастаться перед незнакомыми лично вам людьми =)

так что повторю свою точку зрения
protobuf
весьма неприятная штука для отладки клиент серверных взаимодействий

Date: 2015-09-03 02:32 pm (UTC)
From: [identity profile] andrey yunoshev (from livejournal.com)
Более неприятная чем другой бинарный формат? Или столь же неприятная как любой бинарный формат?

Какие бинарные варианты более удобны для отладки на ваш взгляд?

Date: 2015-09-03 03:41 pm (UTC)
From: [identity profile] slach.livejournal.com
любые, которые можно легко посмотреть каким то распостраненным сниффером =)
бинарность тут в общем то не принципиальна, с точки зрения отладки

Date: 2015-09-02 03:49 pm (UTC)
From: [identity profile] vit-r.livejournal.com
Они выходят такими убогими, что никто не хочет демонстрировать результат ;-)

Date: 2015-09-02 04:36 pm (UTC)
From: [identity profile] binf.livejournal.com
очень ок делать это на актив-паттернах. например

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


а по другому хз как

Date: 2015-09-02 08:51 pm (UTC)
From: [identity profile] aamonster.livejournal.com
Пентаграмму нарисовать забыли.

Date: 2015-09-04 10:04 am (UTC)
From: [identity profile] aamonster.livejournal.com
Ну это большое страшное заклинание же должно было вызвать демона?

Date: 2015-09-04 05:53 pm (UTC)
From: [identity profile] binf.livejournal.com
))
ну я не думаю что алгоритм на каком нибудь Си будет проще (двоично-десятичное число из шести цифр):
let (|Digits|) b =  
    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 = decimal (x &&& 0b111uy )  
    let sign = if (x >>> 7) = 0uy then 1m else (-1m) 
    sign, coma 
 
let (|Bcd6Float|_|) bcd =             
    match Seq.toList bcd with  
    |   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


надеюсь, это менее ужасно

Date: 2015-09-02 05:17 pm (UTC)
From: [identity profile] ilya-portnov.livejournal.com
У нас есть инхаус-решение для этого, самописное. Описываем внешний формат, и по нему генерится парсер и сериализатор. Только вот делали его, похоже, люди с GUI головного мозга, поэтому основной способ описания формата — мышкой в замысловатых кривоватых редакторах. Ну или можно открыть сохранённое описание и править руками — но оно хранится в адовой структуры XML-е...

Date: 2015-09-03 06:39 am (UTC)
From: [identity profile] worm-ii.livejournal.com
Описываем формат "адовой структуры XML-я", по нему генерим парсер, из которого можно уже сделать сериализатор в правильную структуру :-)

Date: 2015-09-02 05:18 pm (UTC)
From: [identity profile] besm6.livejournal.com
> ... я чего-то не видел

В зеркало посмотри.

Date: 2015-09-02 05:24 pm (UTC)
From: [identity profile] tzirechnoy.livejournal.com
Ну, насчёт кроме них удивлять должно слабо -- посмотрел я тут внутрь protobuf. Написано относительно идиоматично, но херово по скорости да и по дуракоустойчивости.

Date: 2015-09-02 07:16 pm (UTC)
From: [identity profile] binf.livejournal.com
не понятно что значит "идеоматично", но логика алгоритмов конвертирования там дебильная. Явно хипстеры писали. Например, если записать структуру типа

type X = { A : int }

и попытаться считать

type Y = { A : int }

то будет БинариФорматЭксепшн.

Date: 2015-09-02 05:58 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
По мне так pb - туфта.

Date: 2015-09-02 06:14 pm (UTC)
From: [identity profile] clayrat.livejournal.com
>система разрабатывается одной и той же командой (или двумя тесно взаимодействующими) с обоих сторон
ну да, микросервисы типа

Date: 2015-09-02 06:38 pm (UTC)
From: [identity profile] b00ter.livejournal.com
> "протокол дали ембеддеры-психи, засунув в 8 бит 2 флага и 2 поля по 3 бита с длиной дополнительных данных в пакете"

Рэбе, ну елки-палки - http://broadcast.oreilly.com/2009/03/the-power-of-erlang-bit-syntax.html

Date: 2015-09-02 08:01 pm (UTC)
From: [personal profile] zaharchenko
А может и хорошо что нет, а то лишний повод был бы своё накопленное городить

Date: 2015-09-03 07:59 am (UTC)
From: [identity profile] slach.livejournal.com
а меня вот сильно бесит что этот самый protobuf
никаким Wireshark нельзя закапчурить и пропарсить... =( прямо вот СИЛЬНО бесит

Date: 2015-09-03 08:26 am (UTC)
From: [identity profile] dmitry shamov (from livejournal.com)
Да на самом деле почему нет какого нибудь языка описания протокола (я возможно просто о нем не знаю)? Тогда по нему можно и генерить сериализатор, десериализатор.

Date: 2015-09-03 08:27 am (UTC)
From: [identity profile] dmitry shamov (from livejournal.com)
И кстати расскажите почему протобуф туфта. Я как раз тут думал для одного поделия что лучше использовать....

Date: 2015-09-03 08:32 am (UTC)
From: [identity profile] metaclass.livejournal.com
Оно не туфта, просто поддержка версионности в проектах у которых циклы выпуска новых версий клиентской и серверной части отличаются будет ломать мозг.
Ну и более новые протоколы умеют больше - контейнеры там всякие вроде map/list/set, и вроде чуть-чуть эффективнее.

Date: 2015-09-03 10:36 am (UTC)
From: [identity profile] slach.livejournal.com
а меня вот сильно бесит что этот самый protobuf
никаким Wireshark нельзя закапчурить и пропарсить... =( прямо вот СИЛЬНО бесит

Date: 2015-09-04 06:27 am (UTC)
From: [identity profile] perdakot.livejournal.com
Думается, что язык описания бинарного формата, если он будет сколько-нибудь общим, будет таким же сложным как С++. А если он будет не общий, то он не будет поддерживать "2 флага и 2 поля по 3 бита". То есть считай, что С++ и есть язык описания формата.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 23rd, 2025 03:58 pm
Powered by Dreamwidth Studios