• Как маршрутизировать траффик через промежуточный локальный интерфейс?

    @res2001
    Developer, ex-admin
    Вам нужно на роутере добавить маршрут до сети 192.168.5.0/24 через IP eth0.
    На самом компе добавлять маршрут не нужно, т.к. он имеет IP адреса во всех задействованных сетях, то маршруты уже есть.
    Пингами с роутера проверяете доступность IP eth1.
    Т.к. eth2 работает мимо ОС, то схема должна работать.
    Естественно на компе надо включить маршрутизацию пакетов и настроить/выключить фаервол.
    Сниффером слушаете eth1.

    Более "чистая" и точно рабочая схема была бы, если использовать второй ПК: eth2<=>второй ПК<=>router
    На втором ПК можно настраивать сниффер и видеть весь трафик.
    Ответ написан
    1 комментарий
  • Как в WebStorm отлаживать связку Node.js бэкенд и React фроненд как единое целое?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Фронт отлаживаете в девтулзах в браузере, бек запускаете напрямую из вебшторма через дебаг скрипта nodejs, и отлаживайте в IDE.

    Если хочется и то и то в вебшторме, то фронт тоже можно запустить вместе с беком и отлаживать в IDE а не в браузере (запускаете два процесса для дебага в вебшторме кроме одного) но это на любителя, мне не нравится и поэтому конкретный конфиг не подскажу. Можно нагуглить.
    Ответ написан
    Комментировать
  • Как реализовать авторизацию пользователя на стеке React Redux Node?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Пригодится jwt. (гугл)

    В общих словах: вам нужно выдать юзеру токен. С этим токеном юзер будет выполнять запросы к вашим защищенным методам api (вы можете оставить какие-то методы "без токена").

    Node.js часть
    Пример роута на логин (сделано не лучшим образом, в плане коллбэков, но что нашлось под рукой...):

    auth.js
    ...
    const v4 = require('node-uuid').v4
    const jwt = require('jsonwebtoken')
    ...
    router.post('/signin', (req, res, next) => {
    
      // валидация, например... 
    
      if (errors) {
        return res.status(400).json({ errors })
      } else {
        // поиск юзера в базе, сравнение хэша и прочие необходимые операции
        ...
       // допустим все ок, нужно ответить токеном
      // генерируем необходимые опции и сам токен
    
            const payload = {
              _id: user._id,
              iss: 'http://localhost:3000',
              permissions: 'poll',
            }
            const options = {
              expiresIn: '7d',
              jwtid: v4(),
            }
            const secret = new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64')
            jwt.sign(payload, secret, options, (err, token) => {
              // отвечаем токеном, для будущих запросов с клиента
              return res.json({ data: token })
            })
         ...
    })
    
    module.exports = router;


    Пример защищенного роута (метода, который требует токен):
    ...
    const jwt = require('jsonwebtoken')
    const Poll = require('../models/poll')
    ...
    
    const requireToken = (req,res,next) => {
      const token = req.headers['x-api-key']
      const secret = new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64')
    
      jwt.verify(token, secret, (err, decoded) => {
        if (err) {
          return res.status(401).json({ error: err.message })
        }
        req.params.userId = decoded._id
        next()
      })
    }
    ...
    
    // обратите внимание на requireToken - функция вызывается при каждом обращении к роуту
    // то есть при каждом PUT запросе по адресу (например: PUT api/v1/products/1238914)
    // будет вызываться requireToken
    
    router.put('/:id', requireToken, (req, res, next) => {
      const { productId } = req.body
      const userId = req.params.userId
    
      Poll.findById(req.params.id)
        .populate({ path: 'products' })
        .exec((err, poll) => {
            // ... необходимые действия в базе, в процессе успешного зачтения голоса...
        }
    })


    Клиентское приложение:

    Типичный ActionCreator (в качестве библиотеки для запросов можно взять bluebird, isomorphic-fetch, да хоть нативный xhr)
    actions/LoginActions.js

    export function login(data) {
      return dispatch => {
        dispatch({ type: LOGIN_REQUEST })
    
        // request в данном случае - https://github.com/KyleAMathews/superagent-bluebird-promise
        return request.post(`${API_ROOT_V1}/auth/signin`)
          .send(data)
          .then(res => {
            if (!res.ok) {
              dispatch({ type: LOGIN_FAILURE })
            } else {
              dispatch({
                type: LOGIN_SUCCESS,
                data: res.body.data,
              })
              //сохранение токена в localStorage
              localStorage.setItem('cks_token', res.body.data)
            }
          }, err => {
            dispatch({ type: LOGIN_FAILURE })
          })
      }
    }


    Пример голосования с токеном (выше, в node.js части был метод апи, а это PUT запрос с клиента)

    export function vote(productId, voteId) {
      return dispatch => {
        dispatch({ type: POLL_VOTE_REQUEST })
    
        return request.put(`${API_ROOT_V1}/api/v1/vote/${voteId}`)
          .set('X-API-Key', localStorage.getItem('cks_token')) // установка ТОКЕНА в заголовок 'X-API-Key'
          .send({ productId })
          .then(res => {
            if (!res.ok) {
              dispatch({ type: POLL_VOTE_FAILURE })
            } else {
              dispatch({
                type: POLL_VOTE_SUCCESS,
                data: normalize(res.body.data, schema.poll),
              })
            }
          }, err => {
            dispatch({ type: POLL_VOTE_FAILURE })
          })
      }
    }


    Надеюсь код формы с кнопкой "голосовать" не трубется.
    ====

    Все это можно организовать удобнее, например, выставлять токен всем запросам автоматически (речь про клиентскую часть):
    import fetch from 'isomorphic-fetch'
    ...
    const defaultHeaders = {
      Accept: 'application/json',
      'Content-Type': 'application/json',
    }
    
    function buildHeaders() {
      const authToken = localStorage.getItem('TOKEN')
      return { ...defaultHeaders, Authorization: authToken }
    }
    ...
    export function httpPost(url, data) {
      const body = JSON.stringify(data)
    
      return fetch(url, {
        method: 'post',
        headers: buildHeaders(),
        body: body,
      })
      .then(... код оработки запроса ...)
    }


    ===

    Проверить наличие токена, можно с в роутере, с помощью хука на onEnter.

    root.js
    ...
    <Provider store={store}>
          <Router history={routerHistory}>
            {configRoutes(store)} // Роуты создаются функцией, чтобы можно было использовать внутри нее store.getState()
          </Router>
        </Provider>
    ...


    routes.js
    export default function configRoutes(store) {
      function _ensureAuthenticated(nextState, replace, callback) {
        const { dispatch } = store
        const { session } = store.getState()
        const { currentUser } = session
        let nextUrl
    
        if (!currentUser && localStorage.getItem('cks.token')) {
          dispatch(getCurrentAccount())
        } else if (!localStorage.getItem('cks.token')) {
          replace('/signin')
        }
        callback()
      }
    
      return (
        <Route path='/' component={App}>
          <Route path='/signin' component={SigninContainer} />
          <Route path='/signup' component={SignupContainer} />
    
          <Route path='/locked' component={AuthenticatedContainer} onEnter={_ensureAuthenticated}>
            <Route component={LockedArea}>
              <Route path='/locked/a' component={A} />
              <Route path='/locked/b/:id' component={B} />
              <Route path='/locked/c' component={C} />
            </Route>
          </Route>
        </Route>
      )


    Остается только создать AuthenticatedContainer в котором проверять: есть ли currentUser (в рамках этого примера) и если нет - возвращать false. А если есть - this.props.children (в которых будут дальнейшие роуты..)
    ===

    Итого:
    1) у вас есть API написанное на node.js.
    2) У этого API есть защищенные методы, которые проверяют наличия токена в http-запросе. Токен выдается при запросе на логин. Само собой, операция логина (то есть POST запрос на your-api/login) не требует токена.
    3) После удачного логина, вы получаете в ответе на свой запрос токен (это уже внутри клиентского кода, и если мы говорим о redux - то внутри асинхронного вызова в actions)
    4) Сохраняете токен (например, в localStorage)
    5) Во все необходимые http-запросы устанавливаете заголовок с токеном
    Ответ написан
    15 комментариев
  • Как оценить потери воздушного потока в воздуховоде?

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

    p.s.
    либо можно собрать схему из MPXV7002DP(или аналогичного, главное чтобы по разнице давлений подошел) + arduino
    Ответ написан
    4 комментария
  • Как проверить, поддерживает ли материнка сменнные БП (redundant PSU)?

    @Wexter
    Материнка и не должна поддерживать, блок питания должен иметь резервируемые вводы с горячей заменой модулей
    Ответ написан
    3 комментария
  • Как лечить спину айтишникам?

    latteo
    @latteo
    Врач, который помогает с позвоночником - это вертебролог.

    Со спортом надо быть аккуратнее, почти всё, что мне показали несколько разных тренеров в разных качалках для укрепления спины - оказалось крайне вредно с точки зрения вертебролога.
    Разминки и зарядки, в том числе "йога для спины", также могут нанести вред.

    Полезный спорт - плаванье и ходьба. При незначительной патологии - бег.
    Уже после лечения (МРТ в норме) врач показал, какую стоит делать зарядку.
    Ответ написан
    Комментировать
  • Как слушать Яндекс Радио с помощью nodejs или python?

    zolt85
    @zolt85
    Программист
    Вообще-то открытого API нету. Как вариант можно "распотрошить" код расширения для Chrome и все узнать.
    Ответ написан
    Комментировать
  • Как слушать Яндекс Радио с помощью nodejs или python?

    @Batlab
    PHP Senior | Python Middle | JS Junior
    Я думаю нужно отписать в тп Яндекса и спросить это прямо у них, возможно поменялись методы или требования к запросу
    Ответ написан
    Комментировать
  • Как изменить имя файла в loader-е wabpack-а и передать новое имя в другой loader (или как на уровне сборки менять стили)?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Первое, что приходит в голову, это как-то так:
    import(`__${theme}__`.css)
    А из вебпака в код передавать переменную theme через DefinePlugin.

    Второй вариант — динамически генерить resolve.alias, а в коде писать import '__current-theme.css'. Как-то так:
    alias: {
      '__current-theme.css': path.resolve(__dirname, process.env.STYLE_REF)
    }

    Лучше второй вариант, пожалуй, в первом получится ненужный code splitting.
    Ответ написан
    6 комментариев
  • Как эффективно оценить медиану экспоненциально распределенной величины?

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

    @amiksam
    https://developers.google.com/web/fundamentals/per...

    Т.е. для index.html вообще запрещаем кеширование, а js файлы кешируем (можно навсегда).
    При сборке к js/css файлу добавляем hash, который будет меняться при изменении файла. Таким образом index.html будет всегда забираться. Если там будет ссылка на новую сборку, то новые скрипты/стили скачаются, иначе возьмутся из кэша браузера.
    Ответ написан
    Комментировать
  • Как сказать браузеру, что сайт изменился, и надо обновить кеш?

    @xutesayor
    Там где подключается ваш js-файл добавьте в параметрах номер версии. Например так:
    <script src="/my/script.js?v=1"></script>
    При желании можете это дело автоматизировать
    Ответ написан
    5 комментариев
  • Какую мониторную акустику 2.0 выбрать для прослушивания музыки?

    DevMan
    @DevMan
    имхо, все фуфло. да и мониторная акустика за $100 звучит как шутка.

    если есть деньги и усилитель (или возможность/желание его приобрести), то намного лучше взять j.mp/2gjCY6C (еще несколько лет назад они продавались от $500 и выше).
    Ответ написан
    6 комментариев