• Как решить долгий запрос blob?

    @risejs
    У тебя видео скачивается полностью. Если хочешь по частям, то надо сделать подобие потока. Blob для этого не подходит, то что в ссылке написано blob: не значит что URL.createObjectURL() принимает только Blob, там еще есть MediaSource.

    Потоковые медиа в браузерах работают через Media Source API. Видео для него должно соответствовать определенным требованиям, например фрагментированный mp4. Видео по твоей ссылке таким не является. Можно проверить здесь mp4info.

    Если для транспорта используется fetch или XMLHttpRequest, то есть парочка относительно простых способов это реализовать:

    1. Через тип ответа ArrayBuffer и заголовок запроса Range. В fetch поддерживается через response.arrayBuffer(), в XMLHttpRequest через responseType='arraybuffer'.
    Например.

    2. Через тип ответа ReadableStream (Streams API). В fetch поддерживается через response.body, в axios и других xmlhttprequest-основанных библиотеках не поддерживается. Также для Streams API требуется протокол HTTP/2+.
    Например 1, 2, 3, 4.

    Краткие примеры:
    const rangeVideo = async (player, mimeCodec, resource) => {
        const mediaSource = new MediaSource;
        player.src = URL.createObjectURL(mediaSource);
        await new Promise(resolve => mediaSource.onsourceopen = resolve);
        URL.revokeObjectURL(player.src);
        const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
    
        const response = await fetch(resource, { method: 'HEAD' });
        const contentLength = response.headers.get('Content-Length');
        const segmentLength = 1 * 1024 * 1024;
        let fetchedLength = -1;
    
        while (true) {
            if (fetchedLength >= contentLength) break;
            const response = await fetch(resource, {
              headers:{'Range':`bytes=${fetchedLength+1}-${fetchedLength+=segmentLength}`}
            });
            const value = await response.arrayBuffer();
            sourceBuffer.appendBuffer(value);
            await new Promise(resolve => sourceBuffer.onupdateend = resolve);
            //console.count();
            //await delay(2000);
        }
    };
    
    const streamVideo = async (player, mimeCodec, resource) => {
        const mediaSource = new MediaSource;
        player.src = URL.createObjectURL(mediaSource);
        await new Promise(resolve => mediaSource.onsourceopen = resolve);
        URL.revokeObjectURL(player.src);
        const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
    
        const response = await fetch(resource);
        const readableStream = response.body;
        const reader = readableStream.getReader();
    
        while (true) {
            const { value, done } = await reader.read();
            if (done) break;
            sourceBuffer.appendBuffer(value);
            await new Promise(resolve => sourceBuffer.onupdateend = resolve);
            //console.count();
        }
    };
    
    //const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
    
    const data = [
        document.querySelector('video'),
        'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
        'https://nickdesaulniers.github.io/netfix/demo/frag_bunny.mp4',
    ];
    
    //rangeVideo(...data);
    //streamVideo(...data);
    Ответ написан
    Комментировать
  • Почему низкая скорость скачивания?

    @justnick Автор вопроса
    Решил проблему. В интернете нашел похожий вопрос. Там был комментарий, что человеку помогло прописание команды в командной строке от имени адм.: netsh int tcp set global autotuninglevel=normal
    Попробовал, скорость в норме:
    651bc759d199d846949914.png
    Ответ написан
    1 комментарий
  • Звук заглушается при использовании наушников, как избавиться от этого?

    @Drno
    В меню - панель управления > звук > связь - поставь настройку "действие не требуется"
    Ответ написан
    1 комментарий
  • Автодополнение в phpstrom?

    Была та же проблема. Помогла установка галочки здесь:

    5e1c59d59df1f657415136.jpeg
    Ответ написан
    2 комментария
  • Как использовать computed внутри v-for?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Никак не использовать. Хотите тут computed - вместо одного значения пусть предоставляет массив:

    const names = computed(() => list.map(n => (n.main ?? n.default).name));

    <div v-for="n in names">
      {{ n }}
    </div>
    Ответ написан
    Комментировать
  • При смене языка на windows 7-11 появляется под языком клавиатура, как исправить?

    @jurok04
    Такое происходит, когда для одного языка (у вас на кратинке RU) установлено несколько раскладок клавиатуры (на картинке Русская и США). Для устранения надо удалить США раскладку в RU языке и добавить отдельный EN язык с раскладкой, например США (международная).
    Ответ написан
    Комментировать
  • Как повесить событие, чтобы оно сработало на динамически созданном объекте?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    у вас неточность. в примере на jquery вы просто ловите событие
    а в примере на ваниле хотите инициализировать плагин.

    Это разные вещи.

    Поймать событие просто. Вешайте обработчик на document и смотритте что прилетело в event.target

    В случае с плагином, если он сам не поддерживает инициализацию на созданных в рантайме элементах, вам придется самостоятельно отслеживать появление новых узлов в DOM и по условиям инитить на них плагин. Но это в общем случае, для универсальности. В частном случае можно вклинится в процедуры открытия тех же попапов и там подключать маску. Например напрямую в клике кнопки "Открыть попап", или удобнее, в обработчике события "popup.opened" (условно, я не знаю, какие попапы у вас используются, но у большинства плагинов есть события открытия/закрытия).
    Ответ написан
    Комментировать
  • CSS, как рассчитывается max-width в flex контейнере, если один из дочерних элементов имеет flex-grow = 1?

    iiiBird
    @iiiBird Куратор тега CSS
    Пока ты спишь - твой конкурент совершенствуется
    .wrapper {
        min-width: 0;
    }
    Ответ написан
    2 комментария
  • Как убрать папку idea из репозитория?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вы удивитесь, но чтобы убрать папку из репозитория, вам нужно удалить её из репозитория. Только так.

    Например вы можете удалить папку в рабочем каталоге и затем не забыть закоммитить это изменение.

    Если эти файлы нужны в рабочем каталоге, то можно удалить только из репозитория.
    git rm —cached ".idea"
    git commit -m "Delete .idea"
    Файл .gitignore поможет не добавить в репо случайно что-то лишнее. Поэтому мы его создаем в первую очередь, ещё до создания коммитов. Более того, даже если файлы подпадают под правила игнора, это всё равно не запрещает нам их закоммитить при сильном желании.

    Запомните! Простое редактирование файла .gitignore не удаляет никакие файлы из репозитория. Вам надо удалить файлы самостоятельно, создав коммит удаления.
    Ответ написан
    Комментировать
  • Как правильно расширить дженерик интерфейс?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Что-то вроде такого:
    https://www.typescriptlang.org/play?#code/KYDwDg9g...
    Ответ написан
    Комментировать
  • Почему выражение (-1ll) в ассемблерном коде MSVC равно ff ff ff ff?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Уловка в системе процессорных комманд: 48 c7 45 08 - позволяет загрузить в 64-битную ячейку памяти 32 битное число, автоматически расширяя его до 64 бит.

    Смотрите список кодов x64:
    0x48 - означает, что следующая комманда работает с 64-битами.
    0xC7 - mov immediate (данные в команде)
    Дальше идут флаги, указывающие как интерпретировать аргументы, что куда адресовывать и т.д.

    Но важно, что команда C7 работает с r/m16/32/64 данными, а аргумент у нее может быть только imm16/32 (третий столбец). Т.е. она принимает или 2 или 4 байта, в зависимости от обвеса, а записывать может до 64 бит. Сравните это с коммандой 0xB8 в той же таблице, она уже может принимать 64 бита.

    Если аргумент меньше ячейки памяти, то он расширяется (sign extended) до нужного размера (бит знака копируется влево до упора). Это позволяет записать числено равное значение в более битную ячейку. ведь 32-битное число 0xFFFFFFFF - это -1 в дополнительном бинарном коде, а 0xFFFFFFFFFFFFFFFF - это тоже -1 в дополнительном 64-битном коде.

    Компилятор использует вот эту команду, а не 0xB8, потому что сама команда короче, а исполняется так же быстро. Меньше кода, больше всего помещается в кеш и все работает быстрее, да и exe-шник меньше получается.
    Ответ написан
    2 комментария
  • Почему Linux постоянно обращается к внешнему диску во время простоя?

    ValdikSS
    @ValdikSS
    Если вы недавно создали файловую систему на диске, и особенно если раздел большой (многотерабайтный), то на нём еще могут создаваться inode'ы.
    https://fedetft.wordpress.com/2022/01/23/on-ext4-a...

    Если к диску обращаются программы, обнаружить конкретный процесс или файл поможет эта статья:
    https://habr.com/ru/articles/476414/
    Ответ написан
    1 комментарий
  • Важно ли глубокое знание и владение фронтенд девелоперу canvas, 2d и webgl графики?

    vabka
    @vabka
    Токсичный шарпист
    Мне кажется, что скорее нет, чем да. Но знать о их существовании и о принципах работы с ними - очень следует
    Ответ написан
    Комментировать
  • Как учиться быть руководителем?

    Griboks
    @Griboks
    В отличии от программирования и подобных специальностей существуют три базовых способа изучить искусство управления:
    1. вуз
    2. специальные курсы + сертификация
    3. госты+стандарты+книги для расширенного понимания первых двух

    p.s.
    Alexander Lamdan утверждает, что
    Научиться быть руководителем это почти никак. Нужно к этому идти.


    Замечу, что это в корне неправильный подход, который ведёт к самодурству, неэффективной организации труда и коррупции. Вы действительно должны выработать свою точку зрения, но делать это самостоятельно и изолированно от обширных накопленных человечеством знаний займёт слишком много времени и других ресурсов - это путь в никуда для управленца.
    Ответ написан
    7 комментариев
  • Как отображать большое количество полигонов через ObjectManager в Яндекс картах?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Нет таких вундеркиндов, способных умозреть 7 тысяч полигонов разом. В лучшем случае он будет видеть сплошную заливку. Вот её и показывайте, объединив всё это в несколько полигонов, визуально похожих на исходные.
    Ответ написан
    Комментировать
  • Из 16 Гб ОЗУ 7, что делать?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Народ, не надо тупить. Встроенная графика, память берется из оперативки. Соответственно 8 гиг откушено на потребности видюхи.
    Ответ написан
    6 комментариев
  • Как указать типы данных в импортируемом json файле?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    https://www.typescriptlang.org/tsconfig#resolveJso...

    Ну или создайте рядом с db.json файл db.json.d.ts со следующим содержимым:
    declare const JSON: {
        id: number;
    }[];
    export default JSON;
    Ответ написан
    Комментировать
  • Как распарсить такой JSON?

    Immortal_pony
    @Immortal_pony Куратор тега JavaScript
    но я никак не могу с ним работать, я пытался пропускать его через функции нормализации, но ни в какую

    А не надо бездумно совать свою строку какому-то левому коду и ожидать что он всё за тебя сделает.
    Надо проанализировать что ты получаешь и только потом начинать что-то делать.
    В данном случае видно две очевидные проблемы:
    1. В строке отсутствуют все закрывающие символы, которые должны быть в конце строки - кавычки, фигурные скобки, квадратные скобки - всё потеряли. В первую очередь надо найти того кто это написал, ткнуть его носом и громко и чётко произнести: "кто накодил? Кто накодил, а?", после чего посадить его исправлять серверную часть.
    2. Внутренний объект зачем-то закодирован в json второй раз. Тут уже можно не кричать, а дать лёгкого добродушного пинка backend-разработчику, но таким образом чтоб после этого его тело двинулось в сторону клавиатуры, используя которую, он исправит и этот косяк.

    const weirdString  = fetch() // здесь получаешь свою странную и  корявую строку
    const jsonEncoded = weirdString + '\\"}]}]"}' // для примера я вручную посчитал всё закрывающее барахло, но, возможно что для этого надо будет написать отдельную функцию. Ну, тут сам справишься, я думаю
    const decodedOnce = JSON.parse(jsonEncoded) // раскодируем первый раз
    const decodedTwice = JSON.parse(decodedOnce['21']); // раскодируем второй раз внутренний объект.
    Ответ написан
    Комментировать