- 1
- 2
- 3
- 4
- 5
- 6
- 7
case DEBUG_VAR__SIMPLE_TYPE_BOOL:
b = (bool *)(item->ptr);
if (0 != strncmp(var->var_s, "0", 2) && 0 != strncmp(var->var_s, "1", 2)) {
ERROR("Value of %s is not boolean (%s)", name, var->var_s);
return false;
}
*b = (var->var_s[0] == '0') ? 0 : 1;
Все, что вам нужно знать о формате Protobuf.
Предыстория: нужно используя Протобаф переслать значение которое может быть либо строкой, либо числом, либо логической переменной.
Варианты решения:
1. Создать message с опциональными полями - аналог сишного union.
2. Придумать формат в котором в одно поле будет записываться тип пересылаемого значения, а в другое - неведомая херня, которую потом динамически проверять.
LispGovno 26.06.2016 20:05 # +1
cykablyad 26.06.2016 20:17 # +1
roman-kashitsyn 26.06.2016 21:33 # 0
roman-kashitsyn 26.06.2016 22:50 # 0
Шаблон tagged string?
wvxvw 26.06.2016 23:39 # 0
kurwa 26.06.2016 23:41 # 0
bormand 26.06.2016 22:54 # 0
wvxvw 26.06.2016 23:49 # +1
Конкретно с этим сервером работают еще клиент на Питоне, и вот я сейчас ваяю на Го. Возможно есть какие-то проблемы на стороне Питона, которые не позволяют сделать one-of / optional. После охуительной поддержки и продуманости трифтовских реализаций я уже ничему не удивляюсь.
На правах истроической справки: когда-то давно, когда ЯСОН все еще был только в проекте, прогрессивное человечество спорило о лучшем формате передачи данных в интернете. АМФ все еще был вполне реальной альтернативой. Разница между АМФ и Протобаф принципиально в том, что АМФ содержит метаданные которые позволяют из бинарника восстановить информацию в большинстве случаев без наличия исходников. Протобаф - посчитали что на метаданных можно сэкономить (типичная логика си/сиплюсплюс). А еще они сэкономили на записи длины сообщения. Зато теперь, если формат даже капельку поменялся - можно днями его разгадывать.
bormand 26.06.2016 23:52 # 0
wvxvw 27.06.2016 08:17 # 0
Например, типичные оптимизации которые можно сделать в бинарном формате: использовать специальную технику кодирования интов / даблов которая, при условии, что используются только младшие байты будет использовать меньше места (микрооптимизация), или вместо того, чтобы записывать повторяющиеся элементы столько раз, сколько они повторяются, второй и все последующие разы записывать ссылку (рассчитывая на то, что парсер будет создавать ссылки таким же образом как и генератор).
Таким образом АМФ, например может даже выигрывать у Протобаф если нужно посылать много однотипных данных не смотря на то, что посылает метаданные вместе с данными.
guesto 27.06.2016 04:52 # 0
Как же заебал этот ламерский пиздеж, ты небось еще и на рест дрочишь, и соап ненавидишь. И си сюда приплел ни к месту. Причем тут си? Выключай уже бредогенератор свой.
wvxvw 27.06.2016 08:20 # 0
kurwa 27.06.2016 10:59 # 0
dxd 27.06.2016 11:37 # 0
CHayT 27.06.2016 11:49 # 0
dxd 27.06.2016 12:04 # 0
CHayT 27.06.2016 12:10 # +1
Сервер должен уметь во все поддерживаемые версии схемы: клиент запрашивает нужную версию, если она ещё поддерживается, то начинается общение, иначе его посылают.
kurwa-nextgen 27.06.2016 12:47 # +2
CHayT 27.06.2016 13:00 # 0
CHayT 27.06.2016 13:18 # 0
dxd 27.06.2016 13:22 # 0
CHayT 27.06.2016 13:30 # 0
Обобщённый интерфейс управления всем этим.
guesto 27.06.2016 13:32 # 0
CHayT 27.06.2016 13:34 # 0
roman-kashitsyn 27.06.2016 14:33 # +4
Пахнуло Швецией и Эриксоном.
CHayT 27.06.2016 14:41 # +2
roman-kashitsyn 28.06.2016 10:04 # +4
Почему все пишут мою фамилию неправильно?
цын же по правилам
kurwa 28.06.2016 10:54 # −3
roman-kashitsyn 28.06.2016 11:01 # +1
Т.е. ты считаешь, что на цы только одно правило?
Т.е. нужно писать лисицин хвост и царицины глаза?
Гугли суффиксы притяжательных прилагательных.
http://rus.stackexchange.com/questions/115/Окончание-фамилий
CHayT 28.06.2016 10:57 # +2
roman-kashitsyn 28.06.2016 11:03 # 0
Давайте не будем называть его Олегом, я всё время путаю с Олегом Киселёвым.
3_14dar 28.06.2016 11:10 # 0
wvxvw 28.06.2016 13:15 # 0
guestinho 29.06.2016 22:48 # +1
wvxvw 27.06.2016 12:04 # 0
И не путайте метаданные со схемой: метаданные нужны для того, чтобы убедится в том, что данные были записаны и приняты в соответствии с форматом передачи данных. Схема нужна для того, чтобы описать логику на уровень выше - там где только подмножество допустимых данных можно обработать.
Если пересылать данные без метаданных вообще - то прочитать их вообще нет возможности (т.как никто не знает когда данные закончатся), т.е. как минимум нужна длина (это пример минимальных метаданных).
Но на единицу длины мы имеем факториал единиц вореций пересылаемой информации. Т.е. зная длину мы все равно с вероятностью 1-n/n! можем получить мусор. Если мы, например, добавим еще какие-нибудь метаданные, например, выравнивание, то мы уменьшим процент мусора, и т.д.
Другой пример: апи без метаданных становится доступен злоумышленнику - тут же просто раздолье для ДДОС. С метаданными это на много сложнее.
CHayT 27.06.2016 12:19 # 0
Это ты про фрейминг так витиевато говоришь? Ответ: не все транспортные протоколы одинаково уёбищны.
3_14dar 27.06.2016 12:46 # 0
CHayT 27.06.2016 12:53 # 0
Но вообще, про фрейминг это была самая очевидная догадка, так-то я вообще не врубился в тот пост.
3_14dar 28.06.2016 11:12 # −4
dxd 28.06.2016 12:17 # +4
- Здра-а-а-а-вствуй, пидар!
3_14dar 28.06.2016 13:07 # −6
inkanus-gray 28.06.2016 14:57 # +6
3_14dar 28.06.2016 16:46 # 0
Как там ваш пиздотп натуется, кстати?
guestinho 28.06.2016 18:17 # +4
а премьер министр вообще нихуя знать не должен
3_14dar 28.06.2016 23:33 # 0
bormand 29.06.2016 17:32 # 0
А если он сам не знает - должен попросить спецов, чтобы объяснили, чем всё это закончится... Ну это в теории.
Ибо тут они и на мнение опсосов, яндекса и мейлрушечки из принципа положили большой хуй.
3_14dar 29.06.2016 21:36 # +2
Собственно, народ-гной, народ-пидар, народ-хуесос большего и не заслуживает.
inkanus-gray 29.06.2016 21:56 # +3
3_14dar 29.06.2016 22:30 # −1
inkanus-gray 29.06.2016 22:36 # +3
wvxvw 27.06.2016 12:59 # 0
Для того, чтобы сделать это более конкретным.
Вот у нас есть сообщение: { a: 1, b: "x", c: true }.
1. Вариант без метаданных: записываем 4 байта int32, 2 байта на строку (с нуль-байтом в конце) и 1 байт на булеан.
1.1. Сервер решил по какой либо причение прислать еще значение 42 после c: true - что делать клиенту? Выбрасывать? Сигналить ошибку? Хранить в надежде на то, что это начало следующего сообщения?
1.2. Сервер забыл, что строки заканчиваются нуль байтом, и записал всего один байт, но за ним шел false, которй тоже представлен нуль байтом. Но т.как сообщения были в массиве, одно за другим, клиент ничего не сказал ему, смолчал, но продолжил работу. Аквалангисты - это хорошо.
2. Если у нас есть минимальные метаданные: длина:
2.1. Аналогично с первым, но мы то знаем, что сервер ошибся.
2.2. Все равно жопа.
CHayT 27.06.2016 13:13 # +2
> после c: true - что делать клиенту? Выбрасывать? Сигналить ошибку?
> Хранить в надежде на то, что это начало следующего сообщения?
Это, блядь, и называется фрейминг. Иногда его можно позаимствовать из низлежащего транспортного протокола, иногда сначала определяется фрейминг-протокол на уровне аппликейшна, в который затем инкапсулируется всё остальное. Иногда в ход идут твои "метаданные", если уж так хочется смешать мух с котлетами.
wvxvw 27.06.2016 14:11 # 0
Хз. мне просто слове фрейминг не знакомо в этом контексте.
CHayT 27.06.2016 14:21 # +4
Ну так по-моему неудивительно, что разработчик протоколов, который не знает таких базовых вещей, будет дебажить протоколы неделями. И да, не думаю, что дальше стоит обсуждать эту метапитушню.
Кстати, для protobuf есть модуль для вайршарка, правда 3rd-party, т.к. правильно заметили, что protobuf -- это сериализатор, ограниченно годный для создания именно протоколов.
wvxvw 27.06.2016 14:26 # 0
CHayT 27.06.2016 14:27 # +3
wvxvw 27.06.2016 14:50 # 0
CHayT 27.06.2016 14:57 # +3
kurwa-nextgen 27.06.2016 12:53 # +1
Еще раз: формат данных и rpc - это ортогональные сущности.
wvxvw 27.06.2016 14:18 # 0
Вод представь что ты десереализируешь данные - откуда ты знаешь, когда они закончатся?
kurwa-nextgen 27.06.2016 14:23 # 0
wvxvw 27.06.2016 14:26 # 0
kurwa-nextgen 27.06.2016 14:30 # 0
CHayT 27.06.2016 14:33 # +3
kurwa-nextgen 27.06.2016 14:33 # 0
wvxvw 27.06.2016 15:42 # 0
если мы не записываем длину в формате X, а вместо этого записываем длину в формате Y, который включает в себя формат X, тогда нам нужно узнать длину формата Y, и тут возникает проблема: может быть стоит не записывать длину в формате Y, а создать дополнительный формат Z, где мы запишем длину Y - экономия на лицо.
kurwa-nextgen 27.06.2016 15:48 # +3
roman-kashitsyn 29.06.2016 23:13 # +3
bormand 30.06.2016 07:20 # 0
kurwa-nextgen 27.06.2016 13:01 # 0
wvxvw 27.06.2016 14:08 # 0
kurwa-nextgen 27.06.2016 14:12 # 0
wvxvw 27.06.2016 14:27 # −1
3_14dar 28.06.2016 13:09 # 0
3_14dar 27.06.2016 12:06 # 0
Steve_Brown 27.06.2016 12:22 # +1
antox 03.07.2016 19:31 # 0
Лишь бы short не перевалил за 8 байтов и '0' оставался непосредственно перед '1'.