• Как называется профессия человека, работающего как аутсорс компания?

    HoHsi
    @HoHsi Автор вопроса
    Нашел определение

    A person or organization which provides goods or services by contract from outside a particular organization or area; an external supplier.


    Да, человека тоже корректно называть оутсорсером
    Ответ написан
    Комментировать
  • Как реализовать такой скролл как на thewitcher.com/en/witcher3?

    HoHsi
    @HoHsi
    Предположу, что это на банальном эвенте wheel + throttle/debounce

    const body = document.getElementsByTagName('body')[0];
    body.addEventListener('wheel', _.throttle((e) => {
      const isNext = e.deltaY > 0;
    
      if (isNext) {
        // Следующий слайд
        console.log('->');
      } else {
        // Предыдущий слайд
        console.log('<-');
      }
    }, 1000, {
      trailing: false
    }));
    Ответ написан
    Комментировать
  • Как открыть порт на DD-wrt?

    HoHsi
    @HoHsi Автор вопроса
    Оказалось, что если подключаться к серверу из другой сети (мобильная, прокси) он отвечает. Не отвечает только в одном случае, если подключиться по внешнему IP находясь в той же сети.

    Решил варварски.
    1) Настроил NAT/Port Forwarding
    cc6a38bd240e43d286bd24e9e7511b6e.PNG

    2) Добавил на Administration/Commands -> Startup такой скрипт
    cat <<EOF >> /etc/hosts
    # Local server
    192.168.1.100 myawesomesite.com
    EOF
    restart_dns


    Вероятнее всего это можно было сделать и по нормальному через iptables, но что есть.

    P.S. если кто-то знает как это сделать в iptables, т.е. заставить форвардить 80 порт во внешней сети на локальный IP, буду рад
    Ответ написан
    Комментировать
  • Как сделать авторизацию клиента "как у Habrahabr"?

    HoHsi
    @HoHsi Автор вопроса
    Под личные поиски:
    =======================
    *Данный метод называется SSO
    Ответ написан
    Комментировать
  • Как отправить запрос на nodejs?

    HoHsi
    @HoHsi
    Мне кажется, что все отвечающие переусложняют. А автору просто хотелось зайти на свой сайт.

    Если приложение слушает отличный от 80 порт, то зайти на него можно просто прописав :5000 после домена или IP, примерно так:

    http://127.0.0.1:5000/

    Или можно использовать Nginx, что-бы проксировать запросы с 80 порта на Node.
    Ответ написан
    Комментировать
  • {}.toString.call(obj).slice(8, -1) Почему (8,-1)?

    HoHsi
    @HoHsi
    Слайс - метод массивов и строк, т.е. по сути этот метод вырезает часть из массива.

    В данном случае, мы посредствам, допустим ({}).toString.call([]) получим "[object Array]", т.е. строку, которая содержит имя конструктора.

    По спеку, JS выводит строку в следующем формате: "[object <NAME_OF_CONSTRUCTOR>]", и следовательно если вырезать все, кроме 8 до предпоследного символа, мы получим само имя
    Ответ написан
    Комментировать
  • Почему не работает php в сниппете?

    HoHsi
    @HoHsi
    <?
    $new_page_content = '<?php echo 'privet'?>';
    // Экранируйте символы
    $new_page_content = '<?php echo \'privet\'?>';
    Ответ написан
    1 комментарий
  • Плагин для удаления неиспользуемых комментариев?

    HoHsi
    @HoHsi
    html

    Я думаю, минификаторм можно настроить таким образом, что-бы он вырезал только комментарии
    gulp-htmlmin
    Ответ написан
  • На сколько хорошо использовать NodeBB?

    HoHsi
    @HoHsi
    NodeBB работает на Javascript, что соответственно не делает не какой нагрузки на сервер.

    Делает. Все что работает на сервере, даже grep, делает на него нагрузку. Тут вопрос в том какую нагрузку он делает. Та же нода будет независимо от кол-во пользователей есть 50mb RAM. Но в свою очередь за счет этого будет быстрее отвечать. Это позволит обслужить большее кол-во пользователей, но за счет постоянного проживания в RAM.

    Но я не совсем понимаю как это работает, прогуглил и понял что оно работает на MongoDB и не совсем понял, получается данные с сайта который мы сделаем на NodeBB, такие как имена и пароли пользователей, вопросы, ответы и т.д. хранятся полностью на серверах MongoDB ? И

    Аммм, ну да. Так работают все Web приложения. Они хранят почти все динамические данные в базах. И не важно, SQL это, или NoSQL.

    Если вы подразумеваете, что есть какие-то MongoDB сервера, как сервисы, то нет. Это просто база данных, как Postresql или MySQL. Вам прийдется ее так же поднимать на одной из своих машин, что автоматически значит, что вы храните все "у себя".

    Если же вы подразумеваете, что данные хранятся непосредственно в процессе NodeJS, это от части правильно, но все равно 90% данных будут лежать в базе, те же пользователи, вопросы и т.д.

    И по этому может хоть до миллионов запросов быть? Или как это работает?

    Нет. Вы все так же ограничены RAM, CPU, пропускной способностью, лимитом трафика. Все тоже самое, что и в других Web приложениях, на любых языках и платформах. Никакой магии.
    Ответ написан
    4 комментария
  • Что делает [2], в данном .match?

    HoHsi
    @HoHsi
    [2] вообще не относится к регулярке. Это выбор элемента массива. Так как match в JS (да и во всех реализациях) возвращает массив, то вы просто выбираете 3-ий элемент. Т.е:
    /^\/([a-z]*\/[a-z].*?\/[a-z].*?)-(.*).*/

    Что у вас там лежит известно только вам.
    Но сейчас вы пытаетесь взять второй 3-ий элемент от Null
    Ответ написан
    Комментировать
  • Какой фреймверк выбрать? Кто что юзает и почему?

    HoHsi
    @HoHsi
    В последнее время активно использую связку Express + exa.

    По сути дела первый - стандарт в Nodejs разработки (так или иначе ноги у многих фреймворков растут из него. Да и на текущий момент он самый популярный);

    А Exa избавляет Express от callback hell за счет ES7 async/await или ES6 генераторов. При этом как я понял он не лезет в сам Express и не меняет его, а просто примешивает асинхронные методы для роутеров.

    И получается что-то типо того:
    'use strict';
    const exa      = require('exa');
    const express  = require('express');
    
    const mongoose = require('mongoose');
    
    const app = exa(express()); // Примешивание методов
    
    const User = mongoose.model('User');
     
    app.$get("/", function * (req, res) {
      const users = yield User.find({}).exec();
     
      res.send(users);
    });
     
    app.use(function (err, req, res, next) {
      // Все ошибки свалятся сюда
     
      res.statusStatus(500);
    });
    Ответ написан
    Комментировать
  • Как подружить 1С Битрикс и Node JS?

    HoHsi
    @HoHsi
    Как уже предложил Алексей Уколов , можно использовать общую BD. Вполне рабочий, но небезопасный вариант.
    Я бы поискал какую-то прослойку, вроде самописного REST API до базы 1C (да, по сути она так же будет лезть руками в их базу, но все же, меньше вероятность что-то сломать, да и API уже обкатан).
    Ответ написан
    1 комментарий
  • Источники для изучения Node.js?

    HoHsi
    @HoHsi
    и скринкастов записано на версии 0.10 и ниже

    В Node со времен этой версии ничего критического не поменялось (я про API). Так, что смело смотрите этот скринкаст.

    А после уже можете подучить ES6-ES7, если хотите быть на острее.
    Ответ написан
    Комментировать
  • Как подменить результат вызова стандартного node.js модуля в тестах?

    HoHsi
    @HoHsi
    const child_process = {};
    child_process.exec = function () {
      // Все что угодно
    }


    Если CP используется не в тесте, а в самой либе, тогда можно как-нибудь извратиться с передачей child_process как параметра, тогда можно будет подсовывать любые функции вместо нее.
    Ответ написан
  • Как откатить sublime text 3 до предыдущей версии?

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

    HoHsi
    @HoHsi
    Если хотите использовать асинхронные операции в синхронном стиле, придется прикрутить промисы

    /** Переписываем с промисами */
    function getLoc(options) {
      if (navigator.geolocation ){
        // Запускаем новый промис
        return new Promise((resolve, reject) => {  
          navigator.geolocation.getCurrentPosition((pos) => {
            resolve(pos);
          }, (err) => {
            reject(err);
          }, options);
        });
      } else {
        // Если нет, возвращаем заглушку, или можете сделать "reject"
        return Promise.resolve({
          pos: {
            coords: {
              latitude: 0,
              longitude: 0
            }
          }
        });
      }
    }
    
    getLoc()
    .then((pos) => {
      const {
        latitude: lat,
        longitude: lon
      } = pos.coords;
    
      console.log("Wow");
      console.log("So promissed");
      console.log(lat, lon);
    })
    .catch((err) => {
      // Пользователь отказался давать координаты
      console.log(":(");
      console.error(err);
    });
    Ответ написан
    2 комментария
  • Как вернуть из асинхронных функции результат?

    HoHsi
    @HoHsi
    Во первых вы вызываете асинхронную версию exec, есть ее синхронный собрат: execsync

    Во вторых, тут не обойдется без промисов / коллеков / Async/Await.
    В текущей сборке, я бы рекомендовал использовать промисы, но сам я уже перешел на Async/Await c бабелем.
    function enabledApi(conf) {
      const config = {
        host:     conf.host,
        username: conf.us,
        password: conf.pa
      };
    
      return new Promise((resolve, reject) => {
        exec(config, '/ip service set api disabled=no', (error, response) => {
          const res = error ? 'error' : 'ok';
          console.log(`res is ${res}`);
    
          if (error) {
            reject(error);
          } else {
            resolve(response);
          }
        });
      });
    }
    
    const config = {
      host:'1.1.1.1',
      us:'user',
      pa:'123'
    };
    
    enabledApi(config)
    .then((res) => {
      console.log(`ress again is ${res}`);
    })
    .catch((err) => {
      console.error(`OMG! ${err.toString()}`);
    });


    Или все же с Async, но вам понадобится babel
    function enabledApi(conf) {
      const config = {
        host:     conf.host,
        username: conf.us,
        password: conf.pa
      };
    
      return new Promise((resolve, reject) => {
        exec(config, '/ip service set api disabled=no', (error, response) => {
          const res = error ? 'error' : 'ok';
          console.log(`res is ${res}`);
    
          if (error) {
            reject(error);
          } else {
            resolve(response);
          }
        });
      });
    }
    
    (async () => {
      const config = {
        host:'1.1.1.1',
        us:'user',
        pa:'123'
      };
    
      const res = await enabledApi(config);
    
      console.log(res);
    })()
    .catch((err) => {
      console.error(`OMG! ${err.toString()}`);
    });
    Ответ написан
    Комментировать
  • Сложно ли сделать конструктор сайтов?

    HoHsi
    @HoHsi
    Путь Web-падавана. Если у вас нет еще навыков в Web программировании, не стоит начинать с объемных проектов.
    Ответ написан
    Комментировать