Задать вопрос
  • С помощью каких технологий лучше всего делать интерактивные географические карты для веб-игр?

    @Interface
    Ну в простейшем случае, может быть достаточно просто взять растровую картинку карты и использовать ее как бэкграунд. Соотвественно, остается научиться ее скролить и масштабировать (+ возможно вращать).

    Судя по всему вам этот очевидный подход почему-то не подошел. Раскройте свои требования:
    1) какой минимальный и максимальный зум?
    2) предполагаемый размер карты?
    3) может быть она должна быть анимированной?
    4) 2д или 3д карта?
    5) насколько она должна быть интерактивной? можно ли по ней перемещаться (аля Fallout)
    и т. д.

    Все это поможет подобрать решение.
    Ответ написан
    Комментировать
  • Node js как добавлять свой модуль без полного пути?

    @Interface
    - заиспользовать https://docs.npmjs.com/files/package.json#local-paths
    - использовать lerna https://github.com/lerna/lerna
    - положить симлинку на нужный модуль в ./node_modules вручную
    - использовать софт для синхронизации папок (e.g. lsyncd)
    - использовать NODE_PATH https://nodejs.org/api/modules.html#modules_addend...
    - переопределение механизма резолва зависимостей node https://tech.wayfair.com/2018/06/custom-module-loa...
    - переопределение механизма резолва зависимостей webpack'ом https://webpack.js.org/concepts/module-resolution/

    еще можно тут почитать https://gist.github.com/branneman/8048520
    Ответ написан
    Комментировать
  • Как по двум точкам сделать бесконечно длинную прямую?

    @Interface
    1) получаете уравнение прямой по двум точкам (легко гуглится), как это сделать можно посмотреть тут www.math.by/geometry/eqline.html
    2) подставляете координаты границ канваса в уравнение - получаете точки лежащие одновременно на границах и на прямых
    3) соединяете их отрезками
    Ответ написан
    2 комментария
  • Можно ли написать функцию, которая проверяет существует ли переменная или нет (js)?

    @Interface
    Дисклеймер: так как вопрос скорее теоретический, я не стараюсь предоставить "адекватное" решение.
    Конечно, все это нельзя использовать в реальном проекте!


    Интересный вопрос.

    Начнем с того, что определимся насколько критично сохранить сигнатуру функции? В зависимости от этого, решения можно поделить на 2 категории:
    - где допускается изменение сигнатуры
    - где сигнатура должна быть строго такой и никакой иначе

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

    Стоит оговориться, что строго говоря такую функцию в данном виде написать нельзя, потому как при вызове функции переменная уже должна быть "разименована", а значит мы так или иначе будем работать с ее значением или с какими-то косвенными сайд эффектами вызванными обращением к ней.


    Сначала рассмотрим несколько решений с изменением сигнатуры: они попроще и в каком-то смысле более логичны.

    есть как минимум 2 категории решений с изменением сигнатуры:
    - функция будет принимать строку
    - функция будет принимать функцию

    При этом проблема того, что все падает до попадания в функцию, пропадает сама собой.

    вот несколько решений:

    1) класс решений построенный на анализе кода в рантайме:
    решение заключается в том, что вызываемая функция анализирует свой код (а также код функции которая вызвала ее и т.д.)
    https://stackoverflow.com/questions/2051678/gettin... вот тут есть частчный разбор такого решения.
    Приводить его в виде кода я не буду :)

    Плюсы:
    - вроде как решает задачу
    - сигнатура изменилась не сильно
    Минусы:
    - крайне жирное решение с точки зрения производительности
    - сигнатура не та, что просили
    - нельзя использовать 'use strict', так как решения возможно будут завязаны на arguments.callee.caller

    Уровень безумия: достаточно безумное

    2) решение построенное на том, что приниматься будет функция:
    isExists(() => someVar); // такая будет сигнатура

    Это решение хоть и меняет сигнатуру, но ее возможно сохранить максимально подобной желаемой

    Одна из возможных реализаций:
    function isExists(someVarFn){
        try {
            someVarFn();
        } catch(e) {
            if (e instanceof ReferenceError) {
                return false;
            }
            throw e;
        }
        return true;
    }

    Примеры использования:
    function f1() {
        let x;
        console.log(isExists(() => x)); //  => true
        console.log(isExists(() => y)); //  => false
    }
    
    function f2() {
        let x;
        console.log(isExists(() => x)); //  =>  true
        console.log(isExists(() => y)); //  => false
    }
    
    f1();
    f2();


    Плюсы:
    - плюс-минус адекватная производительность
    - довольно компактно
    Минусы:
    - несильно меняется сигнатура функции
    - api получается несколько не очевидным

    Уровень безумия: почти адекватное

    3) решения с использованием eval:
    Суть похожа на решение #2, но с другим api:
    function isExists(varName, fn){
        return fn(`(()=>{
            try {
                const nop = ${varName};
            } catch(e) {
                if (e instanceof ReferenceError) {
                    return false;
                }
                throw e;
            }
            return true;
        })()`);
    }
    
    function f1() {
        let x;
        console.log( isExists('x', c => eval(c)) ); //  => true
        console.log( isExists('y', c => eval(c)) ); //  => false
    }
    
    function f2() {
        let y;
        console.log( isExists('x', c => eval(c)) ); //  =>  false
        console.log( isExists('y', c => eval(c)) ); //  => true
    }
    
    f1();
    f2();


    Плюсы:
    - сложнее чем в №2 передать какую-то фигню
    Минусы:
    - сигнатура отлиается сильнее и уродливей
    - сложнее / жирнее / больше чем №2

    Уровень безумия: безумненько

    Решения с сохранением сигнатуры:

    4) магия es6 Proxies + with
    класс решений строится на стратегии: слушать доступ к глобальному объекту и если он происходит и в нем нет переменной с таким именем - такой переменной нет:
    const pseudoUndefined = {};
    
    const scopeTrap = new Proxy(window, {
        has() {return true},
    
        get(target, prop) {
            if (prop in window) {
                return window[prop];
            } else {
                return pseudoUndefined;
            }
        }
    })
    
    function isExists(someVar) {
        return someVar !== pseudoUndefined;
    }
    
    // весь код использующий функцию должен быть обернут в такой with :(
    with (scopeTrap) {
    
        let y;
        console.log( isExists(x) ); //  =>  false
        console.log( isExists(y) ); //  => true
    
    }


    Плюсы:
    - мы сохранили желаемую сигнатуру! Ура!
    Минусы:
    - теперь вместо исключения будет получаться что-то совсем левое. Хорошего дебагга! :D
    - накладные расходы производительности
    - все нужно обернуть в with
    - необходима поддержка es6+

    Уровень безумия: с точки зрения реализации - задача подъемная. использовать в бою - а вы знаете толк!

    Решения с предобработкой:

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

    5) первое, что приходит в голову с приобретением такой свободы - это, очевидно... написание своего языка программирования компилируемого в js / своего интерпретатора js и т.д.
    В рамках этого решения особого труда (относительно всего прочего) не составит реализовать такую функцию нативно.

    Плюсы: ...
    Минусы: ...
    (Без комментариев)

    Уровень безумия: я думаю все понятно
    ...

    есть и более сдержанные решения, например, используя compile-time можно оптимизировать предыдущие решения:

    6) можно используя парсер составить дерево областей видимости (хэш-таблица [функция <-> список переменных]), привязать каждую область к функции, через позицию в исходном коде (возможно придется сохранять дополнительную информацию). А дальше все это интегрировать с решением №1.

    В итоге:

    Плюсы относительно (#1):
    - относительно хорошая производительность
    Минусы:
    - сложно
    - дорого
    - требует compile-time

    Уровень безумия: стало еще безумнее, чем было :)

    7) написать (или найти) плагин для babel'я (или чего-то другого), который будет трансформировать доступ к переменным в особую функцию

    Плюсы относительно (#1):
    - достигнут результат
    Минусы:
    - требует поддержки
    - требует compile-time
    - упадет производительность (вероятнее всего существенно)

    Уровень безумия: буднечно безумное
    Ответ написан
    3 комментария
  • Почему я не могу получить ответ на запрос к удаленному источнику?

    @Interface
    "Access-Control-Allow-Origin": "*"
    это должно быть в заголовках ответа, а не запроса
    Ответ написан
    Комментировать
  • Как вывести результат асинхронной функции во внешнюю переменную?

    @Interface
    Вас спасет async/await!
    Почитать можно тут https://habr.com/ru/company/ruvds/blog/326074/, например
    Ответ написан
    Комментировать
  • Отвратительный лог ошибок в nuxt?

    @Interface
    Вам нужно настроить source-maps, почитайте как это сделать в вашей среде.
    Для webpack можно тут, например, почитать https://survivejs.com/webpack/building/source-maps/

    Source-map как раз и позволяет получать адекватные stack-trace'ы и вообще крайне полезная вещь для отладки
    Ответ написан
    Комментировать
  • Как переписать функцию map js для возможности использования в ie11?

    @Interface
    Вы используете es6. => ` вот это все. Это синтаксис - полифил не поможет.

    Вставьте код сюда: https://babeljs.io/repl/
    бабель его преобразует к es5, например.

    Почитайте про: es5, es6 (es2015), babel, транспайлеры, отличия между транспайлером и полифилом
    Ответ написан
    3 комментария
  • Как правильно разделить массив?

    @Interface
    lodash хорошо решает эту задачу, посмотрите метод partition: https://lodash.com/docs/4.17.11#partition

    const arr = {
      list: [
        {id: 1, pos: {dv: "T5"}},
        {id: 2, pos: {dv: "T10"}},
        {id: 3, pos: {dv: "T12"}},
        {id: 4, pos: {dv: "T11"}},
        {id: 5, pos: {dv: "T45"}},
        {id: 6, pos: {dv: "T56"}},
        {id: 7, pos: {dv: "T38"}},
        {id: 8, pos: {dv: "T-9"}},
        {id: 9, pos: {dv: "T0"}}
      ]
    };
    
    _.partition(arr.list, obj => Number(obj.pos.dv.slice(1)) >= 38)
    Ответ написан
  • Property 'butlers' does not exist on type 'House'?

    @Interface
    А что вас смущает? У вас функция возвращает union тип. Значит там либо одно, либо другое. То есть набор полей у результата - это пересечение множества полей Mansion и House. В пересечении нет поля butlers.

    Если будете вручную приводить к типу as Mansion как говорит 0xD34F можете нарваться на runtime ошибку. TS вам все верно говорит.

    Вам нужно определиться, что делает ваша функция:
    - возвращаяет одно из двух - тогда она может вернуть House, а там действительно нет butlers
    - возвращает House и дополняет его butlers равным 10? Тогда возможно вам вообще нужен новый тип.

    Если вы хотите вернуть что-то, что одновременно и Mansion и House используйте &:
    function getProperty() : ( Mansion & House) {
    ...


    Такой код читается как "вернуть объект который одновременно и Mansion и House". При этом в типе будет объединение множеств полей Mansion и House

    P. S. если Mansion подвид House - можно использовать extends:
    interface House {
        bedrooms: number,
        bathrooms: number
    }
    interface Mansion extends House {
        butlers: number
    }
    Ответ написан
    Комментировать
  • Правильно ли делать один компонент для вывода всех категорий товаров?

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

    То уже имеет смысл думать о каком-то разделении; Но в любом случае соответвие 1:1 между категориями и компонентами вряд-ли нужно. В крупных онлайн магазинах - тысячи категорий. Иметь для них тысячи компонентов - вряд ли может быть оправдано.
    Ответ написан
    Комментировать
  • Почему регулярка быстрее indexOf?

    @Interface
    Прежде всего нужно понять - действительно ли быстрее?

    Есть замечательный доклад на эту тему: https://www.youtube.com/watch?v=HPFARivHJRY - очень рекомендую к просмотру.

    На вскидку:
    - движок может выкидывать тот или иной кусок бенчмарка
    - движок может реализовывать какой-либо кэш и считать один раз

    P.s. в мозиле результаты другие: победил lodash, что иронично потому что у него под капотом indexOf
    Ответ написан
    4 комментария
  • Как уменьшить значение типа #cef1ff?

    @Interface
    Как вариант решения с обработкой переполнения разрядов и трехсимвольных цветов
    function hexToTriple(hex) {
        hex = hex.slice(1);
        if (hex.length === 3) {
            return hex.split('').map(byte => parseInt(byte.repeat(2), 16));
        } else if (hex.length === 6) {
            return hex.match(/.{2}/g).map(byte => parseInt(byte, 16));
        } else {
            throw new Error(`invalid color ${hex}`);
        }
    }
    
    function tripleToHex(triple) {
        return '#' + triple.map(byte => byte.toString(16).padStart(2, '0')).join('');
    }
    
    function hexColorSubtract(hexAColor, hexBColor) {
        const [tripleA, tripleB] = [hexAColor, hexBColor].map(hexToTriple);
        const resultTriple = tripleA.map((byte, index) => {
            return Math.max(byte - tripleB[index], 0);
        });
        return tripleToHex(resultTriple);
    }
    
    // использование:
    
    hexColorSubtract("#cef", "#110011"); // #bbeeee
    Ответ написан
    Комментировать
  • В Каких виртуальных машинах можно поиграть в игры?

    @Interface
    https://habr.com/ru/post/437598/
    на хабре как раз была свежая статья
    Ответ написан
    Комментировать
  • Как заставить работать прокси через виртуалбокс?

    @Interface
    Попробуйте nslookup чтобы зарезолвить имя хоста в IP адрес.
    (утилита командной строки)

    Или выставить bridge вместо NAT.
    Ответ написан
    Комментировать
  • Можно ли через node js написать программу, которая сможет обращаться к внутренностям компьютера?

    @Interface
    В двух словах - можно. У самой ноды нет встроенного API для этого, но можно использовать сторонние пакеты, которые это реализуют. Они работают по одной из двух стратегий:
    - используют нативные аддоны (у ноды есть механизм интеграции бинарных модулей), для этого можно использовать C++; (таким образом все что можно сделать на C++ можно обернуть в модуль и оно будет доступно в node.js)
    - используют существующие утилиты командной строки в разных ОС и парсят их вывод. При всех недостатках этого подхода, есть существенное преимущество - нет необходимости компилировать модули при установке или качать бинарники в слепую. А на windows может быть совсем нетривиально компилировать бинарные зависимости.

    Один из пакетов https://www.npmjs.com/package/systeminformation

    Поищите в npm возможно там есть готовое все, что вам нужно.
    Ответ написан
    Комментировать
  • Как поменять тег src у img?

    @Interface
    vadimkravchenko0, проблема в том, что вы обратились не совсем на тот ресурс. Точнее скорее всего нужного вам ресурса просто нет. Потому что все вопросы и проблемы можно условно разделить на 2 категории:
    - общие вопросы
    - конкретные задачи

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

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

    У вас есть 2 пути:
    - разбираться самостоятельно, изучая материалы и т. д. (тогда забудьте про "Но я совсем чайник в кодах, мне это и не нужно.")
    - либо обратиться на фриланс (это может быть и друг, который шарит и может помочь за шоколадку)

    Если я правильно понял проблему, вам должен помочь user-script. Установите себе greasemonkey (расширение браузера), например. И напишите и добавьте туда свой user-script. Скрипт вам уже написал Johnny Lowhunter

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

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

    @Interface
    Если возникает необходимость посмотреть как интерпритируется тот или иной синтаксис - может быть полезно посмотреть на AST. Сделать это можно, например, тут https://astexplorer.net/

    Слева вставляете код, справа смотрите как его понимает парсер (не реальный парсер движка, но в большинстве случаев это не критично)

    Если вы вдруг забыли приоритеты операций (yield vs. ternary например) - это может быть полезно
    Ответ написан
    Комментировать
  • Как записать в локальный JSON?

    @Interface
    у вас есть 4 варианта:
    - хранить в localStorage (это не JSON файл, но может быть вам подойдет) - вероятно самое простое
    - генерировать файл в браузере и предложить пользователю его сохранить (тут можно почитать https://stackoverflow.com/questions/3665115/create...
    - запускать не только браузер на своей машине, но и сервер (ну и обрабатывать запросы и т.д.)
    - использовать совмещенный браузер с нодой (похоже на 3 вариант). Вам может подойти nw.js или electron

    XMLHttpRequest - выполнит только запрос и будет частью решения #3, но само взаимодействие с файловой системой будет делать сервер
    Ответ написан
  • Как настроить ts config и webpack?

    @Interface
    Скорее всего ругается TS. Добавьте в tsconfig.json соответствующие алиасы для ваших модулей. О том как, можно почитать тут https://www.typescriptlang.org/docs/handbook/modul...
    Ответ написан
    Комментировать