Два года в /fg/. Войти !bnw Сегодня Клубы
I made a bug once, and I need to tell you about it. So, in 2001, I wrote a reference library for JSON, in Java, and in it, I had this line private int index that created a variable called "index" which counted the number of characters in the JSON text that we were parsing, and it was used to produce an error message. Last year, I got a bug report from somebody. It turns out that they had a JSON text which was several gigabytes in size, and they had a syntax error past two gigabytes, and my JSON library did not properly report where the error was — it was off by two gigabytes, which, that's kind of a big error, isn't it? And the reason was, I used an int. Now, I can justify my choice in doing that. At the time that I did it, two gigabytes was a really big disk drive, and my use of JSON still is very small messages. My JSON messages are rarely bigger than a couple of K. And — a couple gigs, yeah that's about a thousand times bigger than I need, I should be all right. No, turns out it wasn't enough. You might think well, one bug in 12 years you're doing pretty good. And I'm saying no, that's not good enough. I want my programs to be perfect. I don't want anything to go wrong. And in this case it went wrong simply because *Java gave me a choice that I didn't need, and I made the wrong choice*.
#EB0BAE / @krkm / 3951 день назад

@polecat ок жи
#EB0BAE/VXJ / @krkm --> #EB0BAE/8YU / 3951 день назад
@polecat аутизм > изнасилование
#EB0BAE/BKY / @krkm --> #EB0BAE/8W1 / 3951 день назад
@polecat И Д Е А Л Ь Н О
#EB0BAE/RDM / @krkm --> #EB0BAE/FST / 3951 день назад

tfw кто-то для позиции использовал не long и валит на java. специально для таких нужно оставить один тип BigDecimal и пусть ебутся с ним как хотят

#EB0BAE/218 / @hirthwork / 3951 день назад
@hirthwork > Java gave me a choice that I didn't need, and I made the wrong choice.
#EB0BAE/MT0 / @krkm --> #EB0BAE/218 / 3951 день назад

@krkm и? java не должна была ему позволять выбирать тип для какой-то там переменной?

#EB0BAE/7QC / @hirthwork --> #EB0BAE/MT0 / 3951 день назад
@hirthwork у меня нет времени отвечать на твою хуйню, я придумываю какой тип использовать в какой-нибудь хуйне
#EB0BAE/4BA / @krkm --> #EB0BAE/7QC / 3951 день назад

@krkm k

#EB0BAE/G4G / @hirthwork --> #EB0BAE/4BA / 3951 день назад
json is webscale
#EB0BAE/BXR / @anonymous / 3951 день назад
идея для стартапа: видеокодек который пишет в json (хуман ридэбл, если придумаешь как открыть и не забудешь выключить подсветку синтаксиса) // ну вот откуда может взяться гигабайт жсона ещё?
#EB0BAE/77A / @mugiseyebrows / 3951 день назад
@mugiseyebrows спроси у пиздюка --> @hirthwork у него чототакое было
#EB0BAE/YYH / @krkm --> #EB0BAE/77A / 3951 день назад

@mugiseyebrows у меня один демон как-то раз в проде сгенерил из письма (rfc822) размером 15 МБ json размером 1.3 ГБ.

#EB0BAE/QB9 / @hirthwork --> #EB0BAE/77A / 3951 день назад

@hirthwork и это — expected behaviour. просто в тот раз успел сработать вотчдог и прибит бэкэнд. с тех пор я стал умнее и теперь такие json'ы обрабатываются быстрее и аккуратнее, поэтому при прилёте таких данных вотчдог ничего не заподозрит

#EB0BAE/999 / @hirthwork --> #EB0BAE/QB9 / 3951 день назад

@hirthwork мой секрет успеха в том что я нигде не отсчитываю позицию в json. мне влом репортить подробные ошибки, когда кто-то присылает говно вместо json'а — проблемы негров шерифа не ебут

#EB0BAE/UAG / @hirthwork --> #EB0BAE/999 / 3951 день назад
@hirthwork разве можно проверить валидность жсона не распарсивая его?
#EB0BAE/FEA / @mugiseyebrows --> #EB0BAE/UAG / 3951 день назад

@mugiseyebrows считать текущую позицию при парсинге не обязательно

#EB0BAE/YJC / @hirthwork --> #EB0BAE/FEA / 3951 день назад
@hirthwork при условии что тебе не нужно найти ошибку в нём
#EB0BAE/DCS / @mugiseyebrows --> #EB0BAE/YJC / 3951 день назад

@mugiseyebrows нет, не нужно. что я с ней сделаю? пофикшу что ли?

#EB0BAE/SBW / @hirthwork --> #EB0BAE/DCS / 3951 день назад

@hirthwork отправитель сам может взять свой json и загнать в jq. или python -m json.tool. а вообще у меня там выводится вроде кусок текста, на котором парсинг обломился. и позиция известна внутри куска текста (который не можеть быть больше 2ГБ)

#EB0BAE/GG2 / @hirthwork --> #EB0BAE/SBW / 3951 день назад
@hirthwork Я не про это ваще говорил, я говорил про то что вы как-то охуительно оптимально его используете (таким образом который не приходил в голову создателями парсеров). Ну вот есть например у меня большой кусок данных в жсоне. Видимо я не могу его распилить на части и порезать вдоль-поперёк, ето какой-то монолит. Он у меня есть и неделим. Как его модифаить? Очевидно загрузить в память (десереализовать) изменить и обратно сереализовать (обогреваем комнату, жсон из энвайромент фрэндли). Что я могу с ним сделать? Скормить программе? А она не обосрётся от счастья? Я чото п
#EB0BAE/OTO / @mugiseyebrows --> #EB0BAE/GG2 / 3951 день назад

@mugiseyebrows > таким образом который не приходил в голову создателями парсеров
на бэкэнде стоит json парсер который я сам написал за две ночи. все остальные парсеры просто охуевают от наших объёмов данных. а те что не охуевают — тормозят. поэтому приходится писать свои парсеры

Как его модифаить?

нам не надо модифаить. один сервер по мере парсинга rfc822 генерит охуительного размера json и поточно высирает его в сокет, над сервером стоит nginx, который жмёт его в gzip, этот gzip улетает на другой сервер, тот его распаковывает, извлекает пару нужных полей для себя и посылает в бэкэнд. бэкэнд вычитывает этот json, парсит и при помощи хитровыебанных алгоритмов превращает в свои структуры данных, которые флашит на HDD. Но надо признаться, что бэкэнд тоже целиком в памяти вынужден держать этот json в памяти в течении нескольких миллисекунд — это обоснованный tradeoff

#EB0BAE/VIY / @hirthwork --> #EB0BAE/OTO / 3951 день назад
@hirthwork а чо бинарно как-нибудь нельзя было?
#EB0BAE/X0T / @mugiseyebrows --> #EB0BAE/VIY / 3951 день назад

@mugiseyebrows годы назад мы использовали protobuf, но потом поняли что при работе с бинарными данными крайне неудобно дебажить. к тому же нужно всем клиентам оперативно обновлять *.proto-файл, что тоже является геморроем. json удобнее и в плане дебага и в плане работы с другими командами

#EB0BAE/RIU / @hirthwork --> #EB0BAE/X0T / 3951 день назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.