• Математические вычисления с дробными числами?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    К счастью, у вас не банк с расчетом стаки по кредиту.

    Почему бы не считать все в копейках? Тогда все расчеты в целых.

    ..Пока маркетологи не захотят давать скидку в 1/3
    Ответ написан
    2 комментария
  • Как определить к какой форме принадлежит input?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Прикрутить бы VueJS, и сделать корзину реактивной: в любой из форм изменили число товара, везде так же изменилось.

    Костылинг мог бы быть с глобальным объектом, хранящим актуальную корзину. Любая из форм меняет значениеив нем. Сеттер значения эмитит событие, которе слушают все формы, чтобы обновить свои данные.
    Ответ написан
  • Как правильно подсчитать время, проведённое пользователем в онлайне (VK API)?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Ответ зависит от алгоритма, частоты ваших проверок и обновлений параметра last_seen на стороне ВКонтакте.

    Наверное, стоит на своём аккаунте провести ряд экспериментов, чтобы выяснить:
    1. как обновляется время last_seen (с какой точностью), если:
      • в моб. приложении проявлять активность - прокручивать, листать
      • в моб. приложении проявлять активность - ставить лайки
      • в моб. приложении не проявлять активность, но держать открытым на виду
      • в моб. приложении не проявлять активность, держать в фоне
      • те же 4 пункта, но на сайте ВК.
      • если серверное standalone приложение от имени пользователя выполнит запрос к API
      • если iFrame приложение от имени пользователя по таймауту выполнит запрос к АПИ, при этом сам пользователь никаких действий, даже движений мышкой, не предпримет – обновит ли это last_seen?

    2. как обновится время last_seen, если моб. приложение закрыть. И сразу же открыть снова, но ничего не делать в нём.


    Это поможет сделать выводы:
    1. как часто имеет смысл проверять для одного юзера параметр last_seen: раз в 15 минут, в 10, в 5, каждую минуту?
    2. и только тогда – как интерпретировать полученые данные – ваш исходный вопрос.
    Ответ написан
    3 комментария
  • Возможно ли средствами css3 нарисовать такое?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не пробовал, но стоит попробовать CSS свойство clip-path
    clip-path: rectangle(...)
    или mask-image и генерируемый SVG.

    Каждое из изображений обрезать своей маской, позиционировать над белым фоном. Белые рамки - может, поверх положить SVG опять же и дать толщину линиям.
    Ответ написан
    Комментировать
  • Как объединить два объекта без затирания вложенных свойств?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не полениться обходить каждое свойство, и если его значение это объект, то рекурсивно не полениться обходить...

    Простых-встроенных методов пока нет.

    Например, см. реализцию _.merge() в библиотеке lodash.
    Ответ написан
    Комментировать
  • Как укоротить данный код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Я бы предложил удлиннить на два дополнительных знака равенства:
    const bool = residential.is_brick === 0 || residential.is_brick === null;
    Ответ написан
    Комментировать
  • Безопасно ли передавать пароль через ajax?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    По протоколу HTTPS безопасно. По HTTP — опасно.
    Ответ написан
  • Как лучше передавать большие коллекции данных из Laravel в Vue.js?

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

    users/show.blade.php
    <script>
      function getMyUsers() { return @json($arrayOfUsers); }
    </script>
    ...
    <script>
    const vm = new Vue({
      data: function() {
        return {
          users: getMyUsers(),
          counter: 0,
        };
      }
    });

    Причём так можно упаковать не всех, а, например, только первые 500 пользователей.
    И если станут листать/прокручивать, то динамически, доп. запросами, подгружать дальше.
    Ответ написан
    Комментировать
  • Как защитить приложение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Обсуждение похожего вопроса на github Electron'а.

    Один из вариантов – написать на C++ собственный модуль для NodeJS, реализующий скрываемый функционал.

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

    Для автономного моё предложение: регулярно обновлять приложение, улучшая его с каждым релизом. При автообновлениях проверять статус подписки. Так «хакеры» лишились бы свежих версий.
    Ответ написан
    1 комментарий
  • Где можно сделать подобную визуализацию данных?

    В D3js, см. пример
    Ответ написан
    Комментировать
  • Почему random не работает?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1.
    var x = [Math.floor(Math.random()*10)];
    // заменить на
    var x = Math.floor(Math.random()*10);


    2.
    if(x=input){
    // заменить на
    if(x==input){
    Ответ написан
  • Как в 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>
    Ответ написан
    Комментировать