Как стать автором
Обновить
12
0
Николай Ольшанский @Eternalko

Пользователь

Отправить сообщение

Вчера кстати запустил docker-Compose на пяток сервисов. Отлично заработал. Ожидал что буду до до марта ждать или неделю с бубном плясать

В статье написано. Не знаю можно ли точней выразиться :)
И самое главное — НЕ ВРИ
Да вы практически переделали Redux на Mobx (:
> RabbiyMQ + Go

Вместо кролика на рассмотрение: nats
Не совсем напрямую, несколько иначе обходим эту проблему.
Стараемся сделать так, чтобы reducer's можно было экспортировать / импортировать
как обычную «библиотеку».

coffeescript
    ### ------------------------------------------------ actions.coffee ###

    { createAction } = require 'redux-actions'
    ###
    DATA API
    ###
    module.exports =
      # PUBLIC
      create: createAction 'CREATE_MESSAGE', (body, header) ->
        action =
          body: body
          header: header
        action
      remove: createAction 'REMOVED_MESSAGE', (id) ->
        id: id


      # Private
      $:
        creating: createAction 'CREATING_MESSAGE', (message) ->
          _.assign {}, message,
            id: _.uniqueId('message-')
            synced: false
        created: createAction 'CREATED_MESSAGE'

    ### ------------------------------------------------ reducer.coffee ###


    _ = require 'lodash'
    { handleActions } = require 'redux-actions'


    ###
    STATE CHANGES
    ###
    actions = require './actions'

    actionsMap = [
        action: actions.$.creating
        handle: (state, action) ->
          _.concat state, _.assign {}, action.payload
      ,
        action: actions.$.created
        handle: (state, action) ->
          _.map _.cloneDeep(state), (item) ->
            if item.id is action.payload
              item.synced = true
            item
      ,
        action: actions.remove
        handle: (state, action) ->
          _.reject _.cloneDeep(state), action.payload
    ]
    module.exports =
      messages: handleActions _.mapValues(_.keyBy(actionsMap, 'action'), 'handle'), []

  


JS
    /* ------------------------------------------------ actions.coffee */
    var _, actions, actionsMap, createAction, handleActions;

    createAction = require('redux-actions').createAction;


    /*
        DATA API
    */

    module.exports = {
      create: createAction('CREATE_MESSAGE', function(body, header) {
        var action;
        action = {
          body: body,
          header: header
        };
        return action;
      }),
      remove: createAction('REMOVED_MESSAGE', function(id) {
        return {
          id: id
        };
      }),
      $: {
        creating: createAction('CREATING_MESSAGE', function(message) {
          return _.assign({}, message, {
            id: _.uniqueId('message-'),
            synced: false
          });
        }),
        created: createAction('CREATED_MESSAGE')
      }
    };


    /* ------------------------------------------------ reducer.coffee */

    _ = require('lodash');

    handleActions = require('redux-actions').handleActions;


    /*
        STATE CHANGES
     */

    actions = require('./actions');

    actionsMap = [
      {
        action: actions.$.creating,
        handle: function(state, action) {
          return _.concat(state, _.assign({}, action.payload));
        }
      }, {
        action: actions.$.created,
        handle: function(state, action) {
          return _.map(_.cloneDeep(state), function(item) {
            if (item.id === action.payload) {
              item.synced = true;
            }
            return item;
          });
        }
      }, {
        action: actions.remove,
        handle: function(state, action) {
          return _.reject(_.cloneDeep(state), action.payload);
        }
      }
    ];

    module.exports = {
      messages: handleActions(_.mapValues(_.keyBy(actionsMap, 'action'), 'handle'), [])
    };

  

FYI Если у вас 2 датацентра, то нет возможности решить split-brain problem.
Мнение основанное на личном опыте?

1) Да

2) Нет надобности и это антипаттерн. Данные надо проверять самостоятельно с помощью JSON Schema.
Это добавляет гибкости при работе. К примеру, данные можно отбросить на входе, а не перед самой записью в базу данных.
Таким образом, весь код которые работал до этого не подвергается риску работы с invalid objects.

3) Нету как и в самой базе данных :) Data Models > Data Model Reference > Database References
За пару лет работы с нодой и монгой понадобилось сделать ссылку ровно 2 раза.

4) Не знаю что это.

В целом, работа с нативным драйвером после Mongoose это танец на радуге удобства и изобилия.
От себя добавлю, остальным на заметку: Не нужно использовать Mongoose.
Последние версии официального драйвера во всем превосходят довольно отсталый Mongoose.

MongoDBLite done right :)

Более года пользую. Хорошая, mongo-compatible база данных. Умеет работать в режиме in-memory так и на файлах.
Удобно использовать как подручный кэш.
Еще больше люблю LokiJs. Отличная, хорошо себя показывает на фронтенде. Все остальные слились.
Есть forerunnerdb, но я ее не трогал еще.

Если у вас хороший devops, то можно безопасно ставить mongo в режиме in-memory на каждой ноде приложения :)

Место на диске можно решить так же как и решают это остальные «фреймворки». И это относительно просто.

А вот с памятью это сложней решить.
Если это единственная проблема, то это и не проблема вовсе. Во первых это не много, а во вторых, она очень легко решаемая. Не полностью, но существенно. Этим никто не занимается из мысли о стабильности.
100 мб «хлама» на приложение это такая проблема?
Есть чуть чуть больше. NaCl функции
Все просто.

Пиксели

  • Field of view на YT примерно 65° по "горизонтали" и примерно 60° по вертикали
  • Возьмем видео из варкрафта которые автор дал выше.
  • Самое большое разрешение это 2560 х 1440
  • Следовательно реальная картинка которую "видно за раз" 2560 / 360 65 x 1440 / 180 60 ~~~> 460 x 480
  • 80% скачанного и декодированного (попробуйте открыть видео 8k, процессор умрет) видео идет в мусорку
  • 240p! Here we meet again!!!

Энкодинг

  • Писал выше
  • Профили на YT делают энкодинг под конкретное значение битрейта. Это условие стандарта MPEG-DASH
  • Большинство байт в видео "уходит" на идиотский "верх" и "низ".
  • В связи с этим на середину, гда обычно все самое интересное и происходит остается и того меньше.
  • Результат мыло

Картинко для куба

Тогда стоит вопрос: к чему эти извращения?)
Фейсбук куб. Не сфера.

Кто-то начал делать по тупому и yt пришлось это г. поддерживать.
Относительно задачи. Попробуйте перевести проекцию в куб и повторить задачу :)
Коммент про 360, не совсем относительно статьи.

Сферическая проекция это ужасное решение.
Выглядит плохо, много весит и еще куча мелких, но важных минусов.

Вид

Сферические видео имеют ужасные искажение на "полюсах". И даже качество картинки на "экваторе" тоже оставляет желать лучшего.
Мир с перспективы мухи смотрящей через замочную скважину это сомнительное удовольствие.

Энкодинг

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

Если кто-то занимается 360 видео, бегите от сферической проекции как можно быстрее.
1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Warszawa, Польша
Зарегистрирован
Активность