LINUX.ORG.RU

Я дико извиняюсь, но вопрос про javascript: binary input stream?

 ,


0

1

Всем привет. Вижу примеры jquery ajax, возвращающие ArrayBuffer, вижу DataView, но это всё какая-то убогая низкоуровневщина. А хочется любви такого:

$.ajax(...).done(function (binaryData) {
    let is = new ByteArrayInputStream(binaryData);  // так в жаве класс называеццо
    is.readChar();
    is.readInt8();
    is.readInt16();
    is.readInt32();
    is.readString();  // это и сам нарисую: e.g. int16 длина + chars
});

Может есть чё готовое на эту тему? Только маленькое, не хочу монструозные фреймворки в зависимости пихать.

★★

Ответ на: комментарий от anonymous

Любопытно, но выглядит монстром. Даже если можно при деплое отрезать поддержку форматов картинок.

UPD. И в списке языков не вижу js.

UPD2. И главное — хочется всё-таки нечто низкоуровневое, чтобы не решало за меня, в каком формате данные сериализовывать (видал я что java и php генерят — там метаданных больше чем данных, а я метаданные сериализовывать не собираюсь вообще).

dimgel ★★ ()
Последнее исправление: dimgel (всего исправлений: 2)
Ответ на: комментарий от slaykovsky

Не годится. Картинка на главной: JSON 27 bytes, msgpack 18 bytes. А на самом деле там нужно максимум 5 байт (boolean + int32). (А если заюзать алгоритм сжатия чисел HTTP2 HPACK, то ЕМНИП всего 2 байта; хотя писать такое на js это конечно уже изврат: код распаковщика сожрёт больше, чем экономия от паковки.)

dimgel ★★ ()
Последнее исправление: dimgel (всего исправлений: 1)

Кто-то не умеет читать MDN: Streams API.

Но и свою обёртку над буферами наваять на промисах несложно, если что.

не хочу монструозные фреймворки в зависимости пихать

$.ajax

Ну-ну.

rebforce ()

https://github.com/hprose/hprose-js/blob/master/src/StringIO.js

$.ajax(...).done(function (binaryData) {
    let is = new StringIO(binaryData); 
    is.readChar();
    is.readByte();
    // is.readInt16(); // этого нет, но легко добавить
    is.readInt32BE();
    is.readInt32LE();
    is.readString();  // это и сам нарисую: e.g. int16 длина + chars
});

Или можно вообще использовать hprose целиком тогда вместо $.ajax(...) будет

var client = hprose.Client.create("http://www.hprose.com/example/", ["hello"]);
    client.hello("World!")
    .then(function(result) {
        alert(result);
    }, function(err) {
        alert(err);
    });

Смотри https://hprose.com/ и https://github.com/hprose/hprose-js

monk ★★★★★ ()
Ответ на: комментарий от monk

Спасибо за наводки ( rebforce: я таки-нагугливал Streams API, но потом не успев добраться и прочитать — потерял и забыл), но кончилось дело тем, что я нарисовал себе BitOutputStream.java (BitInputStream.js ещё нет, но там хватит ArrayBuffer), т.к. тратить целый байт на булево значение (в т.ч. в огромном количестве булевы флаги is not null) — это беспредел. А заодно и числа пакую — простенько и эффективно, на клиенте распаковка будет в две строки. В общем, фатальным недостаткам — бой!

dimgel ★★ ()
Ответ на: комментарий от anonymous

1. В случае single page website, jquery грузится один раз, а json многократно. Пара загрузок каких-нить таблиц — и jquery.min.js я уже скомпенсирую (в отличие от чего потяжелее), а на третьей загрузке выйду в плюс.

2. Рано или поздно WebAssembly допилят, и будет он грузиться один раз на каждую новую версию, и jquery вместе с js станут вообще не актуальными (впрочем их и сейчас можно в localStorage пихать, или тут пишут что в appcache).

dimgel ★★ ()

Если дрочишь на размен то используй FastBinaryEncoding. Она не такая гибкая для изменений как Протобуф, но там есть final способ, который ещё сильнее сжимает данные. Правда я не в курсе поддерживает она джэс или нет. И если длч тебя Прото монстр, то это вообще-то посложнее будет.

anonymous ()
Ответ на: комментарий от anonymous

Да джэс тоже есть. Пишешь схему. Генерируешь. И всё. Потом вдуплитб тему с моделямт и буферами ещё прижётся. Ну и компилируется долго. В отличии от Прото можно только добавлять новые поля, если захочется изменить структуру. Зато поддерживает время из коробки и enum-ы произвольного размера.

anonymous ()
Ответ на: комментарий от dimgel

Та ж херня. Но очень хочется верить в лучшее.

Там будет дыра на дыре и получится флешь. Через js и то умудряются поиметь браузер, а то и систему, а тут будут бинарники.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от dimgel

Но, даже если там байткод, то какой с этого профит? Всё равно будет тормозить из-за переборов DOM. Js сам по себе достаточно шустрый.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

то какой с этого профит

Время интерепретации и парсинга JS достаточно большое. Пока еще из очевидных плюсов - работа мимо GC. Бывают SPA которые прям цифродроблением занимаются.

anonymous ()
Ответ на: комментарий от anonymous

Время интерепретации и парсинга JS достаточно большое.

Так это можно решить и без wasm, если js движок будет считать хеш скрипта и скидывать куда-нибудь дамп.

Пока еще из очевидных плюсов - работа мимо GC.

Что может быть скорее минусом.

Бывают SPA которые прям цифродроблением занимаются.

