• Стоит ли строить локальную сеть на базе коаксильного телевизионного кабеля?

    @TheBigBear
    СтарОдмины мы
    В Вашем случае наиболее оптимальным будет использование устройств Powerline (Ethernet по электрическим проводам 220В)
    теоретически можно добиться гигабита
    Например, TP-LINK TL-PA7017P

    Если бюджет не сильно ограничен - дополню
    Можно использовать Wi-Fi+Powerline Mesh система TP-LINK Deco P9
    (Mesh - это бесшовный WiFi)
    Самое то в Вашем случае
    Ответ написан
    Комментировать
  • Стоит ли строить локальную сеть на базе коаксильного телевизионного кабеля?

    gbg
    @gbg Куратор тега Компьютерные сети
    Любые ответы на любые вопросы
    1. Скорость будет зависеть от качества прокладки кабеля и разветвителей. Если в разветвителях есть какой-то креатив типа усилителей, фильтров, и так далее, скорость упадет. Более того, любое соединения кабеля - это источник отражения сигналов. Больше отражений - хуже связь.

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

    3. ТВ кабель имеет волновое сопротивление 75 Ом. Сетевые устройства могут быть и на 50 Ом. Перепутывание сопротивлений ухудшает связь вплоть до полной невозможности.

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

    Короче, все эти мероприятия попадают в разряд в лучшем случае, интересных технических авантюр. Хотите хорошую связь - тяните кабели Ethernet, ставьте коммутатор и так далее.
    Ответ написан
    10 комментариев
  • Как сделать "двойную" сортировку в массиве объектов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сортируем существующий массив:

    arr.sort((a, b) => (a.rooms - b.rooms) || (a.square - b.square));
    
    // или, в более общем виде
    
    const sort = (arr, ...keys) =>
      arr.sort((a, b) => {
        let diff = 0;
        keys.find(k => diff = a[k] - b[k]);
        return diff;
      });
    
    
    sort(arr, 'rooms', 'square');

    Создаём отсортированный новый:

    const sorted = (arr, keys) => arr
      .map(n => [ n ].concat(keys(n)))
      .sort((a, b) => {
        let diff = 0;
        for (let i = 0; ++i < a.length && !(diff = a[i] - b[i]);) ;
        return diff;
      })
      .map(n => n[0]);
    
    
    const sortedArr = sorted(arr, n => [ n.rooms, n.square ]);
    Ответ написан
    4 комментария
  • Typescript generic function. How use with other types?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Нет, проблем тут куча.

    T extends [], K extends keyof T - K тут что-то производное от number, потому что ключи(keyof) массива([]) - только цифры.
    let resultSort: T = arr; - бессмысленно, так как arr.sort в любом случае меняет исходный массив.
    a[propertyName].toLowerCase() - упадёт если propertyName будет year, т.к. Number не имеет метода toLowerCase.
    ...

    В итоге функция должна выглядеть как-то так:
    function sortArray<T extends {[key: string]: unknown}, K extends keyof T>  (originArr: T[], propertyName: K, cb: (a: T[]) => T[]): T[] {
      let arr: T[] = JSON.parse(JSON.stringify(originArr));  //deep copy array
    
      arr.sort((a, b) => {
        let nameA = String(a[propertyName]).toLowerCase(),
            nameB = String(b[propertyName]).toLowerCase();
    
        if (nameA < nameB)
          return -1;
        if (nameA > nameB)
          return 1;
        return 0;
      });
    
      return cb(arr);
    }


    Можно не приводить строго к String, но тогда вместо unknown надо указать конкретные типы с которыми предполагается работать, и в самой функции сортировки их учесть.
    Ответ написан
    2 комментария
  • Можно ли сделать switch-case из списка?

    0xD34F
    @0xD34F Куратор тега JavaScript
    switch (true) {
      case one.includes(inp):
        ...
        break;
    
      case two.includes(inp):
        ...
        break;
    }

    Но вообще, в подобной хрени необходимости нет. Собираете в объекты пары массив + завернутый в функцию код из соответствующего массиву case'а, полученные объекты кладёте в массив:

    const arr = [
      {
        values: [ ... ],
        action: () => { ... },
      },
      {
        values: [ ... ],
        action: () => { ... },
      },
    ];

    И тогда всё сведётся к поиску элемента и вызову метода:

    arr.find(n => n.values.includes(inp))?.action();
    Ответ написан
    4 комментария
  • Можно ли сократить этот код, но чтобы он не лишался своих функций?

    @ovodovod
    I am Software Engineer
    С помощью простой рекурсии будут вызываться функции sayHello и getAge до тех пор, пока наш пользователь не даст ответ:

    const promt = (message = '') => window.prompt(message);
    
    function sayHello() {
      let name = promt('Здравствуйте, как вас зовут?');
      return name || sayHello();
    }
    
    function getAge() {
      let age = promt('Сколько вам лет?');
      return age || getAge();
    }
    
    function greeting() {
    	let name = sayHello();
      let age = getAge();
    
      alert(`Здравствуйте ${name}, вам ${age} лет.`);
    }
    
    greeting();


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

    const promt = (message = '') => window.prompt(message);
    
    function getAnswerAnyway(defaultQuestion, repeatQuestion) {
      const iter = (atempts = 2) => {
        const question = atempts === 2 ? defaultQuestion : repeatQuestion;
        let age = promt(question);
        return age || iter(atempts - 1);
      }
    
      return iter(2);
    }
    
    function greeting() {
    	let name = getAnswerAnyway(
        'Здравствуйте, как вас зовут?',
        'Я же спрашиваю, как вас зовут?',
      );
    
      let age = getAnswerAnyway(
        'Сколько вам лет?',
        'Почему молчите? Возраст укажите',
      );
    
      alert(`Здравствуйте ${name}, вам ${age} лет.`);
    }
    
    greeting();


    Рабочий код можно посмотреть здесь.
    Ответ написан
  • Почему не советуют писать await после return в функции?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Нет "правильно" и "неправильно". Лично я раньше тоже убирал await, потом наоборот стал добавлять.
    Не советуют потому что с точки зрения логики это лишнее слово.

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

    Поэтому, если вы видите return await не спешите говорит что человек написавший эти строки не в курсе как работает async/await, возможно он знает лучше вашего ;)
    Ответ написан
    Комментировать
  • Из-за чего возникает ошибка?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    Нужно писать
    Скачать gulpfile.js бесплатно, без регистрации, без смс, на высокой скорости, на русском, кряк
    Ответ написан
    3 комментария
  • Как лучше всего организовать удаленный доступ (полный) к нескольким машинам через интернет (возможно KVM-over-ip)?

    @hank13
    Раньше использовал такую связку один KVM over IP DKVM-IP1 dlink.ru/ru/products/3/584.html и он был воткнут в обычный большой KVM на 10 устройств, тоже по моему Д-линк. Подключались по веб к IP KVM и уже горячими клавишами из консоли на большом KVM переключали экраны.
    Ответ написан
    1 комментарий
  • Как заменить бекслеш на кавычку?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    const a = 'Destiny\s Child';
    Теперь попробуйте вывести a и получите Destinys Child. Т.е. не будет слеша.

    Решение: добавьте экранирование слеша.
    "Destiny\\s Child".replace(/\\s/g, "'s");
    Ответ написан
    Комментировать
  • Как регуляркой найти первую точку в строке?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    "Ivanov I.Petrov P. Sidorov S.".replace(/\./, '\.<br>')


    "Ivanov I.<br>Petrov P. Sidorov S."
    Ответ написан
    1 комментарий
  • Обязателен ли Git для front-end'a?

    Machinez
    @Machinez
    Да.
    Ответ написан
    Комментировать
  • Можно ли настроить консоль node.js, чтобы она была видна в браузере?

    notiv-nt
    @notiv-nt
    Как ваше ничего? Да, моё тоже
    node --inspect ?
    Ответ написан
    Комментировать
  • Как добавить большую часть html кода с помощью js?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const keys = [
      [
        { on: [ 'ё', 'Ё' ], off: [ '`', '~' ], name: 'Backquote' },
        { on: [ '1', '!' ], off: [ '1', '!' ], name: 'Digit1' },
        ...
      ],
      ...
    ];
    
    
    document.querySelector('.keyboard').innerHTML = keys.map(row => `
      <div class="row">${row.map(n => `
        <div class="key">
          <span class="${n.name} on">
            <span class="case down">${n.on[0]}</span>
            <span class="case up">${n.on[1]}</span>
          </span>
          <span class="${n.name} off">
            <span class="case down">${n.off[0]}</span>
            <span class="case up">${n.off[1]}</span>
          </span>
        </div>`).join('')}
      </div>`).join('');
    Ответ написан
    Комментировать
  • Как получить самый последний самый вложенный элемент?

    profesor08
    @profesor08 Куратор тега JavaScript
    Выбираешь элементы с помощью querySelectorAll, проходишь по ним, смотришь их потомков, если у потомков нет потомков, то выбираешь последнего.

    А если структура не меняется, то вбей CSS селектор нужного элемента в document.querySelector("div div div ....")
    Ответ написан
    Комментировать
  • Try catch или then catch для rest api?

    profesor08
    @profesor08
    Используй try/catch, про колбеки можешь забыть. Раньше только так можно было отловить какие-то исключения во время выполнения, теперь в них нужды нет.

    Код чище, понятнее.
    async getAll(req, res) {
        try {
           const { rows, rowCount } = await db.query(query)
           return res.status(200).send({ rows, rowCount })
        } catch (error) {
           return res.status(400).send(error)
        }
      }
    Ответ написан
    4 комментария
  • Как использовать один терминал, для нескольких процессов?

    @SANTA2112
    Можешь попробовать pm2.keymetrics.io , он должен решать твои задачи, если что, он работает не только с нодой
    Ответ написан
    2 комментария
  • Какие языки используют для создания приложений?

    bingo347
    @bingo347
    Crazy on performance...
    ОС чаще всего пишут на низкоуровневых языках, вроде C (Linux, FreeBSD), C++ (Windows), Rust (Redox). Иногда используют ассемблерные вставки.

    Игры (имеются в виду 3D игры) чаще всего пишут на C++, но так же возможно на C# (Unity), JS (Unity или что-то упрощающее работу с WebGL). Хотя могут быть и другие языки (например майнкрафт написан на JAVA, а старый добрый Doom - на C). Так же понадобится язык шейдеров для программирования видеокарты, например для OpenGL и WebGL таким языком является GLSL.

    Прикладной софт вообще пишется на чем угодно, выбор языка зависит от задачи. Но в некоторых сферах все же можно выделить лидеров:
    Энтерпрайз решения - Java EE, реже C#
    Десктопный софт под Windows - C# (реже другие языки .net платформы)
    Десктопный софт под MacOS - Swift
    Десктопный софт кросплатформенный - Java, Python, JS (Electron)
    Мобильный софт под Андроид - Kotlin, Java
    Мобильный софт под iOS - Swift
    Мобильный софт кросплатформенный - C# (Xamarin), JS (Cordova, ReactNative, etc.)
    Серверный софт - php, Python, Ruby, JS (node), Java, Go, Rust, ... вариантов много
    Браузерный софт - JS или то что компилится в JS (чаще TypeScript)
    Ответ написан
    11 комментариев
  • С помощью каких технологий лучше всего делать интерактивные географические карты для веб-игр?

    @givemoneybiatch Автор вопроса
    Немного веб, немного гейм
    Нашел две интересные статьи на тему
    И хоть для моего случая оказалось достаточно простой карты-картинки, думаю это может быть кому-то полезным
    https://blog.patricktriest.com/game-of-thrones-map...
    https://blog.patricktriest.com/game-of-thrones-lea...
    Ответ написан
    Комментировать
  • Как понять промисы?

    rockon404
    @rockon404
    Frontend Developer

    Не понятно почему эта херня будет выполняться параллельно

    Она не будет выполняться параллельно. Она будет выполняться последовательно.
    const await1 = await pause500ms();  // ожидаем 500мс разрешение промиса и получаем undefined
    const await2 = await pause500ms(); // ожидаем 500мс разрешение промиса и получаем undefined
    await await1;  // передаем undefined и получаем разрешенный промис
    await await2;  // передаем undefined и получаем разрешенный промис
    console.log("I will be logged after 500ms"); // No, you will be logged after 1000ms


    Вызовы await await1; и await await2; на первый взгляд не оказывают влияния на код, но это не так.
    Пример1
    (async() => {
      await console.log(1);
      console.log(2);
    })();
    console.log(3);
    
    // 1
    // 3
    // 2

    Демо
    Пример2
    (async() => {
      await console.log(1);
      await console.log(2);
      console.log(3);
    })();
    console.log(4);
    
    (async() => {
      await console.log(5);
      console.log(6);
    })();
    console.log(7);
    
    // 1
    // 4
    // 5
    // 7
    // 2
    // 6
    // 3

    Демо
     

    Какой промис возвращает функция - разрешенный или нет?

    Не разрешенный. Он разрешается через 500ms когда setTimeout вызывает res. Вашу функцию можно переписать так:
    function pause500ms() {  
        return new Promise(function(resolve) {
          setTimeout(function() {
            resolve(); // вот тут разрешается созданный Promise
          }, 500);
        }); 
    }


    В константу await1 записывается функция(?) или результат ее исполнения, а именно промис?

    await1 и await2 получают Promise, но когда он разрешается он ничего не возвращает, поэтому дальше в коде они имеют значение undefined.

    А здесь, получается, функция вызывается?

    await1 и await2 имеют значение undefined. Оператор await получает undefined и вызов:
    await await1;
    await await2;
    console.log("I will be logged after 500ms");

    равносилен:
    Promise.resolve(undefined).then(() => {
      Promise.resolve(undefined).then(() => {
        console.log("I will be logged after 500ms");
      });
    });


    Что значит возвращает промис?
    // Что значит промис. Промис, это спецобъект, содержащий свое состояние и инструкции, которые необходимо исполнить после достижения того или иного состояния. Так? Так.

    Тут уже лучше читать теорию. На том же MDN дается разжеванный ответ. Понимание придет с практикой. Просто пишите асинхронный код.
    Ответ написан
    Комментировать