• 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
    Ответ написан
    Комментировать
  • Какой домен верхнего уровня подойдет для компании IT?

    это обычно называется не «домен верхнего уровня», а «зона».

    Посмотрите полный список доменых зон и вычеркните точно не подходящие, например, .sex или .sucks

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

    Выбрав короткий список из 3–5 вариантов, сросите нескольких ваших клиентов, как им кажется, который наиболее и наименее подходит для вашей компании с их точки зрения.
    Ответ написан
    Комментировать
  • Какая программа используется для графического планшета (как в примере)?

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

    Порекомендую отличное приложение для геометрии, стереометрии и образования — GeoGebra Classic. Там рисование чуть более строгое, точки «прилипают», и зато получается идеально аккуратный и «живой» чертеж – потянул точку, все линии из неё сдвинулись. Попробуйте, софт бесплатный, под многие платформы.

    Названия точкам присваиваются сразу автомагически. Можно переименовать. Можно считать площади, объёмы, даже вероятности!
    пирамидка как в видео
    5dfced9a92f7a742322726.png
    Ответ написан
    Комментировать
  • Как сделать AJAX запрос без jqury?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Дело в Content-type: вы передрали код из примера с application/x-www-form-urlencoded, который предполагает отправку данных как в GET-параметрах: a=1&b=2&c=3

    При этом шлёте JSON-закодированные данные.

    Замените на
    request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");


    В PHP обработчике брать php://input
    $data = json_decode(file_get_contents("php://input"));
    Ответ написан
    6 комментариев
  • Как декодировать строку?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Дело в Content-type: вы передрали код из примера с application/x-www-form-urlencoded, который предполагает отправку данных как в GET-параметрах: a=1&b=2&c=3

    При этом шлёте JSON-закодированные данные.

    Замените на
    request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    Ответ написан
    Комментировать
  • Работа с массивами. Метод forEach и его принцип работы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    forEach() вызывает функцию по очереди с каждым из элементов массива. В данном примере вызовется function(1), function(3), function(4), ... function(5)

    result это объект, где свойствами будут встреченные цифры (как строки).

    Пока цифра не встречалась, такого свойства у result нет, и, например, result[1] будет поначалу undefined. И в таком случае создаётся это свойство со значением 1.

    А если такое свойство (со значением-счётчиком = 1 или уже больше) найдено, это значение не равно undefined, и оно будет увеличено на 1.

    Так и сосчитается, сколько раз встречается каждое из значений.
    Ответ написан
    Комментировать