• Как правильно организовать структуру постоянно изменяющегося проекта?

    @xfg
    Для энтерпрайза с обширной бизнес-логикой подойдет DDD. Перевести за раз уже существующий проект с огромным функционалом и костылями будет нереально. Можно попробовать небольшими итерациями. Уровень команды тоже должен соответствовать, поскольку при строительстве такой архитектуры точно будет использоваться добрая половина паттернов описанная в книге PoEAA.
    Ответ написан
    Комментировать
  • Что читать после PHP.net?

    @xfg
    SOLID, GRASP, PoEAA и DDD если вы серьезно настроены, а если нет, то прочитайте документацию к laravel или yii2 и отгружайте rapidly code в промышленных масштабах.
    Ответ написан
    Комментировать
  • Не убьёт ли WebAssembly node.js?

    @xfg
    WebAssembly это низкоуровневый язык программирования. Никто на нем в здравом уме не будет писать. Это почти тоже самое, как пытаться писать веб с помощью ассемблера. В него просто будут компилировать код с других языков, сейчас пока только C и C++, позже будут и другие. Он нужен, чтобы ускорить клиент-сайд, поскольку javascript медленный для всяких там 3D игр и всего такого. В общем походу скоро php захватит и клиент :)

    Кроме того, эта идея уже была ранее реализована в asm.js от компании Mozilla. Разработчики сделали на C++ демку 3d игры скомилировали её в asm.js, общественность немного поигралась и всё заглохло. Революции не произошло.
    Ответ написан
    5 комментариев
  • Как присоединиться к стартапу за долю?

    @xfg
    Как офомрить долю в стартапе?

    Оформление вас, как одного из учредителей юридического лица. Если организация только создается, то вносите деньгами/имуществом долю в уставный капитал огранизации. Минимально разрешенный законом уставный капитал ООО должен быть не менее 10 тыс. руб., т.е. вы вполне можете самостоятельно внести свою долю. Нет смысла раздувать уставный капитал, если организация не планирует привлекать кредиторов. Если же организация уже зарегистирована, тогда нужно нотариально оформить продажу доли и уведомить регистрирующий орган о изменении состава учредителей.

    Договоренности на словах тоже могут иметь место быть, если вы будете иметь доступ к вашему будущему инструменту извлечения прибыли. Поскольку вы в равной степени, сможете сделать попытку самостоятельно воспользоваться этим инструментом. Для юр. лица это тоже в полной мере актуально. Но в этом случае, вы сможете оценить серьезность намерений ваших будущих коллег. Иметь чуть больше уверенности в том, что весь этот энтузиазм и порыв не погаснет спустя непродолжительный промежуток времени.
    Ответ написан
    Комментировать
  • Простой проект Symfony плюс DDD?

    @xfg
    Простого не видел, ddd все таки для энтерпрайз решений, которые едвали могут быть простыми. Из всего что видел этот пример на Java самый адекватный https://github.com/citerus/dddsample-core

    Вроде как этот пример проверял сам Эрик Эванс, автор ddd. Я сам не знаком с Java, но из примера покрайней мере можно понять, что примерно должно лежать в application, domain и infrastructure слоях https://github.com/citerus/dddsample-core/tree/mas...

    Может также будет полезно www.yiiframework.ru/forum/viewtopic.php?f=34&t=38264 там я сам спрашиваю у более опытных разработчиков про ddd. У самого куча вопросов. Проблема еще осложняется тем, что когда читаешь SO, то взгляд на одни и те же вещи зачастую расходится или идея остается ясна не до конца и это еще больше запутывает.
    Ответ написан
    Комментировать
  • Модульность на фронтенде?

    @xfg
    Посмотрите yeoman.io у него огромное количество генераторов это заготовки для старта проекта, можно найти заготовку под что угодно. Структура проекта, препроцессоры, сжатия, оптимизации, юнит-тесты, всё уже настроено. Нужно взять и использовать. Делать всё с нуля, особенно первые разы не стоит. Стоит сначала посмотреть, как это принято правильно делать.
    Ответ написан
    4 комментария
  • Какую выбрать архитектуру взаимодействия мобильных приложений и веб-версии с API?

    @xfg

    Текущий вариант: в БД присуствует приложение с токеном, от которого работает angular.js приложение. Является ли такой подход нормальным или взаимодействие собственных frontend с backend должно быть организовано как-то по иному ?

    Хранить токен в приложениях, выполняющихся на клиенте бессмысленно. Приложение разберут, достанут токен и кто угодно с этим токеном будет обращаться к api.

    Как правило, официальные приложения не ограничивают в правах. Ограничивают приложения от сторонних разработчиков и это делается через протокол OAuth 2.0. Какие права дать стороннему приложению, решает сам пользователь. Токен выдается на пользователя. На само приложение токен имеет смысл выдавать, только если приложение выполняется на стороне сервера, в противном случае, бессмысленно. Более подробно в rfc6749

    Я вообще не понимаю, зачем вам требуется выдавать токен на приложение. Ограничить endpoints set для каждого из приложений? Зачем? Что это дает? Опишите задачу.
    Ответ написан
  • Как реализовать сохранение соединения?

    @xfg
    Подобное вот тут реализовано - тык, как не совсем понятно.

    Очень просто. Сайт сделан на meteor. А вам нужно просто делать SPA. Для этого вам нужен любой javascript фреймворк Angular, Backbone, Ember, React, Polymer, Knockout или Blaze, который запилили разработчики метеор фреймворка. Тысячи их! Но основное, что их все объединяет, это активное использование ajax для загрузки html страниц.
    Ответ написан
    Комментировать
  • Стоит ли выносить иноязычную версию блога на поддомен?

    @xfg
    Я считаю, что оба варианта равнозначны с точки зрения сео исходя из документации популярных поисковиков. Соответственно на вкус разработчика.

    Но можно сделать отдачу с site.com/blog на том языке, на котором хочет браузер с помощью content negotiation. Для этого сервер должен мониторить заголовок запроса Accept-Language и отдавать контент на этом языке, если языки из заголовка не поддерживаются сервером или заголовок отсутствует, отдавать на языке по умолчанию. Сайт станет умнее и если мой браузер настроен на русский язык, то при входе на site.com/blog я получу контент на русском, мне не нужно будет специально идти на site.com/ru/blog за русским контентом. Пользователя это порадует.
    Ответ написан
    Комментировать
  • Что можно посмотреть, чтобы не говнокодить в MVC?

    @xfg
    Любой популярный фреймворк посмотрите и попробуйте сделать фреймворк без M и без V, оставьте только C и контейнер зависимостей. Такой фреймворк должен только парсить request и вызывать нужный метод контроллера и систему событий, чтобы можно было навешивать обработчики до вызова метода контроллера и после. Больше ничего не нужно, всё остальное можно будет внедрить через контейнер взяв компоненты из других фреймворков, а также написав свои. Получится слабосвязанный компонентный фреймворк. Назовете его loose или low framework, посвященный одному из важнейших принципов GRASP loose/low coupling :)
    Ответ написан
    Комментировать
  • В чем разница между многопоточностью, многозадачностью и многопроцессовостью?

    @xfg
    В одном процессе может быть много потоков, но всегда как минимум есть один. Потоки внутри одного процесса делят общую память, изменение данных в одном потоке будет видно во всех остальных.

    В тоже время одна программа может порождать много процессов, процессы в отличии от потоков не делят общую память.

    А многозадачность это свойство ОС вычислять одновременно (*условно говоря) много задач (процессов и потоков) или проще говоря программ. Это дает вам возможность одновременно играть в игру и слушать музыку на своем компьютере.

    * на самом деле процессор работает в последовательном режиме и соответственно на самом деле не может одномоментно вычислять более 1 процесса или потока, но так как он способен вычислять гигантское количество операций в единицу времени и быстро переключается с одного процесса/потока на другой и обратно, то часто говорят одновременно. Но и здесь стоит сделать оговорку, что многоядерные процессоры позволяют действительно вычислять несколько процессов/потоков параллельно, где каждое ядро процессора может взять на себя вычисление 1 потока или процесса в единицу времени.

    Вывод. Если у вас 4-ех ядерный процессор, а ваша программа работает в один процесс с одним потоком, то ваша программа будет вычисляться всего лишь на 1 ядре. Поэтому можно создать 4 потока в одном процессе или 4 процесса по 1 потоку в каждом и тогда ваша программа смэппится на все ядра процессора и займет все его возможные мощности. В тоже время создание более 4 потоков или 4 процессов не будет иметь особого смысла, поскольку всё равно вы сможете параллельно вычислять только максимум 4 из них.

    При создании любого процесса внутри него автоматически создается как минимум 1 поток. Но также вы можете самостоятельно создать и более 1 потока, если у вас появится такая необходимость.
    Ответ написан
    5 комментариев
  • PHP Websocket оповещение о новой записи в базе данных mysql, как реализовать?

    @xfg
    Хочу чистый PHP без всяких демонпхп и прочего.

    Без каких-то готовых библиотек нужно самому реализовать протокол websocket описанный в rfc6455.

    Это примерно тоже самое, как если бы прежде чем использовать протокол http вы бы самостоятельно написали свой веб сервер подобно nginx/apache и т.д. которые реализуют этот протокол.

    Если так, то читать rfc и делать. Если нет, то брать например ratchet или любую другую библиотеку в которой уже реализован websocket протокол.

    С mysql проблема в том, что она не умеет стримить данные в реалтайме и работает в режиме request-response, также как http протокол. Поэтому либо использовать старый-добрый поллинг базы раз в N время либо искать что-то похожее на mysql-live-select для php, но я не видел. Идея в том, что скрипт прикидывается как slave и слушает бинарный лог изменений.
    Ответ написан
    3 комментария
  • Как с помощью socket.io отправить сообщение конкретному клиенту если приложение использует cluster и работает в нескольких процессах на разных портах?

    @xfg
    Смотрим исходный код библиотеки socket.io-redis, находим там метод Redis#broadcast, внутри метода мы видим, что прежде чем сделать publish в редис канал, там вызывается метод Adapter#broadcast. Отлично, идем смотреть Adapter#broadcast и если отбросить всё лишнее мы увидим суть

    if (rooms.length) {
       /*...*/
    } else {
      for (var id in self.sids) {
        /*...*/
      }
    }


    Как видно, socket.io может отправить данные либо в какую-то комнату/комнаты, либо всем клиентам, которые к нему подключены. Увы, но отправить данные конкретному пользователю как видно из кода нельзя.

    Но вы можете при подключении для каждого пользователя создавать свою собственную комнату именем которой может быть id пользователя и уже в эту комнату отправлять данные.
    Ответ написан
    Комментировать
  • Создание больших проектов на Node или PHP?

    @xfg
    Для больших фулл реалтаймовых сайтов с базами данных пока беда, они почти все работают по принципу request response, как и веб до появления вебсокетов. Приходится хаки писать или делать дикий polling базы. Из нового поколения баз данных сейчас есть только rethinkdb, крутой проект, но еще довольно сырой. Как только пробуешь делать что-то посерьезнее, чем примеры из документации, выясняется что этого он еще не умеет, разработчики конечно обещают это всё добавить, так что ждем.

    Есть еще такой фреймворк Meteor, но он мне вообще не нравится, раньше просто доставал обновления из mongo через обычный polling базы и называл это всё крутым фреймворком для реалтайм сайтов. Потом они переделали и стали слушать обновления через oplog, который нужен для репликаций в mongo, но не для всех запросов это работает, для некоторых все равно выходом является только polling и в этот oplog сыпятся апдейты со всех баз данных и всё такое. Ну а хули, костыль есть костыль. Ну и вообще штука дико монолитная, хуже чем sails.js.

    Кароче пока нет нормальной инфраструктуры, чтобы писать большие фулл реалтаймовые сайты. Ну а в PHP вообще ничего нет, даже уровня Meteor, PHP застрял в схеме request-response. Попробуй найди там что-то получше, чем мизерная Ratchet библиотека для работы с вебсокетами. На ней пока к сожалению весь реалтайм в PHP и заканчивается.
    Ответ написан
    1 комментарий
  • Как правильно клонировать объект на JS?

    @xfg
    Ну у вас просто не глубокое копирование. А реализация от ангуляра делает глубокое копирование (deep copy). Вот и всё. А вообще юзайте lodash там уже всё есть.
    Ответ написан
    Комментировать
  • GIT как правильно пользоваться?

    @xfg
    Github Flow за 5 минут.

    1. Создал ветку для фичи/фикса
    2. Сделал в ветку несколько коммитов
    3. Отправил пулл риквест
    4. Обсудил с коллегами пулл риквест и при необходимости внес правки
    5. Прогнал ветку через тесты.
    6. Влил в master
    7. Выкатил master на продакшн

    Если фича ветка долго не мержится и начинает расходиться с master веткой, то вливаем master в фичу ветку и продолжаем.

    Если кто-то из команды хочет руками потестить новую фичу, то может сделать
    git checkout -b new-feature origin/new-feature
    И потестить руками локально на своей дев машине.

    Update: Если sql база, то пишут миграции. Можно посмотреть в любом фреймворке что это и как использовать. После каждого git pull пробуем накатить миграции через консоль (можно хук для гита написать) и если есть новые миграции, то они применятся к локальной базе. Если nosql база типа mongo, то ничего не надо, они schemaless.

    На продакшине, вытягиваем код из гита в отдельную директорию. Применяем миграции к базе, затем симлинк переключаем с директории со старой версией проекта на директорию с новой версией проекта. Если миграции ломают старую версию проекта, то предварительно нужно выключить проект, чтобы у пользователей не сыпались всякие непойманные исключения. Это вкратце, для всего этого нужно подобрать себе уже готовый инструмент деплоя, который это все автоматически будет делать.
    Ответ написан
    5 комментариев
  • Как определить принцип расчёта системы уровней готовой системы?

    @xfg
    Очень часто количество опыта до следующего уровня высчитывают исходя из каких-то игровых данных. Очень мало входных, чтобы понять принцип, неизвестно за что начисляется опыт, сколько начисляется опыта за один выигрыш, сколько времени занимает один выигрыш, какой шанс выигрыша и так далее.
    Ответ написан
    2 комментария
  • Как правильно масштабировать nodejs-приложение с помощью cluster?

    @xfg
    Здесь проблема в том, что для всех процессов свои глобальные переменные, а нужно их как-то обобщить, если один процесс что-то изменяет в глобальных переменных - то это изменение должно продублироваться для всех процессов.

    Горизонтальное масштабирование в первую очередь предполагает возможность развернуть приложение на N количестве физически удаленных компьютеров. Соответственно вы не можете изменить что-то локально таким образом чтобы при этом оно продублировалось для всех процессов на всех удаленных машинах. Увы, но магии не существует. Чтобы это было возможным, требуется реализовать какой-нибудь механизм межпроцессного взаимодействия. Один из них вы уже назвали - использовать для этих целей redis.

    Но ваша проблема в другом. В архитектуре. Её нет. Код выше - это спагетти-код. Поэтому вы думаете, что вам нужно это
    если один процесс что-то изменяет в глобальных переменных - то это изменение должно продублироваться
    В действительности если заняться рефакторингом кода, очень скоро может выясниться, что вам это было не так уж и нужно да и вроде как глобальные переменные были не особо нужны.

    Вообще наличие большого количества глобальных переменных - это один из показателей плохого кода.

    Вы можете продолжать городить костыли и накапливать технический долг сохраняя глобальное состояние в redis или прокидывать данные из дочерних процессов в мастер-процесс и наоборот (благо в node.js есть для этого инструменты), но все же лучше начать что-то изучать из области архитектурных решений в вебе (и в javascript в частности) и смотреть код других крупных проектов и желательно не только в javascript.

    Думайте над архитектурой. Начните с того, как сделать так, чтобы отпала нужда в этих диких манипуляциях с глобальными переменными.
    Ответ написан
  • Как правильно запустить nodejs-приложение в кластере на мультипроцессорной машине?

    @xfg
    Воспринимай каждый воркер как если бы он был запущен на удаленной машине, которая ничего не знает о другом воркере, который запущен на другой удаленной машине. Тогда станет ясно, что задачи следует складывать в сервер очередей, а тот уже раскидает задачи по воркерам так, чтобы они не пытались выполнять одновременно одну и ту же задачу.

    Для очередей можно использовать kue. Работает поверх redis, который многие итак используют для масштабирования приложения по нескольким физически удаленным серверам, кеширования и всего прочего.

    Конфиг можно подключать в индексном файле и отдавать каждой копии приложения.
    const Application = require('path/to/Application');
    const config = require('path/to/config');
    
    if (cluster.isMaster) {
      for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
      }
      cluster.on('exit', (worker, code, signal) => {
        console.log(`worker ${worker.process.pid} died`);
      });
    } else {
      new Application(config).run();
    }


    Про сокеты не совсем понял. Приложение пытается куда-то приконектиться и выступает в роли клиента или приложение пытается поднять свой сокет сервер ?
    Ответ написан
  • Как разделять логику приложения?

    @xfg
    Где грань?
    Просто вместо html отдавайте с сервера данные в json/xml и т.д.
    Ответ написан