• Как преобразовать массив из 64 чисел от 0 до 63 в цвет?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Тут некоторая избыточность.
    Цвет в вебе задаётся одним байтом 0..FF (0..255) для каждого компонента: R, G, B и, опционально, альфа (прозрачность 0..100). Прозрачность, вероятно, отбросим.
    Будем считать, что цвет – это три байта = 24 бита.

    0..63 это 6 бит. Для цвета достаточно четырёх чисел 0..63, чтобы получить 4 * 6 = 24 бита.
    четыре 6-битовых дают три 8-битных:
    00000011 11112222 22333333


    В массиве из 64 элементов 64 / 4 = 16 таких четвёрок, или 16 цветов. Можно генерить градиент )

    Вариант решения
    (()=>{
      // из четырёх чисел 0..63 получить строку цвета типа "#abcdef"
      const makeColor = (n1, n2, n3, n4) => {
        const r = (n1 & 63) << 2 | (n2 & 48) >> 4;
        const g = (n2 & 15) << 4 | (n3 & 60) >> 2;
        const b = (n3 & 3) << 6 | n4 & 63;
        return '#' + [r,g,b].map(n => n.toString(16).padStart(2,'0')).join('');
      }
      
      // из массива чисел от 0 до 63, длиной кратной 4, получить массив цветов
      const arrToColor = arr => {
        const len = arr.length;
        if (len % 4) throw "Длина массива не кратна 4";
    
        const result = [];
        for (let i=0; i<len; i+=4)
          result.push(makeColor(...arr.slice(i, i+4)));
    
        return result;
      }  
    
      // тест
      const test = () => arrToColor(
        [...new Array(64)].map(()=>Math.floor(64 * Math.random()))
      );
      return test();
    })()
    
    /*
    #941510,#4b31ca,#eec8c9,#4c9202,
    #336a01,#95b7ec,#e73d44,#4069e6,
    #4d1700,#8efa27,#8e0333,#f089af,
    #67b561,#fc8fc8,#48503c,#f308a9
    */


    Ответ написан
    Комментировать
  • Как с ffmpeg разделить на определенное количество thumbnail?

    Первый же фильтр fps=1/16 берет 1 кадр из 16 секунд.
    Чтобы получилось ровно 80 кадров, надо заранее знать длину видео и расчитать такой fps, чтобы получилось 80 кадров: fps=80/длина_видео_в_секундах

    Ещё стоит обратить внимание на фильтр thumbnail – он выбирает наиболее значимый кадр и серии кадров. Работает чуть медленнее и требует больше памяти, но выбранные кадры получаются лучше - без размытого движения и т.п. Тут тоже нужно знать длину видео и частоту кадров, т.е. общее число кадров в видео. И разделить его на 80. Например, видео длиной 15 минут с частотой кадров 30 даёт 30 * 15 * 60 = 27000 кадров. Разделить на 80 получится 337.5 кадров. Т.е. нужно бы использовать вместо fps=.. фильтр thumbnail=338
    Но может просесть скорость и вырасти потребление памяти.
    Ответ написан
  • Как получить каноническое уравнение эллипса по N его точкам?

    Параметрическое уравнение эллипса:
    x = a * cos(t)
    y = b * sin(t)
    0 ≤ t ≤ 2π
    где a, b − полуоси эллипса, t − параметр.

    позволяет убрать из уравнения тригонометрию от t: (sin^2 + cos^2) = 1
    и выразить a как функцию b при известных (x, y).
    x2 = a2 * cos2(t)
    y2 = b2 * sin2(t)
    и изолировать sin,cos:
    x2 / a2 = cos2(t)
    y2 / b2 = sin2(t)
    осталось сложить и вывести a = f(b)

    x2 / a2 + y2 / b2 = 1

    Upd. не учёл третье неизвестное: угол поворота осей.
    В повернутой коорд. системе:
    x' = x cos ß + y sin ß
    y' = -x sin ß + y cos ß

    Заменить этими выражениями простые x2 и y2
    И как-то решить систему уравнений, подставив известные x, y точек.
    Ответ написан
  • Можно ли упростить функцию?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно расставлять имена класса строкам таблицы, относящимся к одной из опций селекта. Выбрали в селекте опцию, спрятали все строки, показали только строки с известным именем класса.

    Либо, что лучше, на мой взгляд – заново генерировать таблицу каждый раз из данных, опираясь на выбранную опцию:
    Ответ написан
    Комментировать
  • Существует бесплатный vps?

    Есть программы разных облачных провайдеров для стартапов, в рамках которых выделяют неплохие ресурсы.

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. дайте какой-то уникальный id тому div'у рядом с "Результат"
    2. получите этот div, как вы уже делаете с "chislo1": var div = document.getElementById(...
    3. вставьте в него результат: div.innerText = "вот, что получилось";
    Ответ написан
    3 комментария
  • Как выполнить код после перезагрузки страницы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Пусть форма отправляет данные POST'ом на главную.
    Сервер, получив данные, пусть включает в код страницы js, который хотите выполнить.
    Ответ написан
  • Как взять значение из элемента?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Допустим, у вас такая разметка:
    <section>
      <article>
        <a href="#">1 ссылка</a>
      </article>
    </section>


    Цифру "1" можно получить так:
    const el = document.querySelector('a'); // находит первый подходящий элемент
    const text = el.innerText;
    const digitText = text.substring(0,1); // тут будет текст единичка
    const digitNumber = +digitText; // тут уже число 1


    С тегом span так же:
    const el = document.querySelector('span'); // найдет самый первый элемент span в документе


    Если элементов span, например, много, а нужен единственный внутри, скажем, известного div'а
    <span>не нужный</span>
    <div id="theone">
      <span>300 спартанцев</span>
    </div>

    в таком случае можно указать id дива и внутри него искать первый элемент span:const span = div.querySelector('#theone span');
    Ответ написан
    Комментировать
  • Что нужно знать для профессиональной анимации?

    Возможно, речь про анимацию ближе к мультфильмам?

    Один из вариантов – Adobe Animate. Вывести можно и в видео и в форматы для веба.
    Ответ написан
    Комментировать
  • На чём писать простой фронтенд?

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

    P.s. Оно же, без Vue и сборок - просто темплейт на любимом HTML, CSS.
    Ответ написан
    Комментировать
  • Имеется ли ответственность за участие в разработке нелегальных сайтов?

    Юрисдикция под вопросом. Например, сделанный российским программистом продукт полностью легален в России, но нарушает нормы приватности в странах Европы.
    Изготовление продукта - одно.
    Эксплуатация его, совсем другач задача и иной круг ответственных за это лиц, исключающий разработчика.

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

    Disclaimer. Я далек от экспертности в юридических вопросах и всё вышенаписанное лишь желание поразмышлять.
    Ответ написан
  • Как удалить разницу между двумя директориями?

    Может, rsync поможет?
    rsync \
      -av \
      --delete \
      --existing \
      dir1 dir2
    Ответ написан
    1 комментарий
  • Генерируемый список Js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    См. Node.insertBefore()

    Что-то типа:
    function insertFirst(id) {
      const li = document.createElement('li'); // создали новый листайтем
      li.innerText = "меня тут не стояло";
      const parent = document.getElementById(id); // это ul
      const first = parent.firstChild; // это первый li до вставки
      parent.insertBefore(li, first); // впихнули новый li перед бывшим первым
    }
    Ответ написан
  • Не могу понять работу метода .map?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function camelize(str) { // на вход приходит строка
       return str      // вот тут пока ещё строка
         .split('-')   // здесь из этой строки сделали массив, разбив её по символу дефиса
                       // ниже пошёл массив ["lol", "kek", "cheburek"]
         .map((word, index) => index == 0 ? word : word[0].toUpperCase() + word.slice(1)) // что-то сделали с каждым элементом массива
         .join(''); // соединяет ['my', 'Long', 'Word'] в 'myLongWord'
     }


    Теперь упростим непонятную строку.
    К ней пришёл массив, у которого вызывается метод map() – он просто применит функцию в нём к каждому элементу массива. На выходе получится новый массив.
    .map((word, index) => index == 0 ? word : word[0].toUpperCase() + word.slice(1)) //**
    
    // то же самое, что:
    .map(
      function(word, index) {
         return index == 0 ? word : word[0].toUpperCase() + word.slice(1);
      }
    )
    
    // то же самое, что:
    .map(
      function(word, index) {
        if (index == 0) {
          return word;
        } else {
          return word[0].toUpperCase() + word.slice(1);
        }
      }
    )


    Метод массива .map() вызывает функцию, которая в нём аргументом, для каждого элемента массива и передёт в неё следующие три параметра:
    1. Текущий обрабатываемый элемент массива.
    2. Индекс текущего обрабатываемого элемента в массиве.
    3. Массив, по которому осуществляется проход.
    Ответ написан
    1 комментарий
  • Получится ли сэкономить память с yield?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Почему бы не измерить использование памяти во всех вариантах?
    БольшойМассив так и так остаётся в памяти и не копируется целиком в array_slice(). Что будет, если передать его в array_slice()по ссылке – уменьшится использование памяти?

    Почему бы вообще не работать со ссылкой на массив и не запоминать положение "курсора"?
    reset(), next(), current() – вот это вот всё..

    Второй вариант - выгрузить массив из памяти в файл, и читать чанки оттуда с нужной позиции. Например, если массив содержит 32-битные целые, то записать весь массив в бинарный файл, по 4 байта на число. См. pack() и unpack(). Оффсет в файле равен индексу числав массиве * 4 байта.
    Ответ написан
    4 комментария
  • Почему не получается перезаписать символ в двумерном массиве?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Строку разбили по пробелам на слова. И затем у каждого слова пытаетесь заменить первый символ на его заглавную версию. Но вот такой доступ к строке как к массиву букв работает только «для чтения»:
    mass[i][0]

    Нельзя просто взять и .. заменить символ в строке.

    См. Доступ к символам:
    отрывок документации
    Другим способом (введённым в ECMAScript 5) является рассмотрение строки как массивоподобного объекта, в котором символы имеют соответствующие числовые индексы:
    return 'кот'[1]; // вернёт "о"
    При доступе к символам посредством нотации с квадратными скобками, попытка удалить символ, или присвоить значение числовому свойству закончится неудачей, поскольку эти свойства являются незаписываемыми и ненастраиваемыми. Смотрите документацию по методу Object.defineProperty() для дополнительной информации.


    Вариант решения – сделать из каждого слова настоящий массив букв:
    const titleCase = str => str
        .toLowerCase()
        .split(' ')
        .map(word => {
          const chararr = word.split('');
          chararr[0] = chararr[0].toUpperCase();
          return chararr.join('');
        })
        .join(' ');
    
      titleCase("I'm a little pea"); // I'm A Little Pea
      titleCase("I love the sky and the trees"); // I Love The Sky And The Trees
    Ответ написан
  • Почему nginx не отдаёт html файл?

    Допустим на сервере в папке /home/user/privacy_policy лежат два файла
    index.html и policy.html

    И такой конфиг для этого локейшн:
    location /privacy-policy {
      alias /home/user/privacy_policy;
      index index.html;
      try_files $uri index.html =404;
    }


    Тогда, по идее, будут работать такие ссылки:
    ## вернут содержание index.html:
    https://site.ru/privacy-policy
    https://site.ru/privacy-policy/
    https://site.ru/privacy-policy/index.html
    https://site.ru/privacy-policy/trololo.zip
    
    ## вернёт содержание policy.html:
    https://site.ru/privacy-policy/policy.html
    Ответ написан
  • Как сделать простой php-роутер?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    На github есть много популярных (по числу звёзд) реализаций php router'а.

    Задача типичная, решений много.

    Для обучения так же полезно, как писать велосипед, изучать чужой код.
    Ответ написан
    Комментировать
  • Как привязать клик по элементу создаваемых в цикле?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вместо onClick используйте addEventListener()


    Upd. Корректнее вешать единственный общий обработчик на родительский элемент - он «поймает» все клики на элементы внутри себя.
    Ответ написан
    3 комментария