Ну как. Браузер - это не такой инструмент, на котором можно дать кому-то развернуться. Разрабы исходят из этого. Сегодня ты дашь им wasm а завтра толпы макак завалят веб своим дырявым и текушим говном, а хацкеры будут майнить на каждой вкладке в 8-и процессах и webgl.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Что может быть скорее минусом.
Сегодня ты дашь им wasm а завтра толпы макак завалят веб своим дырявым и текушим говном

Эт да, я исхожу из своего кейса, что spa для внутреннего пользования и крутится только на своем железе и все знают что может быть.

хацкеры будут майнить на каждой вкладке в 8-и процессах и webgl.

так уже майнют.

считать хеш скрипта и скидывать куда-нибудь дамп.

И ты только что добавил еще один вектор для идентификации пользователя.

anonymous ()
Ответ на: комментарий от crutch_master

Профит - хотя бы в нормальной системе типов. А то сейчас даже int и long нормальных нет, все числа лежат в double, битовые операции - через временное преобразование в int32, safe ints - 53 бита... #@$, о какой скорости мы тут говорим, не говоря уже об удобстве?

Вчера почитал про классы в ES6. Это тоже пц. Приватных свойств нет. 21й сука век! Стандарт 2015 года!!! Мрази безмозглые. Продолжаю юзать олд-стайл.

Вот поэтому я хочу wasm: потому что в гробу я видал ваш js.

dimgel ★★ ()
Ответ на: комментарий от VarfolomeyKote4ka

Думаю дело не в жс

Чувак просто шлялся по джээс форумам и подцепил преждевременную оптимизацию. Причём у него она развилась до терминальной стадии. Думаю пусть лучше съест говна с таким мировоззрением и когда его попустит подходит.

anonymous ()
Ответ на: комментарий от dimgel

А то сейчас даже int и long нормальных нет, все числа лежат в double

Есть bignum и типизированные массивы.

Вчера почитал про классы в ES6. Это тоже пц. Приватных свойств нет. 21й сука век! Стандарт 2015 года!!!

Есть. Но их надо колхозить через Object.defineProperty. И хотят запилить private. А зачем они тебе так нужны?

Вот поэтому я хочу wasm

Но зачем? Сейчас что угодно тупо компилируют в js, если так не хочешь его трогать.

crutch_master ★★★★★ ()
Ответ на: комментарий от dimgel

Вчера почитал про классы в ES6. Это тоже пц. Приватных свойств нет.

В питоне тоже нет, и чо? Кто-то от этого страдает или подчёркивание влом поставить перед именем свойства?

Более того, в ES6 можно запилить хитровыделанный геттер/сеттер (Proxy), который не даст обратиться к любому свойству, начинающемуся с подчёркивания. Так что здесь можно запилить даже более приватные свойства, чем в питоне, если IQ не позволяет соблюдать конвенции без ударов по рукам со стороны рантайма.

rebforce ()
Последнее исправление: rebforce (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Но зачем? Сейчас что угодно тупо компилируют в js, если так не хочешь его трогать.

Ожидаемый аргумент, сам давно уже на TeaVM зубы точу попробовать, но боюсь учитывать косяки целевого языка всё равно придётся.

Что до прочих «есть», то даже BigInt мало кем поддерживается. А private мне потому что я привык к хорошему.

dimgel ★★ ()
Ответ на: комментарий от rebforce

Вот в т.ч. поэтому питон - говно. Мне тут втирали, что все проблемы от того что пмшут крупные вещи на скриптовых языках. Вот, собственно, welcome to js. Скриптовое говно, на котором безальтернативно приходится делать крупные вещи. В этом смысле wasm нужен позарез хотя бы конкуренции ради.

dimgel ★★ ()
Ответ на: комментарий от dimgel

А private мне потому что я привык к хорошему.

Делать на js оопоту такая себе идея. Лучше не ссы против ветра, делай декларативщину.

но боюсь учитывать косяки целевого языка всё равно придётся.

Тут дело в vm, а не языке. Я вот не знаю, как они какой-нибудь int16 запихают в v8, если даже запилят wasm. Будет тупо компиляция в js по факту.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Не будет. Они в wasm вполне себе уже int64 запихали. Никто там не ограничивает себя совместимостью с js-ограничениями, там другая VM (ну или та же, но с расширенными фичами, не поддерживаемыми js как языком).

dimgel ★★ ()
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от crutch_master

А кому щас нужны int8/int16 в отрыве от обрабатываемых буферов данных? Накладные расходы на хранение и разруливание метаданных о длине каждой отдельной переменной будут куда больше, чем если просто выделять по 8 байт на любой инт при первой его инициализации. Хотя тот же JIT никто не отменял и думаю, что там это дело как-то тоже оптимизируется.

rebforce ()
Ответ на: комментарий от crutch_master

Делать на js оопоту такая себе идея.

Писать на js - вообще так себе идея. А приходится. Компилять в него я не хочу ещё и потому, что любой лишний слой привносит издержки - не только необходимость учитывать косяки целевой платформы, но и косяки и ограничения трансляции. Одно из моих любимых ругательств - «дырявая абстракция».

dimgel ★★ ()
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от rebforce

Целые числа не нужны, но они есть. Private не нужен, но он будет. Впрочем, шизофрения - естественное состояние адептов всякого говна: по-другому ум с верой не примирить.

dimgel ★★ ()
Ответ на: комментарий от dimgel

Целые числа не нужны, но они есть.

Кто говорил, что они не нужны?

Писать на js - вообще так себе идея.

Ну хз, мне норм и лучше, чем на той же яве. Хотя я и си/плюсы уважаю, но как сажусь на них писать, начинаю неистово байтодрочить и забываю, что, собственно, собирался делать.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от rebforce

А кому щас нужны int8/int16 в отрыве от обрабатываемых буферов данных?

Ну с int8/16/32 надо же как-то работать, а они превращаются в number (который double), если их присвоить к переменной.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)