Задать вопрос
  • Что из себя представляет интернет соединение?

    Мой ответ - нет, это не "непрерывный поток" а просто некоторое состояние, которое зафиксировано в узлах сети.
    Это состояние меняется с каждым отправленным блоком данных. Сами эти блоки данных кодируются определённым образом и передаются через какой-то физический канал.
    На уровне сети - это вполне дискретные сообщения.
    На физическом уровне - это непрерывный поток из сигналов, но не обязательно, тк есть IP over Avian carriers
    img7.jpg
    Смотрим по уровням:
    • Прикладной - тут будет HTTP и прочие прикладные протоколы. Это не совсем интернет, так что пропускаем.
    • Транспортный - TCP и UDP. Так что их тоже пропускаем, тк в "интернете" используются оба.
    • Сетевой - IP и прочие - как раз на этом уровне происходит обмен полезными данными в интернете. Тут нет "непрерывного потока", и как правило общение происходит в виде "фреймов" и "сообщений" с определённым набором полей.
    • Физический - тут всё очень зависит от физической реализации сети


    PS: Но при этом, с точки зрения программы на ПК, TCP-соединение может выглядеть как непрерывный поток байт, но это всё зависит от абстракций.
    Ответ написан
    Комментировать
  • Что из себя представляет интернет соединение?

    nowm
    @nowm
    Самая ближайшая аналогия: вы открываете чат с другом и болтаете минут 20. Несмотря на то, что вы отправляли друг другу много сообщений, все они отправлялись в рамках одного разговора, и вы их считатете связанными. Они были отправлены в рамках этого непрерывного соединения-разговора. «Под капотом» в это время может происходить много разных вещей. Например, чтобы написать сообщение, нужно достать телефон из кармана, разблокировать экран, открыть приложение-чат, выбрать собеседника, кликнуть на поле ввода сообщения, по-очереди нажимать на буквы экранной клавиатуры. Телефон, тоже где-то там под капотом делает много вещей, чтобы обеспечить вам возможность разговора с другом. Но эти детали вас не отвлекают, и вы считаете, что вы просто разговариваете с другом. У вас непрерывное 20-минутное соединение-разговор, даже если вы за эти 20 минут несколько раз доставали телефон и клали обратно.

    То же самое можно сказать про непрерывное соединение клиента и сервера. Оно состоит из отдельных сообщений и кучи телодвижений под капотом, но абстрактно воспринимается как одно соединение, потому что все эти мелкие сопутствующие телодвижения не являются существенными. Но, по сути, на самом низком уровне просто происходит периодический обмен сигналами и их обработка. Никакой непрерывности там и в помине нет.
    Ответ написан
    Комментировать
  • Как написать аудио редактор?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    1) Sound visualizer in C#
    2) How do I record audio with C#/WPF?
    3) Ok Google -> "ffmpeg нормализация звука"
    4) How to cut/crop/trim a video in respect with time ...

    Изучите библиотеку ffmpeg. Она есть под все популярные платформы, и есть биндинги практически под все языки.
    Ответ написан
    1 комментарий
  • Как проверить корретность битовой маски?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас не битовая маска, так как b и c содержат один и тот же бит 2 и отличить c от b|c невозможно. 2|6 === 6. В битовой маске все уникальные некомбинированные флаги должны быть степенями двойки.
    Работать с вашим набором можно, но флаги придётся складывать через +, а проверять своей функцией, наподобие такой:
    function flags($value) {
        if (!in_array($value, [0, 1, 2, 3, 6, 7, 8, 9])) {
            return false;
        }
        $result = [];
        if (in_array($value, [1, 3, 7, 9])) {
            $result[] = 'a';
        }
        if (in_array($value, [2, 3, 8, 9])) {
            $result[] = 'b';
        }
        if (in_array($value, [6, 7, 8, 9])) {
            $result[] = 'c';
        }
        return $result;
    }
    Ответ написан
  • Найдите все пифагоровы тройки, в которых все числа находятся в диапазоне [1; 5000]?

    Alexandroppolus
    @Alexandroppolus
    кодир
    в википедии есть статья про пифагоровы тройки.
    там приведена "формула евклида".
    по ней можно быстро и беспощадно нагенерить примитивные тройки, которые потом ещё домножать на 2, 3, 4,...

    https://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D1%84%D...
    Ответ написан
    5 комментариев
  • Как заменить все вхождения на различные значения?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const format = (value, mask) => {
      let i = 0;
      return mask.replaceAll(/#/g, () => (i < value.length ? value[i++] : '#'));
    }
    format('123456789', '(###)-###-###'); // "(123)-456-789"
    format('123', '(###)-###-###'); // "(123)-###-###"
    Ответ написан
    Комментировать
  • Какие материалы или информацию можно изучить, чтобы решить эту задачу?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    В задаче указаны ссылки на учебные материалы.
    Ответ написан
    Комментировать
  • Как вернуть новый массив объектов только с уникальным id вложенного объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Какие тут есть варианты:

    Object.values(Object.fromEntries(arr.map(n => [ n.user.id, n ])))
    
    // или, если в результирующий массив должны попадать те из "одинаковых"
    // элементов, что расположены в исходном массиве первыми
    
    Object.values(arr.reduce((acc, n) => (acc[n.user.id] ??= n, acc), {}))
    
    // или, если также надо сохранять взаимное расположение элементов
    
    arr.filter(function({ user: { id: n } }) {
      return !(this[n] = this.hasOwnProperty(n));
    }, {})

    Можно решить задачу и в более общем виде - сделаем генератор, выдающий уникальные значения. Принимает в качестве параметров итерируемый объект и признак, по которому осуществляется уникализация (может быть функцией или именем свойства):

    function* unique(data, key = n => n) {
      const getKey = key instanceof Function ? key : n => n[key];
      const keys = new Set;
    
      for (const n of data) {
        const k = getKey(n);
        if (!keys.has(k)) {
          keys.add(k);
          yield n;
        }
      }
    }

    Теперь можно делать так (ваш случай):

    const result = Array.from(unique(arr, n => n.user.id));

    Или так:

    ''.concat(...unique('ABBACADCACDCEACBAEBA')) // 'ABCDE'

    Или так:

    // можете открыть консоль и проверить самостоятельно, сколько
    // элементов в исходной коллекции, а сколько уникальных
    [...unique(document.links, 'href')]
    Ответ написан
    Комментировать
  • Как сделать рекурсию в js await функции?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    При чём тут рекурсия? Обычный цикл:
    let result = false;
    while(result === false) {
      result = await this.download();
    }
    Ответ написан
    3 комментария
  • Терминология: почему контейнеры называют микросервисами?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Нет, контейнер может содержать и монолит и группу сервисов, но это «не принято в приличном обществе».

    Задача контейнеризации - повторяемость и изоляция среды исполнения

    Задача микросервисов - изоляция доступа по контракту и независимый цикл разработки/деплоймента
    Ответ написан
    Комментировать
  • Как защититься от двойного списания в многопоточном приложении?

    @rPman
    Блокировку во время траты уже сказали, но бывает что процесс может длиться достаточно долго, чтобы пользователь в соседнем окошке не смог совершить параллельно оплату (у него будет все висеть), поэтому блокировки реализуют программно

    Добавь к аккаунту пользователя поле lockedBalance, в начале транзакции покупки добавляй к этому значению нужную сумму для траты (а по окончанию эту же вычитай как от сюда так и из общего баланса), соответственно итоговый баланс при проверке считай из разницы основного баланса и этого блокированного. Если транзакция сфейлится, это придется отслеживать, заблокированный баланс так же уменьшай на сумму сделки но не трогай общий.

    более красиво, вместо одного поля, заводи специальную таблицу - текущие сделки, где в соответствии со статусом вычисляй этот заблокированный баланс (статусы сделка начата, сделка совершена или сделка обломилась), это актуально как раз на тот случай, когда сделка совершается достаточно долго чтобы не проводить ее в пределах транзакции базы данных (а то попадет пользователь на момент обслуживания к примеру перезапуск бд на обновление, и его транзакция пропадет), к тому же эта таблица у тебя уже точно есть, только статусов побольше добавить
    Ответ написан
    Комментировать
  • Как можно вычесть свободные отрезки?

    Tash1moto
    @Tash1moto Автор вопроса
    Написал работающий вариант
    const timeline = {start: 100, end: 300 }
    const offsets = []
    const items = [
        { start: 235, end: 270 },
        { start: 135, end: 170 },
    ]
    .sort((a,b) => {
        if(a.end > b.end) {
            return 1
        }
        if(a.end < b.end) {
            return -1
        }
        return 0
    })
    items.forEach((cur, index, arr) => {
        // Start
        if(index === 0) {
            offsets.push({
                start: timeline.start,
                end: timeline.start + cur.start - timeline.start
            })
        }
        // Middle
        if(arr[index+1]) {
            offsets.push({
                start: cur.end,
                end: cur.end + arr[index+1].start - cur.end
            })
        }
        // End
        if(index === arr.length - 1) {
            offsets.push({
                start: cur.end,
                end: timeline.end
            })
        }
    })
    
    console.log(offsets)
    /*
    Result:
    [ { start: 100, end: 135 },
      { start: 170, end: 235 },
      { start: 270, end: 300 } ]
    */
    Ответ написан
    1 комментарий
  • Как отключить выполнение функции Javascript на других страницах?

    @andand44
    Нужно проверять на существование элемент и потом уже обращаться к нему
    if ( document.querySelectorAll(".info-header-tab").length ) {
        alert("Элемент найден!");
    }
    Ответ написан
    2 комментария
  • Как получить текст выбранного option'а?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Поскольку в показанном select'е у option'ов отсутствуют атрибуты value, то их значениями будет их текстовое содержимое. Так что в данном конкретном случае текст можно получить с помощью метода val.

    Ну а вообще:

    $('select').change(function() {
      const text = $(':checked', this).text();
      console.log(text);
    });

    Или, к чёрту jquery:

    document.querySelector('select').addEventListener('change', function(e) {
      const select = this;
      // или
      // const select = e.target;
      // const select = e.currentTarget;
    
      const [ option ] = select.selectedOptions;
      // или
      // const option = select[select.selectedIndex];
      // const option = select.querySelector(':checked');
      // const option = [...select.options].find(n => n.selected);
    
      const text = option.text;
      // или
      // const text = option.textContent;
      // const text = option.innerText;
    
      console.log(text);
    });
    Ответ написан
    Комментировать
  • Как нарисовать плавные струйки дыма?

    DarkWood
    @DarkWood
    Я опишу вам алгоритм, который позволит создать в Illustrator нечто похожее. Подойдет ли оно вам - смотрите сами. Автоматизировать этап создания кривых - крайне сложно. Думаю, из описания сами поймете почему.

    Начинается, собственно, всё с этим самых кривых. Вам нужно две. Чем больше они между собой переплетаются, тем интереснее потом будет узор. Я специально оставил справа ровную часть, чтобы было видно, что она не дает ничего. Если спросите как я сейчас их нарисовал - просто карандашом.

    61802664abff2460020473.png

    Создаете между ними бленд (Ctrl+Alt+B) с дистанцией в 1 пиксель. Можно поставить меньше - тогда переходных кривых будет больше. При толщине контура в 1 пиксель меньше 0.4 пикселя ставить уже особого смысла не будет.

    618026a380abc845121510.png

    Не переживайте, что всё слилось в одноцветье. Кстати, желаемый цвет вы можете задать как сейчас, так и на следующем этапе. Рекомендую делать это как раз там.

    На всякий случай скопируйте бленд (Ctrl+C > Ctrl+F), чтобы была возможность что-то исправить, если последующий результат не понравится.

    Выполните команду Object> Blend> Expand.

    Далее Shift+Ctrl+G

    Задаете малую непрозрачность (около 10%). Как раз сейчас лучше всего менять цвет. Можете также поменять режим смешивания.

    618026b345bc8360746368.png

    Ctrl+G.

    Большее свечение на "петлях" можно сделать дубликатом этой группы (Ctrl+C > Ctrl+F). Эту копию тоже надо будет потом разгруппировать (Shift+Ctrl+G) изменить цвет на более светлый, непрозрачность и режим смешивания по вкусу.

    618026de13dcb347638107.png

    Собственно, узор готов.

    При создании бленда вы можете нарисовать еще одну кривую и расположить ее в панели слоев между двух других. Дальше весь фокус в том, что ей нужно задать цвет фона. И в данном случае цвет других кривых нужно задавать сейчас. Потом тоже можно через команду Recolor Artwork, но это лишние действия.

    618026e910192073261890.png

    Продолжение такое же: Shift+Ctrl+G, меняете прозрачность, режим смешивания и т.п.

    618027083db5a504901276.png

    Можно добавить еще одну кривую цвета фона и переплести ее с остальными. Можно переплетать два бленда от основного цвета к цвету фона и т.д. и т.п.

    Все команды, кроме рисования кривых, прекрасно записываются в экшен.
    Ответ написан
    2 комментария
  • Как получить счастливое число?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Тут всё плохо:
    function isHappy(array){
      // записываем пустой массив в array
      // (не важно что там мы получили, теперь этого нет)
      array = [] 
      // получаем 6 переменных с значением "ничего"(undefined)
      let[x,y,z,b,n,v] = array
      // сравниваем x+y+z == b+n и выкидываем, никак не используя
      // с помощью оператора запятая(,) в if попадает только v
      // как мы знаем во всех переменных undefined - if(undefined) - ложь
      if(x+y+z == b+n,v){
        console.log(`Число ${array} - счастливое!`);
      }
      else{
        console.log(`Число ${array} - несчастливое`);
      }
    }
    // вызываем isHappy с аргументом 000000, который является числом 0, 
    // просто записанным длинно, а не массивом
    isHappy(000000)
    Ответ написан
    8 комментариев