• Чем бы это могло быть?

    @forspamonly2
    это муар между регулярной пиксельной сеткой и рисуемыми по некруглым координатам шагами ваших лучей. в фаерфоксе он точно так же есть.

    рейкастинг делается в обратную сторону. нужно идти по пикселам картинки и проверять не заслоняет ли конкретно этому пикселу какой-нибудь объект источник света.

    вот, добавил вам первый же нагуглённый метод определения пересечений (отсюда https://stackoverflow.com/questions/99353/how-to-t... ):



    зы. код у вас ужасный, не потому что "на хтмл", а потому что половина переменных не объявлена и попадает в глобальный контекст, плюс вы пытаетесь рисовать каждую точку отдельным прямоугольником, да ещё и между пикселов, размеры картинок не совпадают, куски рисуются в разное время, и так далее...
    Ответ написан
    2 комментария
  • Как правильно трансформировать время?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    2017-05-16 13:45 MSK === 2017-05-16T10:45:00.000Z
    console.log(new Date(Date.parse('2017-05-16 13:45')))
    // Date Tue May 16 2017 13:45:00 GMT+0300 (Москва, стандартное время)

    Ваш код у меня в консоли тоже выводит
    // Date Tue May 16 2017 13:45:00 GMT+0300 (Москва, стандартное время)
    Ответ написан
    Комментировать
  • Как прокачать навыки функционального программирования?

    @telpenair
    Совет по поводу доки реакта мне нравится, я сам с основами ФП именно там познакомился, чистые функции (в реакте больше чистые компоненты), иммутабельность (первое в своё время мне очень зашло и я много где это стал применять, второе - не могу сказать до сих пор в полной мере оценил достоинства, хоть и знаю в теории все преимущества), в общем об этом там много написано, даже без хуков о которых говорилось в комментарии выше.

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

    Дальше я знаю что есть такая книжка
    https://github.com/MostlyAdequate/mostly-adequate-guide
    но я смотрел только смешную видеоадаптацию как будто для детей)
    https://www.youtube.com/watch?v=h_tkIpwbsxY

    По поводу изучения хаскеля. Если хочется изучить фп язык чтобы можно было потом и в хозяйстве применять, но больше в бэкенде, хотя есть и интересный проект scala.js - то есть еще вариант со scala и очень хорошей книжкой именно по функциональному подходу в ней - fp in scala
    https://www.manning.com/books/functional-programmi...

    Потом если пишете уже приложения на реакте/вью/ангуляре и хочется попробовать что-то близкое но где есть ФП (и не боитесь типизации) - то наверное проще всего попробовать Elm, в целом это такая очень сокращённая версия хаскелля, чтобы сразу не испугаться и не убежать) Последнее время один неплохой автор книг по реакту и редаксу ушел в эльм и пишет по нему статьи/ ведёт стримы
    https://maxpfrontend.ru/raspisanie/
    https://t.me/maxpfrontend

    Если вы занимаетесь кроме js еще и ts, можно попробовать посмотреть на библиотеку fp-ts
    https://gcanti.github.io/fp-ts/learning-resources/
    Но у меня ощущение что в ней без хоть какого-то бэкграунда в хаскеле/скала (на подходах которых библиотека и построена) будет сложно.
    Ответ написан
    Комментировать
  • Что я делаю не так с модульными стилями?

    @ned4ded
    Верстка, Фронтенд
    Селектор .col.s12 имеет большую специфичность, чем css-класс из модуля. Чтобы исправить отделите структуру грида от структуры компонента:
    import React, {Component} from 'react'
    import styles from './Videos.module.css'
    
    export default class Videos extends Component{
        render(){
            return(
                <div id="test1" className={`row ${styles.VideoRoom}`}>
                    <div className="col s12 center grey lighten-3">
                       <div className={styles.HostVideo}>
                          Видео хоста
                       </div>
                    </div>
                </div>
            );
        }
    }


    Либо если хотите именно переопределять стили колонки, то попробуйте воспользоваться директивой :global(.class) в css-модулях (подробнее). Должно получиться что-то вроде :global(.col).HostVideo.

    О специфичности можно почитать: тут, тут.
    Ответ написан
    1 комментарий
  • Чем плохо массовое использование async функций?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Помогите привести доводы почему это надо отрефакторить и убрать ненужные async await.

    То есть у вас самого доводов никаких нет? А зачем тогда вы хотите это переделать?

    Для начала стоит спросить ради чего так сделано.
    Если это реально кто-то наговнокодил и налепил async не понимая что это и зачем, то довода "это лишний код" должно быть достаточно.
    Ну можете еще сказать что это заворачивает все в лишние промисы, делает выполнение дольше на какие-то микросекунды и усложняет отладку и может портить стектрейсы.
    Ответ написан
    3 комментария
  • Как посмотреть какие команды выполнила библиотека?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Вот можно как-то получить эту вторую команду?

    нет.
    то что она равноценна, не значит что она именно так и работает

    1. x=a+b+c
    2. x=b+c+a
    3. x=b+(c*a)/a+a

    все равноценны. Но у них совершенно разный код - и из 1) вы никак не "узнаете" 3)

    Отвечая на ваш вопрос прямо - смотреть в код jQuery.
    Но вам суд япо ответам надо не узнать как какая команда работает, а на что ее заменить чтобы получить тот же результат без jquery.
    Этого добра в гугле навалом, начните с первой ссылки https://tobiasahlin.com/blog/move-from-jquery-to-v...

    Если вы хотите узнать "какие изменения в DOM происходят при вызове jquery команды" - типа что произошло-поменялось на странице, какие стили и прочее, то это тоже можно сделать, всякими обсерверами, дебагом с брекпоинтами на изменения и прочим, но не надо нырять в этот омут.
    Посмотреть код команды которая вам интересна будет в 100500 раз быстрее.
    Ответ написан
    Комментировать
  • Что считается уровнем Advanced? И в каких "вещах" должен разбираться специаист, чтобы считаться сциалистом высокого уровня?

    @deliro
    Чтобы выгодно отличаться от javascript-разработчиков, нужно быть не только javascript-разработчиком, но и разработчиком.

    Это единственное и самое важное.
    Ответ написан
    2 комментария
  • Как переместить элемент массива в тот же массив, но перед другим элементом?

    Lynn
    @Lynn
    nginx, js, css
    Самый простой способ:
    const array = [9, 3, 4, 2, 6, 1, 8]
    Ответ написан
    Комментировать
  • Как реализовать таймер с паузами на js?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Пишите в сторадж при возврате читайте.
    Ответ написан
    Комментировать
  • Доступ к расшареной папке на win c ubuntu?

    mindtester
    @mindtester
    http://iczin.su/hexagram_48
    Алексей Артюшевский, smb://host/share

    ps если нет, то сюда https://askubuntu.com/questions/1009455/smb-2-or-3...

    pps
    Алексей Артюшевский Автор вопроса
    Дич, что оно с простого проводника работать не может.
    дичь говоришь?.. ну начнем
    kubuntu
    Es3cvF6.png
    ubuntu
    B5pLLfK.png
    и проводник, в котором якобы ни чего не работает
    7pXCx3f.png
    тогда уж и осяру для коллекции.. почему нет?
    QW46av6.pngIrLhJ0O.png
    Ответ написан
    5 комментариев
  • Тестирования сайта на разных версиях ОС?

    DevMan
    @DevMan
    виртуалки, если денег нет.
    browserstack/аналоги, если надо часто и есть бюджет.
    Ответ написан
    3 комментария
  • Как сделать поддомены?

    Kiriniy
    @Kiriniy
    Графический и веб-дизайнер
    Если вы про домены третьего уровня, то для поисковиков это будут разные сайты. В панели хостинга просто создаётся новый сайт.
    Ответ написан
    1 комментарий
  • Почему неверно работает обработчик JS?

    @its2easyy
    Удалять нужно ту же функцию которая добавлялась, а анонимная функция каждый раз создаётся новая, поэтому
    audio.addEventListener('ended', nextPlayMusic);
    audio.removeEventListener('ended', nextPlayMusic);
    Ответ написан
    1 комментарий
  • Какой алгоритм действий лучше? Как отправить POST запрос через request модуль? Как сохранять массив данных на сервере и обновлять раз в сутки?

    @dmitriu256 Автор вопроса
    Kovalsky, исходя из описанного алгоритма действий получилось следующее
    Вариант1 (поиск городов осуществляется на сервере с отдачей результата клиенту)
    Серверная часть (express js + nodejs)
    //используем этот запрос для живого поиска
    app.post('/city', function(req,res){
    
        let text = req.body.text;
    
       let val = text.trim().toLowerCase(); // приходит от пользователя
        console.log(val);
    
        let city = arr.filter(el => {
            if(val){
                return el.Description.toLowerCase().search(val) !== -1;
            }
        });
        
        res.send(city); // возвращаем массив с данными иначе пустой массив
    });
    
    app.listen(PORT, function(){
        console.log(`Прослушиваем порт по адресу ${PORT}`);
        //Формируем справочник городов компании
            let cityObj = {
                "modelName": "Address",
                "calledMethod": "getCities",
                "methodProperties": {},
                "apiKey": apiKey
            };
            request.post(
                'https://api.novaposhta.ua/v2.0/json/',
                {
                    json: cityObj,
                    headers: {
                        "Content-type": "application/json",
                    }
                },
                function (error, response, body) {
                    let data = body;
    
                    for(let i = 0; i < data.data.length; i++) {
                        arr.push(data.data[i]);
                        console.log(arr[i]);
                    }
                });
        });

    Клиентская часть обработки
    let city = calcForm.elements['cargo-city-to'];
    
    
    if(city.previousElementSibling.hasAttribute('data-select')){
        let el = city.previousElementSibling.querySelector('[data-select-title]');
        el.setAttribute('contenteditable', true);
    
        el.addEventListener('focus', function(){
            this.textContent = '';
    
        });
    
        el.addEventListener('input', function(){
            //Очистка декоративных пунктов
            let selected = city.previousElementSibling.querySelectorAll('[data-select-item]');
    
            
            selected.forEach(el => {
                console.log(el.textContent);
                el.remove();
            });
    
            //очистка стандартного селекта
            for(let i = 0; i < city.options.length; i++){
                city.remove(i);
            }
    
    
            //Запрос живого поиска
            let xhr = new XMLHttpRequest();
    
            xhr.open('POST', 'http://localhost:3010/city');
    
            xhr.setRequestHeader('Content-type', 'application/json; charset = utf-8');
    
            //Отправка данных на сервер
            xhr.send(JSON.stringify({text: this.textContent}));
            console.log(this.textContent);
    
            //проверяем состояние запроса
            xhr.addEventListener('readystatechange', function () {
                if (xhr.readyState < 4) {
    
                } else if (xhr.readyState === 4 && xhr.status === 200) {
    
                    let data = JSON.parse(xhr.response);
    
                    for(let i = 0; i < data.length; i++) {
                        //Формируем список опций у реального селекта
                        createOptions(data[i]);
    
                        city.append(createOptions(data[i]));
                    }
    
                    //Формируем данные в декоративном селекте
                    if(city.previousElementSibling.hasAttribute('data-select')){
    
                        let select = city.previousElementSibling.querySelector('.form-select__dropdown');
    
                        for(let i = 0; i < data.length; i++) {
                            createSelectItem(data[i]);
                            select.append(createSelectItem(data[i]));
                        }
                    }
    
                } else {
                    console.log('Что то пошло не так');
                }
    
            });
    
        });
    }else{
        console.log('---');
    }
    
    
    getCity(city, `http://localhost:3010/city`);
    
    
    //Изначально загружаем с сервера 5 записей из массива городов (что бы декоративный селект имел некоторый список по умолчанию)
    function getCity(elem, url){
        let xhr = new XMLHttpRequest();
    
        xhr.open('GET', url);
    
        xhr.setRequestHeader('Content-type', 'application/json; charset = utf-8');
    
        //Отправка данных на сервер
        xhr.send();
    
        //проверяем состояние запроса
        xhr.addEventListener('readystatechange', function () {
            if (xhr.readyState < 4) {
    
            } else if (xhr.readyState === 4 && xhr.status === 200) {
    
                let data = JSON.parse(xhr.response);
    
                for(let i = 0; i < 5; i++) {
    
                    createOptions(data[i]);
    
                    elem.append(createOptions(data[i]));
                }
    
                //Формируем данные в декоративном селекте
                if(elem.previousElementSibling.hasAttribute('data-select')){
    
                    let select = elem.previousElementSibling.querySelector('.form-select__dropdown');
    
                    for(let i = 0; i < 5; i++) {
                        createSelectItem(data[i]);
                        select.append(createSelectItem(data[i]));
                    }
                }
    
            } else {
                console.log('Что то пошло не так');
            }
    
        });
    }


    Вариант2 (когда вся логика происходит на клиенте, используем API напрямую, города храним в localStorage)
    //Получение городов компании
        let cityTo = calcForm.elements['cargo-city-to'];
        let cityFrom = calcForm.elements['cargo-city'];
    
        checkKeyCity('Mycity', cityTo);
        checkKeyCity('Mycity', cityFrom);
    
        //Получение куки
        function getCookie(name) {
            let matches = document.cookie.match(new RegExp(
                "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
            ));
            return matches ? decodeURIComponent(matches[1]) : undefined;
        }
    
        //Загрузка городов в localStorage
        function getCities(){
            let date = new Date();
            date = new Date(date.setDate(date.getDate() + 1));
    
    
            let cityObj = {
                "modelName": "Address",
                "calledMethod": "getCities",
                "methodProperties": {},
                "apiKey": apiKey
            };
    
            let xhr = new XMLHttpRequest();
    
            xhr.open('POST', 'https://api.novaposhta.ua/v2.0/json/');
    
            xhr.setRequestHeader('Content-type', 'application/json; charset = utf-8');
    
            //Отправка данных на сервер
            xhr.send(JSON.stringify(cityObj));
    
            //проверяем состояние запроса
            xhr.addEventListener('readystatechange', function () {
                if (xhr.readyState < 4) {
    
                } else if (xhr.readyState === 4 && xhr.status === 200) {
                    let city = [];
                    let obj = {};
    
                    let cities = JSON.parse(xhr.response);
    
                    for (let i = 0; i < cities.data.length; i++) {
    
    
                        obj = {
                            Ref: cities.data[i].Ref,
                            Description: cities.data[i].Description
                        };
    
                        //Сформировали справочник населенных пунктов
                        city.push(obj);
    
                    }
    
                    localStorage.setItem('Mycity', JSON.stringify(city));
    
                } else {
                    console.log('Что то пошло не так');
                }
            });
    
            document.cookie = `${decodeURI('cities')} = ${decodeURI(true)}; expires = ${date}; path = /`;
        }
    
    
        //Проверка наличие куки
        if(getCookie('cities') === undefined) {
            getCities();
        }
    
        //Проверка наличия ключа в localStorage
        function checkKeyCity(key, element){
    
            if (localStorage.getItem(key) !== null){
                let data = JSON.parse(localStorage.getItem(key));
    
                //Формируем данные в селекте
                for(let i = 0; i < data.length; i++) {
    
                    createOptions(data[i]);
    
                    element.append(createOptions(data[i]));
                }
    
    
                //Формируем данные в декоративном селекте
                if(element.previousElementSibling.hasAttribute('data-select')){
                    let select = element.previousElementSibling.querySelector('.form-select__dropdown');
                    select.overflowY = 'scroll';
    
                    for(let i = 0; i < data.length; i++) {
                        createSelectItem(data[i]);
                        select.append(createSelectItem(data[i]));
                    }
                }
    
    
                let el = element.previousElementSibling.querySelector('[data-select-title]');
                el.setAttribute('contenteditable', true);
    
                el.addEventListener('focus', function(){
                    this.textContent = '';
                });
    
    
                //Живой поиск ++
                el.addEventListener('input', function(){
    
                    element.previousElementSibling.querySelector('.form-select__dropdown').classList.remove('hidden');
    
                    let val = this.textContent.trim().toLowerCase();
    
                    let items = element.previousElementSibling.querySelectorAll('.form-select__item');
    
    
                    if(val != ''){
                        items.forEach(function(elem) {
                            if(elem.textContent.toLowerCase().search(val) == -1) {
                                elem.classList.add('hidden');
                            }else{
                                elem.classList.remove('hidden');
                            }
                        });
                    }else{
                        items.forEach(function(elem) {
                            elem.classList.remove('hidden');
                        });
                    }
                });
    
            }
        }

    Итог
    Остановился на Варианте2 - скорость поиска быстрее, тк один раз загружаем города в хранилище в дальнейшем постоянно обращаемся к нему, без использования ресурсов сервера.
    -Построение DOM дерева происходит один раз
    - живой поиск осуществляется простым добавления класса hidden городов, которые не подходят под условия поиска.
    Ответ написан
    1 комментарий
  • Как правильно хостить и проигрывать видео в 2020?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Почитайте статьи про niginx-rtmp
    Когда я делал свой стриминг, я делал несколько разных способов доставки с выбором способа, в зависимости от того, что за клиент подключился.
    Для андроидов, например, я слал webm.
    Для маков HLS
    Для писюков - тоже webm
    У меня был живой поток, так что архитектура была такая - один сервер делал транскодирование во все видеоформаты и все разрешения, (порядка 12 вариантов, 6 разрешений в двух форматах), и еще три энджайникса заворачивали расклонированные по udp-multicast потоки куда надо.

    Ваша проблема, скорее всего, не в формате, а в затыках дисковой подсистемы. Подумайте о кластере типа ceph.
    Ответ написан
    1 комментарий
  • Почему не работает метод Vue JS?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    @click="cbActive"
    @click="cbActive($event)"
    Ответ написан
    3 комментария
  • Как средствами javascript распознать тревожный плач и крик в режиме реального времени?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Я бы разбил по шагам:
    1. найти/создать решение, которое успешно справится с задачей распознавания. Скорее всего это будет какая-то модель машинного обучения, возможно, на TensorFlow.
    2. впихнуть обученную модель в моб. приложение.


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

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Как подходить к организации кода для сайта?

    В зависимости от задач, бюджета, времени и желания заказчика.

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

    Если у Вас продающий лендинг(без логики и приходящих данных с сервера), то нет смысла пихать туда заумные паттерны проектирования - сойдет обычная статика, либо сайт посаженный на CMS(систему управления сайтом), если у Вас крупный интернет магазин, с огромным колличеством логики, огромными приходящими с сервака данными - вы используете инструменты которые созданы под эту задачу(CMS или фрейморки).

    В сети нет нормальной статьи/видео по этой теме. Чуть ниже, я напишу просто список непонятных слов, фраз, которые многих вгоняют в ступор.

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

    "подходы разделение кода, шаблонизация, модули, МVC, state, организация кода, биндинг, реактивное программирование, SPA, MPA, Virtual DOM, Нода, Веб-компоненты, Templates, Custom Elements API.” … Что и откуда выходит? Есть ли какие-то блок схемы, на которых это можно увидеть... книги? Можно ли это всё описать одни словом - Паттерны?"

    У большинства людей вытекут глаза, и из ушей кровь пойдет. Все эти непонятные слова гуглятся, и объясняются очень простым языком.

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

    Да, такая блок схема есть. В зависимости от выбранного Вами языка - она называется RoadMap. К примеру вы выбрали себе язык Java или PHP - ваш путь на Java Developer Roadmap или Php developer roadmap.
    Ответ написан
    3 комментария
  • Операции с определенным количеством элементов в цикле, как?

    edward_freedom
    @edward_freedom
    С помощью метода execute, можно вызвать 25 методов, одним запросом. Пример указан на странице документации
    Ответ написан
    Комментировать