• Какие сервисы для продажи js скриптов, вы знаете?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    github, за «звёзды» : )
    Ответ написан
    Комментировать
  • Как сделать, чтобы при наведении мышкой на элемент, его цвет менялся случайным образом каждый раз?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Функция, меняющая цвет, всего в две строчки:
    var randomColor = function(e){
      var r = () => Math.round(Math.random()*255);
      e.target.style.color = "rgb(" + [r(),r(),r()].join(',') + ")";
    }


    С jQuery её повесить, например, на заголовок вопроса тут:
    $('H1.question__title').on('mouseover', randomColor);

    Или на чистом JavaScript:
    document.querySelector('h1.question__title')
      .addEventListener('mouseover', randomColor);
    Ответ написан
    Комментировать
  • Как получить токен вк из строки iframe?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Никак, не поднявшись «над» браузером:
    • установленное в браузер расширение;
    • полностью подконтрольный безголовый браузер типа PhantomJS;
    • web view в вашем приложении
    Ответ написан
    2 комментария
  • Как рассчитать количество рабочих дней, исключая праздники и выходные (php)?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Тут данные о праздничных днях: basicdata.ru/api/calend

    Остальное - банальное программирование.
    Ответ написан
    Комментировать
  • Говнокод или нет?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Код г-но неидеален, и вот, почему:
    см. комменты в коде
    let a = prompt("Enter a value", 10); // a, b, c дальше не меняются
    let b = prompt("Enter b value", 10); // поэтому можно
    let c = prompt("Enter c value", 10);  // const
    let result;
    let discr = (b * b ) - 4 * a * c;
    let sqrtDiscr = Math.sqrt(discr); // при отрицат. discr здесь NaN
    if(a === 0 && b === 0 && c === 0) { // проверяем уже после вычислений
      throw new Error("The values must be bigger than 0");
    } else if(discr < 0 ){ // проверяем уже после вычисления sqrtDiscr
      throw new Error("This Equation have not solution");
    } else if(discr === 0 ){
      console.log("This Equation have only 1 solution")
      result = (-b) / (2 * a);
    } else if (discr > 0){
      console.log("This Equation have 2 solution");
      result = (- b + sqrtDiscr) / (2 * a) + ";     " + (- b - sqrtDiscr) / (2 * a);
    }
    
    console.log(result);


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

    Ещё вы не проверили случай, когда a === 0: у вас будет деление на ноль.
    Ответ написан
    2 комментария
  • Как правильно использовать attachments в Callback API?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    В документации метода messages.send() описано поле attachment. В этом поле просто через запятую идут строки типа photo-123_456, идентифицирующие прикладываемые картинки.

    Модифицируйте ваш метод отправки:
    public function msgSend($msg, $uid, $token, $attachment = '' ){	
        $request_params = array(
          'message' => $msg,
          'user_id' => $uid,
          'attachment' => $attachment,
          'access_token' => $token,
          'v' => self::API_VERSION
        );

    и вызывайте его, когда нужно приложить картинку, с дополнительным параметром:
    $v->msgsend("мои команды", $uid, $token, "photo-123_456");

    где подставьте значения для вашей картинки.
    Ответ написан
    5 комментариев
  • Как Firefox запретить обновления?

    1. about:config
    2. согласиться с предупреждением, что на свой страх и риск лезете под капот;
    3. найти ключи по фразе app.update
    4. app.update.auto поставить на false
    5. app.update.enabled поставить на false
    6. app.update.silent поставить на false
    скрин
    3533b9a887164f1aa93f0fe0f6248990.png
    Ответ написан
    4 комментария
  • Как правильно списать бонусы?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    В БД держать записи про каждое начисление бонуса:
    1. dt_created дата-время поступления;
    2. dt_void дата-время обнуления этого бонуса: через 2 года, а может, и другие правила введете;
    3. value_in сколько начислено;
    4. value_out сколько списано.
    Алгоритмы:
    • Для подсчёта числа актуальных баллов, бежим по непросроченным (Now() < dt_void) и суммируем (value_in - value_out).
    • Для списания при покупке бежим от старых к новым, набирая максимально допустимое для списания число баллов и обновляем value_out.
    Ответ написан
    2 комментария
  • Как реализовать выстраивание изображений в плитку как это делает Вконтакте?

    deNULL/Paver.js от бывшего разработчика ВК. Демо.
    Ответ написан
    Комментировать
  • Как удалить неактуальные задачи из очереди в Laravel?

    Добавьте трейт Illuminate\Queue\InteractsWithQueue – с ним появится метод delete().

    Посмотрите секцию документации Manually Accessing The Queue.
    Ответ написан
    Комментировать
  • Как обеспечить избыточную целостность?

    Вместо «заключённых» мне проще представлять жесткие диски, флешки или абстрактные контейнеры с данными.

    Для проверки на устойчивость будем рассматривать наихудшую ситуацию намеренного удаления злыми «наздирателями» комбинации контейнеров, приносящей гарантированный урон целостности.

    В каждом хранится «своё» значение + 1 значение из «предыдущего». На деле, неважно, какого именно, т.к. последовательность их более никак не играет. В этой ситуации гарантировано сохранение данных только при удалении 1 единственного контейнера. Т.к. вторым непременно выберем тот, что хранит избыточно данные первого.

    Удаляем N контейнеров. Цель – начисто удалить данные хотя бы одного. Т.е. выбираем все те, кто хранит избыточно данные этого «избранного».

    Единственный вариант защититься – хранить избыточно в N+1 контейнерах. Вернее, число копий каждой единицы данных должно быть на 1 больше потенциально удаляемых. По алгоритму не усложняя можно хрниать в N следующих.
    Ответ написан
  • Как составить все возможные комбинации?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Рекурсивный алгоритм:
    1. На первой позиции должна побывать каждая из букв.
    2. Выбрали первую – надо всеми возможными способами перебрать оставшиеся. Смотрим на задачу точно так же: из (n - 1) букв надо перебрать все варианты. Go to 1)
    мопед – мой
    function permut8(arr, prepend) {
      var i, version, el, result = [];
      prepend = prepend || [];
      if(arr.length === 1) return [arr];
      for( i=0; i<arr.length; i++) {
        if( arr.length === 2) {
          result.push( prepend.concat( [arr[i], arr[(i+1)%2]] ));
        } else {
          version = arr.slice();
          el = version.splice(i,1);
          result = result.concat( permut8( version, prepend.concat(el)));
        }
      }  
      return result;
    }
    
    var test = permut8( 'abcd'.split('') );
    test.map( e=>e.join(' ')).join("\n")
    /*
    a b c d
    a b d c
    a c b d
    a c d b
    a d b c
    a d c b
    b a c d
    b a d c
    b c a d
    b c d a
    b d a c
    b d c a
    c a b d
    c a d b
    c b a d
    c b d a
    c d a b
    c d b a
    d a b c
    d a c b
    d b a c
    d b c a
    d c a b
    d c b a
    */
    Его минус в том, что он не учитывает значения элементов. Если встретятся повторяющиеся – создадутся дублирующиеся варианты. Например, из ["a", "a"] получим два одинаковых [["a", "a"], ["a", "a"]]

    Нерекурсивный алгоритм.
    longclaps говорит, давай, мол, напишем, чтобы корректно без повторов генерил и при повторяющихся элементах.

    Использовал известный с 14 века нерекурсивный алгоритм индуса Нарайана Пандита. Из любого порядка в массиве генерится следующая итерация, учитывая лексикографический (по алфавиту) порядок сортировки.
    Мопед – мой, мыт
    function nextLexInPlace(arr){
      var i, a = -1, b = -1;
      for( i = 0; i < arr.length-1; i++) if(arr[i] < arr[1+i]) a = i;
      if( !~a) return; // no more permutations
      for( i = a + 1; i < arr.length; i++) if(arr[a] < arr[i]) b = i;
      swap(arr, a, b);
      a++;
      b = arr.length - 1;
      while( a < b) swap(arr, a++, b--);
      return true;
    }
    
    function swap( arr, a, b) {
      var xx = arr[a];
      arr[a] = arr[b];
      arr[b] = xx;
    }
    
    function allMutations( source) {
      var result = [], arr = source.slice();
      result.push( arr.sort().slice());
      while( nextLexInPlace(arr)) result.push(arr.slice());
      return result;
    }
    
    var test = ['a','c','c']; JSON.stringify( allMutations(test))
    // [["a","c","c"],["c","a","c"],["c","c","a"]]

    И тот же мопед, но
    с генератором
    function* permutator(arr) {
      var i, a, b;
    
      function swap( arr, a, b) {
    		var xx = arr[a];
    		arr[a] = arr[b];
    		arr[b] = xx;
    	}
      
      yield arr.slice();
    
      while(true) {
        a = -1, b = -1;
    		for( i = 0; i < arr.length-1; i++) if(arr[i] < arr[1+i]) a = i;
    		if( !~a) return;
    		for( i = a + 1; i < arr.length; i++) if(arr[a] < arr[i]) b = i;
    		swap(arr, a++, b);
    		b = arr.length - 1;
    		while( a < b) swap(arr, a++, b--);
    		yield arr.slice();
      }
    }
    
    function allMutations( source) {
      var all = [], result, G = permutator(source.slice().sort());
      while(true) {
        result = G.next();
        if(result.done) break;
        all.push( result.value);
      }
      return all;
    }
    
    var test = ['a','c','c']; JSON.stringify( allMutations(test))
    // [["a","c","c"],["c","a","c"],["c","c","a"]]
    Ответ написан
    Комментировать
  • Защита скрипта через cURL, как реализовать?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Домен - проверяйте, чтобы ip, с которого пришел запрос, совпадалис тем, в который ресолвится заявленный домен.
    Ответ написан
    1 комментарий
  • VK API отклоняет запросы наобум, ссылаясь на высокую частоту. Как решить?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Вы учитываете время обработки запроса и доставки, или считаете только стартовые моменты?

    Запросы имеют длину. Если ответ на какой-то из трёх вы заканчиваете принимать уже после 1000ms, то только после его окончания стоит отправлять четвёртый.

    Если всё быстро и ответы приняли, вписавшись в 1000ms, надо выдержать какой-то минимальный гэп после 1000 ms перед четвёртым запросом. На всякий пожарный.
    Ответ написан
  • Как реализовать Вращение объекта за хвостик Javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Math.atan2() возвращает угол в радианах. Их же можно потом использовать в transform: rotate( 123rad);

    Потом, не забывайте, что изначально ваш угол больше на 1/8 оборота, поэтому из полученного угла надо вычесть PI/4.

    Сделал по-своему пример.

    Хотел было добавить transition: transform 0.08 для плавности, но появляется проблема перескок при пересечении нуля. Когда угол вдруг меняется с минус-Пи на плюс-Пи, глупый transition проводит крутилку через полный оборот.
    Ответ написан
    5 комментариев
  • Можно ли забирать токен пользователя?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Прямой ответ на вопрос: можно.

    Причём достаточно передавать только токен, т.к. по нему легко узнать id юзера, выполнив users.get() без параметров с этим токеном.

    Другое дело, что в целом такая «защита» ненадёжна. Всё, что делается у клиента – подделывается. Приложение можно модифицировать, чтобы отправлять всегда некую статичную пару токен+серийник, скачанную у пиратов.

    Я думал над защитой через использование хранимых процедур на сервере ВК. Т.е. приложение вызывает не методы ВК напрямую, а хранимые процедуры, код которых доступен только автору приложения. Внутри процедур можно осуществлять проверку валидности данного юзер id. Для небольшого количества лицензий вполне вариант. Для большого - нет.
    Ответ написан
  • Как перебрать массив?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сделать объект, где ключами будут эти значения id (при повторном назначении дубля не возникает).
    Потом забрать ключи (как строки) и отдать их как массив чисел.
    Object
      .keys(
        groups.reduce((p,c) => { c.items_ids.map(e => p[e] = e); return p; }, {})
      )
      .map(
        s => parseInt(s)
      )
    Ответ написан
    Комментировать
  • Как правильней сложить дробные числа?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Первый вариант – расслабиться и получать удовольствие. Позволить числам складываться, как им удобнее. И только при выводе результатов помнить, что дробная часть может быть неприлично длинной.

    Второй вариант, если бОльшая точность не понадобится, можно считать всё в центах, оперируя целочисленной арифметикой. И при выводе, опять же, делить на 100 и toFixed(2)
    Ответ написан
    Комментировать
  • Юзабилтити: новая новость справа или слева?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Зависит от языка. Направление чтения определяет направление от старых к новым.

    Читаем слева направо, значит, слева старые, справа новые.
    Ответ написан
    5 комментариев