Задать вопрос
  • Как обнулить setInterval?

    profesor08
    @profesor08 Куратор тега JavaScript
  • Можно ли соединиться с VPN через VPN?

    markus_saar
    @markus_saar
    CEO at hidemy.name
    Отвечая на первую часть вашего вопроса: для запуска одного и другого приложения VPN вам потребуется разграничить их работу. Например, один VPN настроить на роутере, а другой запускать на компьютере. Либо один запустить в рамках основной операционной системы, а второй запустить внутри виртуальной машины на этом же компьютере.

    Про вторую часть вопроса: почти так. Один VPN не будет знать, откуда вы соединяетесь, но другой может об этом знать, если такие вещи интересуют владельцев сервиса. Читайте их политику конфиденциальности, изучайте репутацию.

    Подытожив, могу сказать, что большого смысла в двух VPN нет. Вы замедлите свою интернет-скорость, а значительного повышения приватности не получите.

    Другое дело, если первый VPN-сервер будет ваш собственный, а дальше уже с него подключаться к VPN-сервису для более широкого выбора серверов, IP-адресов и т.д. В итоге схема может быть такой: свой VPN подключен на роутере, а на компьютере уже установлена программа VPN-сервиса.

    Но подумайте, действительно ли вам требуется такая параноидальная схема, или лучше позаботиться о других местах, где приватность страдает значительно сильнее? В начале этого года публиковал на Хабре, почитайте: Не VPN-ом единым. Шпаргалка о том, как обезопасить....
    Ответ написан
    Комментировать
  • Как найти одинаковые значения в двух массивах?

    longclaps
    @longclaps
    Эффективнее пользоваться встроенными в голову мозгами, при наличии.

    Можно ручками написать слияние:
    let one = ['one', 'two', 'three', 'four', 'five'];
    let two = ['a', 'b', 'five', 'c', 'one'];
    one.sort();
    two.sort();
    let i = one.length, j = two.length, three = [];
    while (i > 0 && j > 0) {
        i--;
        j--;
        if (one[i] > two[j]) j++;
        else if (one[i] < two[j]) i++;
        else three.push(one[i]);
    }
    console.log(three);
    Можно воспользоваться библиотекой:
    const _ = require("lodash");
    console.log(_.intersection(one, two));
    Можно воспользоваться встроенным классом Set (пусть будет задание на дом).

    ps Developer, увидишь Кнута - передавай привет.
    Ответ написан
  • Как реализовать рекомендательную систему по формуле Байеса?

    barmaley_exe
    @barmaley_exe
    Видимо, речь идёт о наивном Байесовском классификаторе.

    Во-первых, поставим проблему чуть иначе: вместо рекомендациях следует говорить о классификации на 2 класса (нравится или не нравится).

    Далее, наивный Байесовский классификатор основывается на 2 идеях: собственно, Теорема Байеса и условная независимость признаков объектов.

    Пусть P(like|x) — вероятность того, что данному пользователю понравится объект x, описывающийся характеристиками x1, ..., xn. Эти характеристики могут быть совершенно произвольными, не обязательно одного "типа". Вопрос лишь в том, какое вы зададите на них распределение. Очевидно, что если вероятность P(like|x) > 1/2, то вероятность негативной оценки будет меньше, а значит, нужно предсказывать "нравится". Таким образом, нашей задачей является оценить вероятности P(like|x) и P(dislike|x) (которая, в свою очередь равна 1-P(like|x), поскольку сумма вероятностей равна 1) и выбрать наибольшую.

    Тут самое время применить теорему Байеса:

    P(like|x) = P(x|like) P(like) / P(x) и P(dislike|x) = P(x|dislike) P(dislike) / P(x)

    Примечательным фактом является то, что знаменатель мы можем проигнорировать, ведь он один и тот же для P(like|x) и P(dislike|x), а нас интересует только соотношение между этими числами, а не они сами. Тогда сравнивать мы будем P(x|like) P(like) и P(x|dislike) P(dislike). В данном случае P(like) выражает наши априорные знания о том, насколько вероятно, что объект понравится пользователю. Если таких знаний нет, можно смело брать 1/2.
    P(x|like), в свою очередь, описывает, насколько вероятно встретить такой объект в классе понравившихся. Вся наивность рассматриваемого классификатора заключается именно в моделировании этого распределения.

    Поскольку вероятность P(x|like) может зависеть от x самым причудливым и произвольным образом, нам нужно сделать какое-то предположение. В случае наивного Байесовского классификатора этим предположением выступает ничем не подкреплённая гипотеза условной независимости признаков объекта при заданном классе, то есть: P(x|like) = P1(x1|like) ... Pn(xn|like). Здесь Pk — произвольное распределение, оно может быть как дискретным (цвет или тип, в Вашем случае), так и "непрерывным" (клиренс). Данные распределения должны быть выбраны разработчиком классификатора. Обычно они содержат какие-то параметры, которые мы в дальнейшем настроим по данным с помощью метода максимального правдоподобия. Для многих распределений оценки можно выписать аналитически. Например, для дискретных признаков можно посчитать эмпирическую частоту значения (плюс сглаживание для тех объектов, которые пользователь ни разу не видел), а для нормального распределения посчитать выборочное среднее и дисперсию.

    Резюмируя, ответы на Ваши вопросы:

    1. Формула Байеса имеет такое же отношение к Байесовскому классификатору, какое дерево к столу. Да, формула используется, но это ещё не всё.

    2. Про известные подходы ничего не скажу, но на ум приходит следующее: при классификации можно сравнивать не произведение вероятностей, а его логарифм (благодаря его монотонности) log(P1(x1|like) ... Pn(xn|like)) = log(P1(x1|like)) + ... + log(Pn(xn|like)). Чем больше эта сумма — тем больше вероятность лайка. Можно попробовать взвесить эти слагаемые.

    3. На отдельные признаки можно задавать произвольные распределения, например, нормальное для численных значений.

    Теперь о проблемах: вышеописанный подход хорош, но обладает существенным недостатком: если применять её ко всем пользователям без разбору, то получится модель среднего пользователя, которое будет рекомендовать всем одно и то же. Фишка же рекомендательной системы заключается в персонализации. С другой стороны, если строить по байесовскому классификатору на пользователя, скорее всего, Вам не хватит данных для получения каких-либо значимых результатов. Со второй проблемой можно бороться, если принять во внимание существование похожих пользователей: Если Алиса заинтересовалась объектами {A, B, C, D}, а Борису понравились {B, C, D, E}, то наивный Байес либо усреднит их со всеми остальными (представим, что существует 1000 пользователей, заинтересовавшихся объектом P. Тогда его "вес" будет существенно больше, но только лишь благодаря его популярности, а ведь для нахождения наиболее популярных объектов хватит и простой сортировки), либо построит для обоих по собственному классификатору, даже не подозревая о том, что эти пользователи похожи. Одним из подходов, учитывающих это, является коллаборативная фильтрация, наиболее активно используемая в задачах рекомендации.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы ключи в объекте шли по очереди даже после удаления?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Есть такая штука - массив называется. Попробуйте как-нибудь.
    Ответ написан
    4 комментария
  • Что делать, когда умеешь программировать, но нет идей?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Открываешь upwork, ищешь подробно описанные заказы, реализуешь их.
    Ответ написан
    Комментировать
  • Асинхронный генератор и обещание массив?

    @StockholmSyndrome
    обратите внимание, что в setTimeout нужно передавать resolve, а не результат её вызова
    const promiseList = [
      new Promise(resolve => setTimeout(resolve, 200, 15)),
      new Promise(resolve => setTimeout(resolve, 600, 17)),
      new Promise(resolve => setTimeout(resolve, 500, 42))
    ];


    async function* promiseGenerator(arrPromise) {
      const result = []; 
      const push = (val) => result.push(val);
    
      const promises = arrPromise.map((promise) => promise.then(push));
      await Promise.all(promises); 
    
      for (let i = result.length - 1; i >= 0; --i) {
        yield result[i];
      }
    }
    Ответ написан
    1 комментарий
  • Как сделать web страницу с генератором картинки?

    это можно сделать на Canvas
    у него есть экспорт картинки в виде dataURL
    Ответ написан
    Комментировать
  • Как определить переменную в цикле?

    MalkovVladimir73
    @MalkovVladimir73
    Fullstack (node + vue.js)
    По моему мнению вам следует использовать объект и обращаться к его свойствам.
    Ну а ваш пример можно сделать рабочим примерно так:
    function example() {
      for (let i = 1; i <= 3; i++) {
        this['zp' + i] = prompt('Введите зарплату '+ [i]+ ' сотрудника');
      }
    
      console.log(zp1, zp2, zp3);
    }
    
    example();
    Ответ написан
    Комментировать
  • Как проверить, что у массивов есть одинаковые элементы?

    @dimoff66
    Кратко о себе: Я есть
    Или...
    new Set([...arr1, ...arr2]).size < arr1.length + arr2.length


    Или

    arr1.find(v => arr2.includes(v))

    Если массивы отсортированы, то самый быстрый код будет следующий (букв много но операций будет максимум сумма длинн массива)

    function arrayHaveMatches(arr1, arr2) {
        const arrays = [arr1, arr2]
        const indexes = [0, 0]
        let currArray = arr2[0] < arr1[0]
        let val2 = arrays[!currArray][0]
    
        while (indexes[currArray] < arrays[currArray].length) {
          const val1 = arrays[currArray][indexes[currArray]]
          if (val1 === val2) {
            return true
          } else if (val1 > val2) {
            currArray = !currArray
            val2 = val1
          }
          indexes[currArray] ++
        }
        
        return false
      }
    Ответ написан
    2 комментария
  • Как вложить элементы массива друг в друга начиная с конца?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const result = array
      .concat(obj)
      .reduceRight((acc, n) => ({
        ...n,
        children: acc ? [ acc ] : [],
        // или, если вдруг исходные массивы непустые,
        // и их содержимое надо сохранить
        // children: n.children.concat(acc || []),
      }), null);

    Непонятно только, зачем вложенные массивы из одного элемента? Можно класть в объект просто ссылку на следующий объект, получится обычный связный список:

    const result = [ ...array, obj ].reduceRight(
      (acc, { children, ...n }) => (n.next = acc, n),
      null
    );
    Ответ написан
    1 комментарий
  • Как закрыть XMLHttpRequest от общего доступа?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В дополнение к Сергей Соколов могу подсказать следующий этап: защита от кражи сессии. Это делается путем нумерации запросов. То есть каждый запрос передается число, которое на 1 больше предыдущего. Так что даже если кто-то украдет сессию и сможет ее использовать, у пользователя она протухнет и вы сможете показать ему ошибки рассинхронизации. И уже сам пользователь начнет искать злоумышленника.

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

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Если вам нужно защитить данные в javascript коде от постороннего вмешательства, то вам не нужно эти данные размещать в javascript коде.
    Ответ написан
    Комментировать
  • Как быстро засыпать чтобы было больше времени на изучение программирования?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Вот так: https://www.adme.ru/zhizn-nauka/kak-zasnut-za-2-mi...
    Ну или заняться сексом с любимой девушкой, после хорошего секса отрубаешься моментально.
    Ответ написан
    5 комментариев
  • Как создать массив со случайными числами без повторений?

    const array = Array.from({ length: 20 }, (v, i) =>
      Math.floor(Math.random() * (10 - 1) + 1 ));
    const set = new Set(array);
    const result = [...set].slice(0, 5);
    console.log(result);


    или так
    const array = Array.from({ length: 10 }, (v, i) => i)
      .sort((a, b) => 0.5 - Math.random())
      .slice(0, 5);
    console.log(array);
    Ответ написан
    Комментировать
  • Где отслеживать IT-мероприятия Москвы?

    kores
    @kores
    Помог ответ? Отметь решением!
    https://ict2go.ru/events/?region=4&event_type=&eve... Сразу с фильтрами на москву, точно все не успеешь пройти, там их завались!)
    Ответ написан
    Комментировать
  • Как сократить код, используя тернарный оператор?

    return (answer => answer % 1 ? -1 : answer)(value / n);

    Или со сжатием:

    return(a=>a%1?-1:a)(value/n)

    Но лучше оставьте, как есть.
    Ответ написан
    Комментировать
  • Как правильно сравнить десятичные числа в JS?

    SagePtr
    @SagePtr
    Еда - это святое
    Math.abs(x - y) <= 0.01 к примеру
    Ответ написан
    2 комментария