Задать вопрос
  • Можно ли запустить npm локально через Docker?

    Предположу, что проект и его package.json находятся на хосте в текущей папке.
    Тогда команда:
    docker run -it --rm -v "$PWD":/usr/src/app -w /usr/src/app node npm install


    Подробнее:
    docker run                  \
      -it                       \  // интерактивно и с терминалом
      --rm                      \  // удалить контейнер после выхода
      -v "$PWD":/usr/src/app    \  // текущую папку на хосте смонтировать в контейнер
      -w /usr/src/app           \  // в конт. сделать текущей папкой смонтированную
      node                      \  // образ с nodejs
      npm install                  // команда
    Ответ написан
    Комментировать
  • Как отследить изменение значения в переменной?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если есть возможность изменить код создания этой переменной..
    Например, вместо
    var a = 'QnA.habr.com';
    написать
    Object.defineProperty(this, 'a', {
        set: function(v) {console.log('Изменяют!'); this.value = v;},
        value: 'QnA.habr.com'
    });
    то теперь любое изменение значения переменной вызовет панику в консоли:
    a = 'StackOver...';
    // Изменяют!


    Upd. выяснилось, вопрос был совсем про другое )
    Ответ написан
  • В какой программе можно исказить голос?

    Эффект называется pitch shifting (сдвиг тона) и formant shifting (сдвиг формант).

    Многие плагины его реализуют - соотв. нужен плагин и аудиоредактор, работающий с этим плагином.
    Ответ написан
    Комментировать
  • Использование volume в docker-compose?

    Последняя директива нужна для объявления собственного тома (volume), который будет создан при первом запуске сервисов. Под каждым определением можно ещё добавлять опции этого volume. Например, заявить, что он внешний и должен был быть уже создан заранее вручную:
    volumes:
      db-data:
        external: true

    - db-data в данном примере этот каталог расположенный в одной директории с docker-compose.yml?
    Нет. Это именованный volume. Его фактическая папка спрятана где-то глубоко, можно посмотреть командой docker volume inspect db-data и изначально он пустой.

    В чем отличие от такой записи(является ли она корректная?):
    - ./db-data:/var/lib/mysql/data
    Такая запись первым параметром указывает не именованный volume, а подпапку в папке с docker-compose.yml Т.е. mysql получит папку со всем её содержимым по адресу, указанному вторым параметром.

    Лучше использовать полноценные volume, чем просто монтировать локальные папки.
    Почему (на англ)
    Volumes are the preferred mechanism for persisting data generated by and used by Docker containers. While bind mounts are dependent on the directory structure of the host machine, volumes are completely managed by Docker. Volumes have several advantages over bind mounts:
    • Volumes are easier to back up or migrate than bind mounts.
    • You can manage volumes using Docker CLI commands or the Docker API.
    • Volumes work on both Linux and Windows containers.
    • Volumes can be more safely shared among multiple containers.
    • Volume drivers let you store volumes on remote hosts or cloud providers, to encrypt the contents of volumes, or to add other functionality.
    • New volumes can have their content pre-populated by a container.

    Ответ написан
    3 комментария
  • Как подгружать часть аудиофайла?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    HLS (HTTP Live Streaming) умеет такое. В запросе указывается время "от" и "до" и сервер возвращает нужный чанк.

    Есть модуль в nginx. Не знаю, работает ли это с mp3 или придётся перекодировать файл в m4a.
    Ответ написан
    Комментировать
  • Как считать кол-во повторяющихся эл-ов в массиве?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    let arr = [1,3,3,4,5,5,5];
    function count(arr){
      let cnt = 1; // один счётчик на все значения?
      let map = new Map();
      for(let i = 0; i< arr.length; i++){
        for(let j = 0; j< arr.length; j++){ // плохо, что на каждый элемент весь массив перебираете
          // получается, считаются все пары одинаковых на каждом проходе.
          if(arr[i] == arr[j]){ // здесь каждый раз найдётся равенство самому себе
              map.set(arr[i],cnt++); // а общий счётчик всё больше и больше
          }
        }
      } return map;
    }
    console.log(count(arr));


    Для решения задачи подсчёта не нужно вложенных циклов.
    Пройти по каждому элементу достаточно всего один раз.
    И внести в "словарь": 1, если ещё не было такого, или увеличить на 1, если уже было.

    исправленный ваш код
    let arr = [1,3,3,4,5,5,5];
    function count(arr){
      const map = new Map();
      const len = arr.length;
      for (let i = 0; i < len; i++) {
        const value = arr[i];
        if (!map.get(value)) map.set(value, 0); // создать счетчик
        map.set(value, map.get(value) + 1); // увеличить на 1
      }
      return map;
    }
    console.log(count(arr));
    /*
    Map(4)
      ​size: 4
      ​<entries>
    ​​    0: 1 → 1
    ​​    1: 3 → 2
    ​​    2: 4 → 1
    ​​    3: 5 → 3
    */
    Ответ написан
    Комментировать
  • Что за единица?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сокращенный тег <?= не просто выполняет код внутри него, но и выводит результат.
    То же, что <?php echo

    Минимальная редакция – убрать знак равенства, заменить <?= require_once... на <? require_once... Но такой короткий тег <? не всегда поддерживается и не рекомендуется.

    Лучше всё в один PHP-тег:
    <?php
    
    require_once APP . '/views/App/inc/header.php';
    echo $content;
    require_once APP . '/views/App/inc/footer.php';
    
    ?>
    Ответ написан
    4 комментария
  • Как проверить несколько input`ov с одинаковым классом на пустоту?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function check() {
    	let filled = true;
    	$(".input_1").each(function() {
        if ($(this).val() == '') filled = false;
      });
      $('div').text(filled ? 'Все заполнены' : 'что-то пусто');
    }


    Ответ написан
  • Как написать тест на javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот для вдохновения
    Ответ написан
    6 комментариев
  • Как повесить обработчик события на элемент который отрисовывается?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Делегирование событий

    повесьте слушатель событий на catalogList
    События клика будут пузыриком подниматься наверх, там и отловите )
    Ответ написан
  • Как правильно отфильтровать массив массивов объектов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если речь идёт только об уникальности свойства name, можно создать объект, где это свойство будет ключом, а последний встретившийся объект с этим свойством – значением. Более поздние объекты с повторным свойством nameперезаписывают собой более ранние. В конце остаётся вытащить все значения из этого объекта:
    Object.values(
      arr.reduce(
        (acc, c) => {
          c.forEach(o => acc[o.name] = o);
            // получается объект acc:
            //    "test":  {id: 1, name: 'test'},
            //    "test2": {id: 2, name: 'test2'},
            //    "test3": {id: 3, name: 'test3'},
            // ...
          return acc;
        },
        {}
      )
    );


    Update. в комментариях выснили, что требуется уникальность не одного, а набора свойств. Тогда принцип тот же, но в качестве ключа использовать некий хэш или отпечаток этих свойств.
    Самый простой вариант склеить строки значений. Но возможны коллизии типа {"name": "Stan", code: "dart"} и {"name": "Stand", code: "art"} — оба дадут отпечаток "Standart" и посчитаются идентичными.

    Немного лучше удалить из копии объекта св-во id, и перевести в JSON. Тут слабое место – порядок свойств. Если у одного из объектов свойства поменяют местами, алгоритм сочтёт их разными.
    Object.values(
      arr.reduce(
        (acc, c) => {
          c.forEach(o => {
            const source = Object.assign({}, o);
            delete source.id;
            const hash = JSON.stringify(source);
            acc[hash] = o;
          });
          return acc;
        },
        {}
      )
    );
    Ответ написан
  • Возможно ли написание лендинга без html и css?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Ну сделайте лендинг как видео.
    Взаимодействия с пользователем, правда, будет минимум. Но можно сделать серию клипов на YouTube, перелинкованных между собой.
    Ответ написан
    Комментировать
  • Стартап. Устройство для лиц с инвалидностью по зрению. Как реализовать?

    Проведите для начала эксперимент: дистанционно вести незрячего с одним лишь смартфоном на груди (камера показывает, что впереди) и наушниками. Через Skype, Duo или FaceTime или что угодно с видеозвонком. Только по настоящему дистанционно, чтобы диспетчер сидел где-то далеко.
    Ответ написан
    3 комментария
  • Как выполнить функцию после рендера?

    Возможно, причина в том, что Vue обновляет DOM асинхронно.
    К моменту, где сейчас вызывается filterSelectChildren() DOM ещё не обновлён и таблицы нет.

    Попробуйте фильтровать по следующему тику:
    Vue.nextTick(function () {
        filterSelectChildren('#codepenSelectFirstChild', currentSetting);
    })
    Ответ написан
    1 комментарий
  • Как быстро снова окунуться в свой же код?

    "Я через месяц отпуска" — то же, что "другой, новый разработчик в проекте".

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

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В вашем коде косяк в том значении, которое принимает i после обновления.
    Например, было 0.
    Нажали "Показать".i++, i++ // i === 2
    Нажали "Скрыть".
    Скрывается соответствующий текущему значению i===2 (0, 1, 2 - т.е. третий, он и так пока скрыт).
    i уменьшается на 1.
    Скрывается соответствующий нынешнему i===1 (т.е. второй, был видимым).
    И потом i становится равным 0. Остался видимым нулевой.
    Надеюсь, понятна причина видимости одного.
    Это лечится костылём: замените оба i-- на --i.
    Но это не устранит другой проблемы: i может уезжать в минус.

    Предлагаю держать переменную, определяющую сколько элементов сейчас видимы.
    И функцию, которая только исходя из этой переменной показывает/прячет нужное число элементов.
    код
    const divs = document.querySelectorAll('div')
    const length = divs.length;
    const btnShow = document.querySelector('.show')
    const btnHide = document.querySelector('.hide')
    
    function showVisible(visible) {
      const toShow = Math.min(visible, length);
    
      for (let i=0; i < length; i++) {
          divs[i].style.display = i < toShow ? 'block' : 'none';
      }
    }
    
    let visible = 0;
    showVisible(visible);
    
    btnShow.addEventListener('click', function () {
      visible = Math.min(visible + 2, length);
      showVisible(visible);
    });
    
    btnHide.addEventListener('click', function () {
      visible = Math.max(visible - 2, 0);
      showVisible(visible);
    });


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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Так ведь передаётся не функция function(){...}, а выражение users.sort(...)
    Выражение, которое сразу же выполняется, чтобы получилось значение. И вот это значение будет (?) обработчиком события клика. Т.е. в этом коде предлагается по клику не функцию выполнить, а сортированный массив – даже не знаю, что с ним делать.

    Чтобы не сразу, оберните код в .. кхм .. функцию!
    button.addEventListener('click', function() {
      users.sort(
        function(a, b){
          return b.age-a.age
        }
      )
    });
    
    // или покороче
    button.addEventListener('click', () => users.sort((a, b) => b.age - a.age));
    Так только по событию клика массив, наконец, отсортируют.
    Ответ написан
    Комментировать
  • Массив содержит цикл через ссылку?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Предлагаю такой вариант потестировать. serialize() обозначает ссылку как "R:123" и для определения, есть ли в принципе ссылка, можно искать подстроку "R:" в сериализованном представлении массива или объекта.
    Но это пока никак не проверяет, является ли ссылка циклической..
    function hasCyclicRef($subject) {
    	return FALSE === strpos(serialize($subject), 'R:');
    }
    
    
    $arr = (object) ['one' => 1, 'two' => 2];
    $arr->me = &$arr;
    
    var_dump( hasCyclicRef($arr));
    Ответ написан
    Комментировать