Задать вопрос
  • Как работать с методом groups.getMembers вконтакте с помощью JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Посмотрите мой открытый проект по сбору списка всех Участников сообщества. Только JavaScript. Демо.

    Реализация с web worker'ом и учётом времени выполнения запросов, чтобы не вылезти за лимит трёх запросов в секунду.
    Ответ написан
    Комментировать
  • Можно ли подключить бота к вк, чтобы он обрабатывал заявки от пользоватлей?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Создать бота, который сумеет общаться по четкому сценарию, и собеседник не будет испытывать иллюзий, что общается с живым человеком – можно.
    Ответ написан
    Комментировать
  • Как настроить функцию для передачи различных значений?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Внутри возвращаемой функции запоминайте значение:
    function nds( cost) {
      return function() {
        var _cost = cost;
        var result = _cost * 1.13;
        console.log( result.toFixed(2));
      }
    }


    Так возвращаемый экземпляр функции будет содержать в себе переданное значение.

    var a = nds(53);
    var b = nds(12);
    a(); // 59.89
    b(); // 13.56


    Upd. для общего счётчика придётся завести переменную, видимую из всех функций:
    var total = 0;
    
    function nds( cost) {
      return function() {
        var _cost = cost; // запомнили внутри цену
        var result = _cost * 1.13; // добавили НДС
        total += result; // добавили к общей сумме
        console.log( "result:", result.toFixed(2), "total:", total.toFixed(2));
      }
    }
    
    var a = nds(53);
    var b = nds(12);
    
    a(); // result: 59.89 total: 59.89
    b(); // result: 13.56 total: 73.45
    a(); // result: 59.89 total: 133.34
    a(); // result: 59.89 total: 193.23
    Ответ написан
    2 комментария
  • Как правильней будет фильтрация периода?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Это следует из бизнес-логики: что нужнее пользователю? Не уверены, спросите пользователей.

    Вопрос относится не только к неделям – ко всем периодам. Вариант 1 с привязкой к календарной сетке будет давать пилообразно нарастающие показатели, в зависимости от времени, когда запрошены данные. Вариант 2 будет давать среднее значение (running average) за выбранный период.

    И будьте тогда уж постоянны. «За сутки» – с 00 до 23:59 по часовому поясу пользователя, или за последние 24 часа с текущего момента. «За месяц» – за текущий месяц, обнуляя в начале каждого и нарастая к концу, или среднее значение за последние 31 день | календарный месяц до такого же числа предыдущего месяца? «За год» – за этот год (1-го января минимум, в декабре максимум) или до такой же даты прошлого года.

    Скажем, для оценки пользователем скорости расходования средств на счёте могут быть полезны оба варианта. Средний расход за последние 7 дней удобно сравнивать с расходом за пред-предыдущие 7 дней. А привязка к календарному месяцу поможет спрогнозировать сумму счёта к оплате на конец месяца, если списывание происходит 1-го числа.
    Ответ написан
    1 комментарий
  • Как Вы защищаете свои сайты на nginx?

    Мнение: пускайте траффик через CloudFlare – они умеют фильтровать часть угроз.

    Прочие угрозы и дыры в безопасности существуют на уровне PHP и движков и веб-сервером почти не фильтруются. Можно анализировать логи на типичные паттерны скажем, fail2ban'ом.
    Ответ написан
    Комментировать
  • Тематика курсовой работы?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    С уклоном в математику: задача поиска максимальной биклики в двудольном графе применительно к данным ВК. Взять любую аудиторию, например, подписчиков одной какой-то группы. Получить все группы, на которые они подписаны. Найти среди них наибольшую клику: т.е. тот набор групп, на которые подписан наибольший набор аккаунтов.
    Ответ написан
    Комментировать
  • Зачем в данном примере this, если с именем обьекта тоже работает?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В вашем примере разницы нет и this удобнее только тем, что при переименовании "arr" не придётся ещё две замены делать.

    Хотя, если дальше вы используете наследование, то разница принципиальна. Например, создать новый объект, используя arr как прототип:
    var arr = {
      "name" : "Stive",
      "age" : 29,
      "all" : function() { return this.name + " " + this.age; }
    };
    var b = Object.create(arr);
    b.name = "Bill";
    b.age = 39;
    b.all();

    С this в arr код для b выполнится нормально и вернёт "Bill 39", а если в arr вместо this было прямое указание на arr, то вернёт "Stive 29".
    Ответ написан
    Комментировать
  • Почему неправильно работают операторы с 64 битным числом?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Самое большое целое в JS: (253 - 1)

    Минимальное целое: (-(253 - 1))

    (источник)

    Операнды всех битовых операций конвертируются в 32-х битовые целые со знаком представленные в дополнительном коде и с использованием порядка битов от "старшего к младшему".

    Битовые операции с 64-битными – никак. Бейте на два 32-битных.
    Ответ написан
  • Суть 3 строки,если можно подробно "по символам грубо говоря"?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    ! ! ~ s.indexOf( substring) – такая короткая запись означает «есть ли подстрока?»

    Как это работает. Метод объекта строки indexOf() возвращает найденное положение подстроки в строке: число от 0 и больше; или –1, когда подстрока не найдена. На деле часто требуется из этого получить true или false – когда интересует лишь, есть подстрока или нет, а позиция её безразлична. Из –1 нам надо получить false, а из всего остального true.

    Для этого используются побитовое НЕ ~ и логическое НЕ !

    ~ обладает замечательным свойством: только из –1 получается 0 (а из нуля –1): ~(-1) === 0

    ! является логическим оператором и его результат – true или false. Например, !5 === false, а !0 === true.

    Это почти то, что нужно, с точностью до наоборот – в случае 0 нужен false, а не-нуля true. Поэтому добавляем ещё одно логическое НЕ. Вот и получается !!~:
    !!~5 === true;
    !!~0 === true;
    !!~-1 === false;


    В вашем примере не один indexOf(), а в скобках перечислены несколько вариантов: (~s.indexOf('AAA') || ~s.indexOf('BBB')).

    || – это логическое ИЛИ. Проверяется слева направо, пока не найдётся первое выражение, которое конвертируется в true, и возвращается его значение как есть, без конвертации в true/false. Например:
    ( false || 5) === 5;
    ( 0 || 0 || 1 || 0) === 1;
    ( 5 || 1 || true) === 5;
    ( false || 0) === 0;


    Значит, несколько ~s.indexOf(substr) будут проверяться до тех пор, пока какой-то не вернёт не-нулевое значение.
    Ответ написан
    Комментировать
  • Как создать своего бота для vk "FAQ"?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Только оптимизация:
    1. минимизировать число вызовов API ВКонтакте. Для ответа 1 пользователю нужно а) пометить прочитанным входящее сообщение и б) отправить ответ. Это 2 вызова API. До 25 вызовов API можно упаковать в один execute() – так получится отвечать 12 пользователям за 1 вызов execute() и при лимите в 3 вызова в секунду – 36 пользователям в секунду.
    2. следить за кол-вом вызовов в секунду и не превышать этот лимит: где-то, например, в Redis, держать времена трёх последних вызовов к API. При желании выполнить очередной доставать эти времена и принимать решение: выполнять сразу или подождать N миллисекунд.
    3. очередь – сообщения обрабатывать не мгновенно при получении сигнала от callback api, а помещать их в очередь. Рабочий процесс берёт из очереди задачи и выполняет – группирует в пачки по 24 и отправляет – с учётом времени предыдущих трёх овтетов.

    При такой организации вам хватит одного слабенького сервера и вы сможете приблизиться к теоретическому пределу в 36 сообщений в секунду.
    Ответ написан
    8 комментариев
  • Как правильно написать бота вк?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Не отвечайте мгновенно. Помещайте задания на ответ в очередь.

    Так вы всегда впишетесь в лимит вк по числу вызовов методов апи на 1 токен, в секунду.
    Ответ написан
    3 комментария
  • Что такое выражение, литерал и инициализация в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    По-простому я бы объяснил так:
    • выражение – это любой кусок кода, который в итоге даёт значение. Напр. цифра 0 или a===b
    • литерал – это буквально записанное значение. Напр. 10 или "строка" или объект {a:10, b:20}
    • инициализация – придание начального значения. Напр. переменной при создании: var a = 10
    Ответ написан
    3 комментария
  • Насколько легко(или сложно) будет злоумышленнику похитить access_token из local storage?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Подробный разбор этого вопроса на английском языке. Вкратце – советуют использовать Cookies.
    Ответ написан
  • Как отложить выполнение обещания (promise)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно «разорвать тред», обернув в setTimeout( ()=>{...}, 0):

    var promise = new Promise( function (ok, fail) {
      setTimeout( function() {
        console.log('1');
        ok();
      }, 0);
    });
    // Здесь функция обещания ещё не выполнена.
    console.log('2');
    promise.then(function () {
      console.log('3');
    });
    // 2 1 3


    Promise, не содержащий в себе асинхронного вызова, синхронно возвращает значение. То же самое, как:var promise = Promise.resolve( value);
    Ответ написан
  • Str.IndexOf в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1) – поиск начинается со 2-й позиции вправо:
    01234567890123
    Widget with id
    ..|=>.......^


    2)
    var str = "Widget with id";
    
    alert( str.indexOf("Widget") ); 
    // 0 – прямо с нулевой позиции найдено совпадение
    
    alert( str.indexOf("id") );
    // 1 – находится первое же совпадение, после "W" идёт "id":
    // 01234567890123
    // Widget with id
    // .^............
    
    alert( str.indexOf("widget") ); // –1 значит «не найдено». W не равно w
    Ответ написан
    Комментировать
  • Как вычислить точную разницу между датами в годах?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Создаём два объекта Date, день рождения и сейчас. Чтобы гарантированно правильно получить из текстовой строки объект даты, надо привести её сначала к формату ISO 8601 – самое простое, заменить пробел на букву "T". Но такая дата будет в часовом поясе UTC, надо её скорректировать, добавив минуты из getTimezoneOffset(). Например, дата "2014-09-12 00:00:00" по Мск, это 11 сентября 21:00 по UTC. При сравнении из «сейчас» будем брать время по UTC – getUTCMonth() и т.п.

    Получив две даты, сравним их месяца, даты. Если нужна бОльшая точность, то ещё и часы, минуты, секунды:
    var sqlDT = "2014-09-12 00:00:00";
    var BD = new Date( sqlDT.replace(' ','T'));
    var Now = new Date();
    BD.setMinutes( BD.getMinutes() + Now.getTimezoneOffset()); // в UTC
    
    if( BD.getMonth() === Now.getUTCMonth()
      && BD.getDate() === Now.getUTCDate()
    ) {
      // ура! День рождения!
    }


    P.s. альтернативный вариант – подключить здоровенную библиотеку для работы с датами и временем – MomentJS, и найти подходящие методы в ней.
    Ответ написан
    Комментировать
  • Какой тип монетизации выбрать для SAAS сервиса?

    Тут вряд ли находится ЦА сервиса слайдшоу.

    Почему бы не двигаться путём проб и ошибок предлагая сегментам аудитории разные планы оплаты – и сравнивая, смотреть, что лучше работает.

    Или взять 10–20 человек, которые могли бы быть вашими клиентами, и, индивидуально показав им сервис, проинтервьюировать – надо понять, что с их точки зрения обладает какой относительной ценностью среди фишек вашего продукта.
    Ответ написан
  • Почему градиент в photoshop полосатый?

    В опциях градиента включите галочку Dither
    Ответ написан
    Комментировать
  • В чём разница между background и background-color?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    CSS свойство background – это просто сокращение, позволяющее одним значением установить сразу несколько из свойств background-*:
    • background-clip
    • background-color
    • background-image
    • background-origin
    • background-position
    • background-repeat
    • background-size
    • background-attachment

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

    Таким образом, background: #F90 полностью эквивалентен background-color: #F90

    Например, background: #F90 url(fon.jpg) repeat-x равен
    background-color: #F90;
    background-image: url(fon.jpg);
    background-repeat: repeat-x;


    Цвета – разные цветовые модели бывают удобны для разных задач. Например, в модели HSL легко «гасить» свет, изменяя только его компоненту L (яркость), или только уменьшая насыщенность S. Или получить палитру из нескольких цветов, одинаково ярких-сочных, но равномерно разбросанных по кругу оттенков, равномерно раскидав их H по цветовому кругу, а S и L оставив одинаковыми.
    Ответ написан
    Комментировать
  • Самые крупные проекты на node.js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    • Walmart
    • E-bay / PayPal
    • Microsoft (Azure)
    • LinkedIn
    • Yahoo
    • Google
    • Yammer (приобретён Microsoft)
    • Netflix
    • Uber
    источник
    Ответ написан
    2 комментария