Задать вопрос
  • Как в Vue перемешать полученные данные axios?

    Полученный массив перемешать сразу при получении:
    // вместо
    vm.products = response.data.data  
    
    // так:
    vm.products = response.data.data.sort((a,b) => Math.random() - 0.5)
    Ответ написан
    3 комментария
  • Что почитать по авторизации на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    • cookies – JS умеет их читать и устанавливать, а back по ним узнаёт сессию
    • HTTP headers – с каждым AJAX-запросом можно передавать в заголовках параметры авторизации
    • window.postMessage() может пригодиться, чтобы из нового окна, в котором отправили пользователя авторизовываться через третью соц-сеть, сообщить в «основное» окно, как всё прошло.
    Ответ написан
    Комментировать
  • Почему цикл обрабатывается не верно?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var i; // var в отличие от let и const «всплывает» наверх
           // поэтому можно записать и так.
           // Это важно, т.к. изменить i могут где-то ниже в коде.
    
    for(i=0; i<10; i++) { 
      setTimeout(function() { // на каждой итерации создаётся новая функция,
                              // которая сохраняет ссылку на переменную  i 
        alert(i);             // чтобы когда, наконец, сработает, 
                              // вывести что там в i окажется в тот момент
      }, 100); // выполнение откладывается на потом через 1/10 сек
    }

    Цикл доиграл, создал-отложил 10 функций-анонимусов, каждая пристально смотрит на переменную i.
    К этому времени i, спасибо циклу, уже выросла до значения 10.

    Через 0.1 секунды посыпятся выполняться те 10 функций,
    и каждая выведет текущее значение i на этот момент.

    Занимательный факт.
    Если после цикла дописать i = 2*2*5*0x65 ; то алёрты выведут наступающий год!
    Ответ написан
    Комментировать
  • Бывает ли момент когда нет права на ошибку?

    На собеседовании.
    Ответ написан
    Комментировать
  • Переменные создавать внутри или вне циклов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    for(let i = 0, a = document.querySelector(".elem"); i <10; i++) {
      alert(a);
      console.log(a);
    }
    Ответ написан
    3 комментария
  • Как перенести освещение и тени с одного изображения на другое в фотошоп?

    Снизу лого, сверху стена, режим Linear light, прозрачность 70%
    spoiler
    5e033b25104d7507230293.jpeg


    Upd. Лого сделать паттерном и наложить новый слой-Pattern, где указать малый размер, около 10%, чтобы было много повторов.
    Свет - Effects - Render - Lighting Effects...
    и «поиграть с настройками» : ) Пресет - Three down для начала. И держите перед глазами для референса исходную стену.
    5e0358668247e713780700.png
    Ответ написан
  • DigitalOcean как не платить НДС 20%?

    Как не платить 20% — элементарно: укажите своей страной в настройках профиля Швецию.
    И вместо 20% НДС платите 25% VAT.

    На странице DigitalOcean про налоги перечислены страны и налоговая ставка.

    Можно отредактировать свой Профиль и указать в поле Адрес другую страну – именно это поле определяет налоговую ставку, как они пишут:
    Address - Displayed on invoice. Determine which taxes apply to your account.

    Сам пока не пробовал. Плачу и плачу 20%.

    Как определяется TAX location и как его изменить:
    How is my tax location determined?

    Your tax location is typically based on your account address, which is initially set to the payment address of your primary payment method when you sign up. In some locations, we are required by law to consider other account details, like other payment addresses or IP addresses.

    How can I change my tax location?

    You can update your account address and view your account’s tax location and rate at any time on the billing page. If you’ve set your account address correctly but your account’s tax location is not what you expect, contact support for help.
    Ответ написан
  • Как избавиться от бликов на фото матовой бумаги по опорным точкам?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    В программах обработки фото есть функция корректировки «баланса белого» – это для коррекции на цвет освещения (пасмурный день / лампы накаливания). Тыкаешь пипеткой на участок изображения, заведомо нейтрального цвета, например, специальную серую картонку, и вычисляется коррекция оттенков для всего изображения, цвета становятся правдоподобнее.

    Контраст регулируется примерно так же. Пипеткой для «чёрного» тык на участке заведомо чёрном – и уровни корректируются, делая этот цвет настоящим чёрным. Это влияет на всё изображение и более тёмные участки сделаются тоже плоским-черным, потеряв детали.

    То же с самой светлой областью. Тоже своя пипетка.

    Так тремя сэмплами — нецветной областью, самой тёмной и самой светлой — можно по-быстрому скорректировать изображение.

    Какая за этим стоит математика не подскажу, надо изучать вопрос.
    Вот на SO обсуждали.
    Ответ написан
    Комментировать
  • Как автоматизировать процесс записи видео (ScreenCapture) для SVG-анимации?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот вариант SVG animation to video:

    использовать Media Recorder API и скрытый элемент canvas

    Поскольку отрисовка кадров из элементов img может подтормаживать, этот код заранее генерит все кадры и после рендерит в цикле их через requestAnimationFrame()

    index.html
    <!DOCTYPE html>
    <meta charset="utf-8">
    <body>
    <svg width="960" height="500"></svg>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.3/d3.min.js"></script>
    <script src="https://d3js.org/topojson.v2.min.js"></script>
    <script>
    var svg = d3.select("svg"),
        canvas = document.createElement("canvas"),
        width = canvas.width = +svg.attr("width"),
        height = canvas.height = +svg.attr("height"),
        context = canvas.getContext("2d");
    
    var projection = d3.geoOrthographic()
      .scale(195)
      .translate([width / 2, height / 2])
      .precision(0.1);
    
    var path = d3.geoPath().projection(projection);
    
    d3.json("/mbostock/raw/4090846/world-110m.json", function(err, world) {
      var data = [],
        stream = canvas.captureStream(),
        recorder = new MediaRecorder(stream, { mimeType: "video/webm" });
    
      recorder.ondataavailable = function(event) {
        if (event.data && event.data.size) {
          data.push(event.data);
        }
      };
    
      recorder.onstop = () => {
        var url = URL.createObjectURL(new Blob(data, { type: "video/webm" }));
        d3.selectAll("canvas, svg").remove();
        d3.select("body")
          .append("video")
          .attr("src", url)
          .attr("controls", true)
          .attr("autoplay", true);
      };
    
      var background = svg.append("rect")
        .attr("width", width)
        .attr("height", height)
        .attr("fill", "#fff");
    
      svg.append("path")
        .datum({ type: "Sphere" })
        .attr("stroke", "#222")
        .attr("fill", "none");
    
      svg.append("path")
        .datum(topojson.feature(world, world.objects.land))
        .attr("fill", "#222")
        .attr("stroke", "none");
    
      svg.append("path")
        .datum(topojson.mesh(world, world.objects.countries, function(a, b) {
          return a !== b;
        }))
        .attr("fill", "none")
        .attr("stroke", "#fff");
    
      var queue = d3.queue(1);
    
      d3.range(120).forEach(function(frame){
        queue.defer(drawFrame, frame / 120);
      });
    
      queue.awaitAll(function(err, frames){
        recorder.start();
        drawFrame();
    
        function drawFrame() {
          if (frames.length) {
            context.drawImage(frames.shift(), 0, 0, width, height);
            requestAnimationFrame(drawFrame);
          } else {
            recorder.stop();
          }
        }
      });
    
      function drawFrame(t, cb) {
        projection.rotate([360 * t]);
        svg.selectAll("path").attr("d", path);
    
        var img = new Image(),
            serialized = new XMLSerializer().serializeToString(svg.node()),
            url = URL.createObjectURL(new Blob([serialized], {type: "image/svg+xml"}));
    
        img.onload = function(){
          cb(null, img);
        };
    
        img.src = url;
    
      }
    });
    </script>
    Ответ написан
    Комментировать
  • Можно ли с помощью js удалить атрибут в элементе img?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Неправильный вопрос задаёте и получаете не тот ответ.

    Плагин rocket-lazy-load можно деактивировать для определённых картинок,
    если добавить им атрибут data-no-lazy="1"

    <img src="logo.png" data-no-lazy="1" title="Лого от Артемия за килобакс" alt="">
    Ответ написан
    6 комментариев
  • Как создать двухсловные сочетания из массива?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Считаем, что в исходном массиве слова уникальны.
    $array = ['Слово 1', 'Слово 2', 'Слово 3', 'Слово 4'];
    $len = count($array);
    $result = [];
    for ($i = 0; $i < $len; $i++) {
      for ($j = $i+1; $j < $len; $j++) {
        array_push($result, [$array[$i], $array[$j]]);
      }
    }
    Ответ написан
    Комментировать
  • Как валидировать абсурдные суждения/предложения?

    Word embeddings на большом корпусе текстов выявляет расстояния между встречающимися словами и в т.ч. определяет, что "щенок" для "собаки" это то же, что "котёнок" для "кошки". Фразе можно давать "вес осмысленности" как функцию близости составляющих её слов. Меньше вес — вероятнее бессмыслица.

    Результат зависит от того, какие тексты исползовать для обучения. Если скормить научные публикации и если детскую библиотеку сказок и фэнтези, оценки расстояния "воздушный" и "слон" получатся разными.

    Ещё одна слабость в том, что модель никак не различает множественные значения слов: «смотрел на облако» и «залил на облако». P.s. и «смотрел на залив» )
    Ответ написан
    4 комментария
  • Как запретить одновременный запуск PHP скрипта?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Попробуйте как-то так:
    const FLAGFILE = 'lock_file.lock';
    private $myrun = true;
    
    public function __construct()
    {
        if (file_exists(self::FLAGFILE) {
            $this->myrun = false;
            exit('Lock file exists');
        }
        touch(self::FLAGFILE);
    }
    
    function __destruct ()
    {
        if ($this->myrun) unlink(self::FLAGFILE);
    }
    Ответ написан
  • Не работает код Js - как сделать, чтобы при нажатии на кнопку всегда выполнялось добавление элементов на html - страницу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    в переменной var divContent у вас строка текста (пусть и HTML).
    в следующей строке appendChild() ожидает не строку текста, а HTML узел (Node) – его можно создать как у вас выше document.createElement().

    В общем два пути:
    1. Создавать HTML, но тогда приклеивать его через element.innerHTML = myHTML;
    2. Создавать узлы и их через appendChild() Но у вас требуется два инпута вставить, с множеством атрибутов. На чистом JS это займет несколько строк:
    spoiler
    var input = document.createElement('input');
    input.type = "text";
    input.placeholder = "Наименование";
    input.className = "expenses-item";
    newDiv.appendChild(input);
    
    input = document.createElement('input');
    input.type = "text";
    input.placeholder = "Цена";
    input.className = "expenses-item";
    newDiv.appendChild(input);
    Ответ написан
    1 комментарий
  • Чем измерить уровень загрязнения воздуха на улице?

    breathe.moscow и luftdaten.info предлагают понятную инструкцию по сборке датчика мелкодисперсной пыли pm10 и pm2.5
    Ответ написан
  • Почему могут не прокидываться volumes от letsencrypt by certbot сертификаты в docker container nginx-а?

    Вместо полного пути к
    - /etc/letsencrypt/live/domen.ru/:/etc/letsencrypt/live/domen.ru/

    надо
    services:
      nginx:
        # ...
        volumes:
          # ...
          - /etc/letsencrypt:/etc/letsencrypt

    потому, что в live/domen.ru лежат не сами сертификаты, а линки на файлы двумя уровнями выше. Линки вы и видите, но указывают они на недоступные файлы.
    Ответ написан
    2 комментария
  • Как сделать круговую анимацию в AE?

    Записал по-быстрому скринкаст, как нарисовать анимированную окружность в After Effects.

    New composition,
    в ней новый слой слошного цвета New Solid (Cmd+Y)
    Там нарисуйте векторную окружность соотв инструментом (создастся маска Mask слоя)
    Этой маске вместо режима Add сделайте None
    Добавьте эффект Generate - Stroke
    Нажмите на 100% для End или Start и подвигайте значения - увидите, это как раз то, что нужно, двигается конец/начало.
    Этот слой будет фоном. Дайте прорисовке бледно-серый цвет.

    Продублируйте этот слой. Нижний будет слабовидной полной окружностью, а в верхнем будет прорисовываться яркая. В эффекте верхнего сделайте цвет прорисовки ярким. И Paint style вместо "On original image" – "On transparent"

    Будем анимировать свойство Start эффекта Stroke.
    Для этого нажмите часики. Это создаст ключевой кадр с нынешним значением. Измените Start c 0% на 100%.

    Теперь в таймлайне сдвиньтесь вперед на секунду-две (сколько там займёт анимация).
    И значение в эффекте Start смените с 0 на 100%. Это создаст второй ключевой кадр. Теперь если включить проигрывание линия будет плавно прорисовываться.
    Ответ написан
    7 комментариев
  • Возможна ли выдача списка ютуб каналов по определенным параметрам?

    Для поиска каналов и вывода инфы о каналах есть метод YouTube Data API search.list()
    • по стране – укажите regionCode или location
    • по категории – videoCategoryId или topicId
    • по количеству подписчиков придётся фильтровать на своей стороне.
    Ответ написан
    Комментировать
  • Как создать iframe виджет для группы вк?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Ответ написан
    Комментировать
  • Как эффективно выбирать каждый n элемент массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    «Эффективно» в смысле кратко, в одну строку:
    const everyNth = (arr, n) => arr.filter((e, i) => i % n === 0);
    
    // применение
    everyNth([0, 11, 22, 33, 44, 55, 66, 77], 7) // [0, 77]


    «Эффективно» без лишних итераций, старым добрым циклом for():
    function everyNth(arr, n) {
      const result = [];
      for (let i=0; i<arr.length; i+=n) result.push(arr[n]);
      return result;
    }


    Какой быстрее – сделал проверку на jsPerf
    Цикл for()быстрее в 7 раз!
    скрин
    5dffbba9538a7281867384.png
    Ответ написан
    Комментировать