- 1
- 2
- 3
- 4
- 5
- 6
var CodeMirror = require("codemirror");
var Thrift = require("thrift.js");
require("./src/my.css");
include(`gen-js/test_types.js')
include(`gen-js/TestServ.js')
include(`src/main.js')
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+2
var CodeMirror = require("codemirror");
var Thrift = require("thrift.js");
require("./src/my.css");
include(`gen-js/test_types.js')
include(`gen-js/TestServ.js')
include(`src/main.js')
Против m4 нет приёма.
Видимо, один из авторов протобуфа, а не grpc. Протобуфы пилит довольно много людей. Я grpc не использовал, но его неопенсорсный вариант использую каждый день, ничего плохого сказать не могу. Если бы нужно было что-то сделать для себя, я бы, наверное, взял grpc.
Да, именно.
> я бы, наверное, взял grpc
Могу ошибаться, но GRPC вроде не особо умеет во фронтенд и экму. Thrift умеет, в том числе с использованием бинарного протокола и вебсокетов.
такой метод удобно расширять
int это оператор, а void * это его операнды (один или массив в зависимости от).
Например:
int speed = 42;
do_all(LAUNCH_ROCKET, &speed);
Или
struct Email email = {....}
do_all(SEND_EMAIL, &email);
или
int length;
do_all(GET_LENGTH, &length);
Кажется я придумал ioctl
Еврейское программирование.
Я смотрю у вас тут тяжелые наркотики в почете
Роман имел в виду continuation passing style, судя по "адресу коллбэка"
Ты же в телекоме работаешь
Из широко известных фирм в Швеции есть ещё как минимум Volvo (self-driving cars) и Spotify.
Из достоинств, следует отметить, что каждый наивный програмист попытавшийся использовать это говно сразу же сталкивается с проблемой: "а оперделения сервисов мне не уперлись потому что у меня нет ХТТП, я работаю с Х (например, топиками в Кафке), как же мне теперь угадать какой мессадж мне прислали".
Естественно, тут же ваяется "решение", вот виды решений, с которыми я уже сталкивался:
1. Захуярить размер мессаджа в 4 байта (как правило в направлении обратном сетевому), за ним строку с названием замапленного класса (ну, или варианты, типа энумератора, который в коде приложения мапится к классам).
2. Попытаться распарсить в разные типы, авось какой-нибудь совпадет.
3. Захуярить в другой формат, например в ХМЛ, в Бэйс64. Зато надежно.
С опытом приходит понимание необходимости полиморфизма и работы с разными версиями говна. И тут в уже готовое месиво из байтоебства и самодельных оберток добавляется код для угадывания версии, и всякие причуды типа .
Потом приходит понимание, что постореная система - говно, но деньги уже заплачены и потрачены. В этот момент нанимают саппорт, а гении идут строить новый и луччий проект, в этот раз с Трифтоговном и т.д.
Я думаю, что такими темпами, они нас не обгонят.
Я предпочитаю SO
Я прям даже не знаю, использовать oneof не пробовали?
https://developers.google.com/protocol-buffers/docs/proto3#oneof
Если уж совсем всё равно, что слать, есть any
https://developers.google.com/protocol-buffers/docs/proto3#any
Естесственно, oneof невозможен, если формат сообщений описан кем-то другим, кто не подумал о том, что всем сообщениям нужна общая обертка.
еще ни разу не видел сетевого протокола без версионирования - и без граблей. ни разу. исключение тоже было: протокольчик для миддлваре где версия стояла в "2.1" и её ни в коем случае менять было нельзя...
потому что ASN1 (с которым я имел несчастье работать) сам по себе в ж неверсионирован. хуже: если определения ASN1 не одинаковы, то ты хер это можешь определить, потому что длины это г не сохраняет (как например TLV). и все исторические приложения (шифрование, телекомы) они все не версионированы. (потому что есть организации отвечающие за стандарт - но когда народ копирует в проекты, все ложат на организационную часть.)
Опять же, версионирование — это больше дело протокола, а не только лишь формата сериализации. Одна из частых стратегий: делаешь новое API, депрекейтишь старое, какое-то время поддерживаешь обе версии. Для большинства приложений этого обычно вполне достаточно.
Для протоколов уровня IETF, конечно, такой подход не работает, там, как правило, всё старьё нужно уметь поддерживать.
почитал.
все сводят к "just add new shit - old shit will just ignore it!" - это 100% говно.
потому что в половине случаев не только добавляется новая информация, но так же меняется интерпретация старой. потому что иначе поля в сообщениях начинаются плодится без остановки. (протокол с >10К тагов - ASN1 based - я в реале видел.)
> это больше дело протокола, а не только лишь формата сериализации.
совершенно правильно. номер версии - это номер протокола, а не формата сериализации.
но практических проблем это не решает. много этого корпоративного говна начинается с каких-то тривиальных мелочей - а когда вырастает до больших размеров, уже поздно что либо менять.
Твой вопрос немного напоминает митинги на эту тему, которые в кратце можно выразить: "как мы можем исправить грабли, но при этом ничего не меняя?"
Т.е. ты даже не знаешь, какой тебе прислали? Вот это реальный ЛОЛ, шаблон проектирования "I have no idea what I'm doing".
Допустим даже, ты знаешь размер, и прочитал этот несчастный блоб (или просто прочитал всё, что есть в сокете, допустим). Что ты дальше-то с ним делать будешь? Предлагаю сразу слать его на почту тому, кто придумал ваш протокол коммуникации.
"Наш протокол комуникации" был придуман дибилом из гугла. Почты его у меня нет, и общаться с ним мне не интересно.
/thread
1. https://en.wikipedia.org/wiki/GRPC
2. https://en.wikipedia.org/wiki/Remote_procedure_call
Да, GRPC -- это протокол, я использую его аналог каждый день. Но ты же сам сказал, что вы не используете GRPC, и гоняете по сети протобафы, используете свой кастомный протокол.
> Вот, открыл ты сокет, как ты знаешь сколько байтов нужно прочитать из него, чтобы прочитать сообщение?
Это не ты написал? Protobuf -- это формат сериализации, а не протокол. Давай прочитаем вместо PROTOCOL BUFFERS, то есть это пэйлоад, который ты кладёшь в свой проткол (HTTP или кастомный бинарный). Протокол -- это то, что вы там на сокетах намутили вместо GRPC. В ваших проблемах никто кроме вас, мудаков, не виноват.
> Нет, это ты просто долбоеб, который читать не умеет.
Нет, ты
IP говно, кстати. Там все складывается в пакеты и явно передается размер.
802.3 (Ethernet) говно, кстати. Там все складывается в кадры.
То ли дело "E1/T1".
А еще можно вспомнить ATM: там все ячейки (или как их там называли) были фиксированного размера, чтобы было удобно и телефонистам, и сетевикам, и wvxvw
Видимо, они руками в сокеты пишут.
На самом деле, проблема в гомоморфна типизации в языках программирования, только всё хранится по значению. Слать сообщения разного типа в один канал — это как класть объекты в гетерогенный список. Нельзя сделать это без оверхеда RTTI ("ручного" или встроенного в язык), да и не нужно.
Это не решает основную проблему, только откладывает неизбежное. Что потом с этим говном неизвестного типа делать? Как проверить, что сообщение валидное? Можно перекладывать эти байты с места на место, но тогда аналогичная проблема ожидает того, кто обрабатывает это сообщение дальше.
А вообще конечно глупая проблема, и решений у нее миллион
От предачи типа в первых двух байтах, до определения типа по адресу, порту итд
Сообщения разных типов могут быть сериализованы в одинаковый набор байтов. Например:
< name: "John" > может быть и студентом, и профессором без студентов.
Вот правда я не уверен: закроет-ли операционка сокет кошерно в случае смерти процесса и освобождения ресурса?
В этом и был вопрос, умник.
я цепалнулся телнетом к своему серверу на жабе, и когда я кильнул виндовый телнет у меня полетел connection reset (значит что винда послала TCP RST).
А тоже самое с линуксом: там убитый (kill -9) telnet успешно умер и соединение закрылось (считался -1, EOF). подозреваю что это можно менять в настройках клиентского сокета, но тем не менее дефалты у ОСей разные
официально: да, она закроет сокет. только закроет - со всеми вытекающими - shutdown() никто на сокете не вызовет. (последствий уже не помню.)
но в общем случае полагаться на это все - что бы узнать почему соединение закрылось - все равно нельзя. (потому что даже graceful FIN может быть потерян, и его никто повторно посылать не будет.)
Короче я уже понял что я зря доебался до гостя: он все правильно делает: полагаться ни на что нельзя, все зыбко.
Нужно или в первых байтах передавать размер месседжа, или явно ждать спец. символа для его завершения, а иначе это всё не валиднуть нормально
лол. если провод был оборван - то ничего не может послатся - peer'ы будут на таймауте висеть.
> винда шлет RST, а линукс шлет FIN.
винда всегда любила соединения быстро и грязно разрывать.
помню еще head-banging-against-wall когда первый раз прога подвисла в close() сокета который был грязно закрыт без RST/FIN - виндами - и были еще буфернутые непосланые данные ("bye", последнее сообщение протокола).
Да, и в конце концов я получу timeout, это понятно. Я, по наивности децкой, думал что если SIGKILL процесс то он тоже ничего не пошлет и будет такой же timeout.
Но оказалось что ОС так не думает.
Видишь вот эти [F.]? Это же FIN?
другого флага с F нету.
на линуксе там тьма конфигурационных опций.
http://man7.org/linux/man-pages/man7/tcp.7.html
он даже глобальный лингер умеет делать.
ЗЫ читал вспомнил почему shutdown *них не делает: после форка сокет может шарится между процессами. а шатдаун меняет глобальное состояние соединения.
Вполне возможно что это настраивается опциями TCP, да
более обобщенно: это стандартная фича *нихов.
У виндуос тоже есть "хендлы объектов" и они тоже самоубиваются.
, не?
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724466(v=vs.85).aspx
но следует виндовым традициям - и не без граблей -
https://stackoverflow.com/questions/3400675/duplicatehandle-need-to-openprocess-but-the-access-is-denied
давно винды не ковырял.
Тут у чувака просто юзкейс ебнутый на голову, как и попытки решить проблему в духе "раздать всем приложениям привилегию на дебаг".
Другими словами, ты это говно уже жрешь черпаком, но только сейчас об этом узнал.
Ты спросил, как я делаю - я ответил. Причем тут твоя кафка? Кафка не сообщает длину пейлоада, который возвращает? Ну напиши ее перед протобуфом.
> говно
У тебя в голове.
ты таки решил запилить свой гк на богомерзкой динамике?
Именно поэтому я за «m4».
Так лучше?
Я думаю, они для автоконфа старались юзать те инструменты, которые точно везде есть - m4, ванильный sh и т.п. Чтобы на любом говне мамонта взлетело.
Ой да ладно... Там реальный гемор начинается только если надо какие-то свои тесты для платформы запилить или нестандартные шаги. Но это во всех системах сборки так. А стандартные конфиги ну не сложнее того же cmake.
Вот эти штуки бесят, кстати. Это чтобы переводы строк не попадали на выход? И заодно как коммент можно юзать?
Иногда делают без них, но с командой divert, после которой указывается номер буфера, в который выводить:
https://web.mit.edu/gnu/doc/html/m4_9.html
divert(0) означает вывести в стандартный поток, а divert с отрицательным номером означает просто потерять все данные, которые должны быть выведены.
Пример:
З.Ы. Я сварщик не настоящий, `m4' юзал буквально пару раз и всех фишек не знаю.
Ааааа! Ну зачем ты мне про эту хуету напомнил!?
- звучит так, как будто это было лет тридцать назад))
Я sendmail админил без этих ваших m4. То ли в той версии слаки ещё не было этого макропакета, то ли мне его просто не показали.
З.Ы. Он не так уж и плохо читается, на самом деле.
>>> bormand 15.03.2020 14:44 #
>>> я девочка-волшебница.
https://govnokod.ru/26488#comment534043
> пруф
Вжуууух. И ты петух.
У тебя теперь ник "OCETuHCKuu_nemyx" и петух на аватарке, проверь.
К сожалению, обратное заклинание я ещё не выучила. Так что походишь пока так.
А про возраст товарищу майору будешь доказывать.
-- Товарищ майор, бегите скорее сюда, тут какой-то петух просит пруфы показать.