Задать вопрос
  • MacBook Pro 13 2012 почему сами собой откручиваются болтики крышки?

    @Fixid
    1. Купите синий фиксатор резьбы в любом автомагазине
    2. https://geektimes.ru/post/157969/
    Ответ написан
    Комментировать
  • Почему "Не рекомендуется использовать почтовый сервер вашего провайдера для отправки почты от вашего имени на Яндексе"?

    @neol
    Потому что если речь идёт о ящике yandex.ru, то в таком случае ваши письма не пройдут проверку SPF/DKIM и с большой вероятностью отправятся в спам.
    Ответ написан
    1 комментарий
  • Игра "word of battles" возможно ее восстановить?

    В высшей степени странный вопрос. Найдите компанию-разработчика, обратитесь к ним и напишите следующее: "я очень хочу играть в вашу игру, поэтому пожалуйста запустите её снова в онлайн, платите за хостинг и за работу команды разработчиков, чтобы чинить баги и делать фичи, а я буду вам лайки вконтакте ставить". Когда они откажутся, напишите на Тостере новый вопрос о том, почему они такие бяки.
    Ответ написан
    Комментировать
  • Как реализовать авторизацию пользователя на стеке 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 комментариев
  • Как удалять файлы с рабочих столов пользователей?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    создаю в групповую политику
    В GPO уже есть целая ветка управления рабочим столом, в том числе и его блокировка.
    d1f9624da28c4a6b8eb45d71bdeba793.png
    Ответ написан
    Комментировать
  • Если сделаю свою сайт в JS фреймворке так как Angular React, в СЕО не будет проблема?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg
    а для сео это не помешает?

    помешает

    Я только начал научить React по этому пока не знаю много что....советуйте

    Посоветую использовать то или иное решение для тех или иных задач. SPA не годится для информационных сайтов, которые планируется продвигать в ПС. SPA отлично подходит для кабинета пользователя, админки и т.д. Есть проекты типа uber где ПС должен находить только главную страницу и тут тоже SPA удобно и оправдано. Но делать блог, как SPA - это идиотизм. Интернет магазин - тоже. Есть варианты гибридные, где url меняется, есть правильная перелинковка и тогда тоже все будет ок. Но это уже не совсем SPA.
    Ответ написан
    1 комментарий
  • Как заставить блочные элементы занимать свободное пространство?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Ответ написан
    Комментировать
  • Автономная wi-fi камера в помещении без электричества и датчик вскрытия и. Реально?

    Jump
    @Jump
    Системный администратор со стажем.
    Реализовать ждущий режим не проблема - проблема быстро активировать камеру.

    Обычно камера работает постоянно - смотрит, пишет в память, но не на диск.
    Если происходит внешнее событие, или резкое изменение кадра -она тут же сбрасывает весь кэш на диск и пишет дальше.
    В результате всегда получается что камера начинает записывать происходящее не после события, а перед началом события.
    В вашем случае велик шанс, что камера включится когда зломышленник уже уйдет, вместе с камерой кстати.
    А так - камера с минимальным потреблением, и Б/У аккумулятор от камаза не такая уж плохая идея.
    Или банально хороший замок.
    Ответ написан
    Комментировать
  • Много OR и AND в запросе ActiveRecord?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    В sum можно передать yii\db\Expression
    Не пробовал, но по идее можно так:
    $exp= new yii\db\Expression('SUM(score1) as score1, SUM(score2) as score2');
    $score1 = Matches::find()->sum($exp);
    Ответ написан
    Комментировать
  • Какие технологии/языки программирования использовались в таких легендарных игровых проектах как серия Demons/Dark souls?

    xez
    @xez
    TL Junior Roo
    1. https://ru.wikipedia.org/wiki/Dark_Soul
    https://ru.wikipedia.org/wiki/PhyreEngine
    2. Что за "то время" ? DS3 вышла год назад.
    3. Смотря что за игра. Никакой конкретики быть не может по такому неконкретному вопросу. "Игры" на андроид - это и казуалки с одним экраном, и мощные 3d проекты на движках Unreal, Unity и т.д.
    Ответ написан
    Комментировать
  • Как сохранять в бд список людей на которых подписан пользователь?

    Не проще ли завести отдельную таблицу где писать user_id, subscribe_user_id ну и дату подписки?
    Ответ написан
  • Какие преимущества использования связей mysql?

    @entermix
    Это предотвращает нарушение целостности, индексы ускоряют работу БД.

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

    $today = time();
    $moon = mktime(0, 0, 0, 7, 21, 1969);
    echo "Люди были на луне ".floor(($today - $moon) / 86400)." дней назад.";
    
    if (floor(($today - $moon) / 30 * 24 * 60 * 60) > 6) {
        echo 'больше 6 месяцев';
    }
    Ответ написан
    3 комментария
  • Как реализовать распределение фото по серверам?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Ответ написан
    Комментировать
  • Перенос установленных программ на другую windows?

    saboteur_kiev
    @saboteur_kiev Куратор тега Windows
    software engineer
    Все попытки перенести софт с настройками - это попытки на авось. Что-то перенесется, что-то нет.

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

    Надежного и гарантированного способа, который будет работать для всего софта - не существует.
    Ответ написан
    1 комментарий
  • Как поставить атрибут lang для мультиязычного сайта?

    pm_wanderer
    @pm_wanderer
    junior-HTML
    Для поисковиков надо использовать link-теги примерно с таким синтаксисом:
    <link rel="alternate" hreflang="es" href="http://www.example.com/" />
    <link rel="alternate" hreflang="en" href="http://en.example.com/" />

    Оба тега помещаются на каждую региональную страницу (в данном случае их две: испанская и английская). При большем количестве региональных страниц, соответственно увеличивается и количество тегов.
    Ответ написан
    Комментировать
  • 16 лет. Идти во фриланс или начинать junior'ом в конторе?

    DevMan
    @DevMan
    на галеры. в смысле в контору.
    если контора нормальная:
    1. быстрее подростешь в проф.плане
    2. увидишь/поймешь как устроена разработка ПО
    3. прокачаешь коммуникационный скил

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