• Что умеет такого Node.js что не умеет ASP.NET Core?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Node.js - кросплатформенный. .NET - нет (пока во всяком случае).

    Mono для серьезных проектов не особо прикольно использовать.

    Что более перспективно в принципе?

    Если не можете определиться - выучите и то и то. Будет пользы больше чем эти метания.
    Ответ написан
  • Как сделать отказоустойчивый LAMP кластер для высоконагруженных WEB-приложений?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    как бы ты сделал отказоустойчивый LAMP кластер для высоконагруженных WEB-приложений?


    по поводу производительности

    1) пишем нагрузочные тесты
    2) прогоняем их и ищим узкие места и думаем что нам с этим делать
    3) устраняем узкое место
    4) повторяем пункты 2 и 3 до тех пор, пока не получаем приемлимые для нашего приложения цифры (ну то есть что бы удовлетворяло нашим ожиданиям по нагрузкам, это к слову тоже стоит заранее прикинуть с учетом неравномерности распределения пользователей и т.д.).

    ПО поводу надежности:

    ищим single point of failure. ну то есть если у нас есть база данных - то ее должно быть две на случай если один сервак выйдет из строя. А еще должен быть сверху балансировщик который раскидывает запросы. А что бы невилировать вероятность того, что и балансировщик выйдет из строя - балансировщик на уровне DNS.

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    нет, вы не правильно поняли MVC.

    Попробуйте подойти к проблеме чуть с другой стороны. Реализуйте ваше приложение так, что бы оно ничегошеньки не знало о HTTP, внутри него небыло ни единого echo, оно ничего не знало о сессиях и вообще ничего не знал о таких вещах. Проще всего этого добиться - ваше приложение можно запускать через CLI. Грубо говоря как-то так:

    <?php
    // run.php - просто скрипт для разового теста
    
    require __DIR__ . '/vendor/autoload.php'; // вы же уже используете composer?
    
    $app = new App();
    $app->getService('login_handler')->login('user@example.com', 'password');


    Что-то типа такого. То есть на каждый "юз кейс", то есть то что приложение должно делать, у вас должен быть метод. Типа "сделай то-то" и "сделай еще что-то".

    Вот это - наше приложение, наша "модель". Не один какой-то класс... это все приложение. MVC же ставит перед собой задачу снижения связанности между UI и приложением. Цель при этом приследуется простая - UI обычно меняется намного чаще чем логика приложения, а стало быть лучше их друг от дружки отделить целиком и полностью.

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

    То есть что бы сказать "я сделал MVC" у вас приложение не должно зависить от UI. Если вы хоть где-то в приложении используете суперглобальные массивы, и т.д. вы проиграли. Ну либо просто не называйте это MVC, скажите что вы просто шаблоны отдельно ложите ну и роутер еще есть. Но это не MVC, это smartui, то есть наше приложение вкурсе что у него есть UI и они сильно связаны.

    MVC нужно далеко не всем, и smartui сойдет для простых проектов. Но вы должны понимать разницу, и знать когда стоит загоняться а когда можно логику в контроллеры выносить.

    Надо ли было создавать глобальные переменные в модели

    Это вы еще не уяснили значит что такое ООП, почему глобальное состояние плохо и что такое побочные эффекты (погуглите в контексте состояния).

    делать сеттеры и геттеры?

    А этим мы нарушаем инкапсуляцию. Внешний мир должен знать только что можно делать с моделью, но никак не ее структуру. То есть вместо setSomething у вас должно быть осмысленное название, типа updateSomething, changeSomething и т.д. Типа "user should be able to change password" и у вас появляется метод "changePassword". Или "User should be able to update profile details" и у вас появляется один единственный метод "updateProfileDetails()". А что оно как состояние меняет - это консерн исключительно объекта. Ему рашеть менять чего или нет. Мы таким образом изолируем побочные эффекты и уменьшаем вероятность багов. Ну и нам не нужно валидировать при таком раскладе ничего так как нет промежуточного невалидного состояния.
    Ответ написан
    9 комментариев
  • Сравнение объектов через "оператор кораблик" в PHP. ...?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    То есть сравниваем мы по значению, а ключи массивов не считаются?

    p.s. пример из доки у меня работает. php 7.0.4.
    Ответ написан
  • Хорошая имплементация ListViewModel?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    on-demand подразумевает загрузку данных чанками, скажем по 1000 штук.

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

    Тут намного интереснее реализация виртуального скрола. Рекомендую вам искать готовые ибо самостоятельно у вас написать оный хоть и выйдет - вы убъете на это безумное количество времени.
    Ответ написан
  • WebSocket. На чём его можно использовать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Давайте так, расскажу вам как самому себе отвечать на такие вопросы.

    1) у нас есть ключевое слово - WebSockets. Заходим в гугл и вбиваем, он отправляет нас читать википедию. Замечательно.
    2) там мы видим что это протокол поверх TCP и т.д. и тп. То есть гуглим все новые и непонятные для нас слова.
    3) как только мы ознакомились что это за штука, мы можем поискать реализации web socket сервера и глянуть требования.
    4) делаем выводы.
    Ответ написан
    7 комментариев
  • Лучший способ обучения?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Лучший способ обучения, прочитать вот эту книгу: Структура и интерпритация компьютерных программ. И все что не понятно - гуглить и читать на википедии. И далее и далее. И задавать вопросы.

    более легкий и эффективный способ обучения

    Смотря что считать легким. Можно легко научиться не тому. Скажем пока вы не понимаете как информация внутри комьютера представлена, даже если вы на JS будете писать вы рискуете быстро проиграть. Это фундаментальные основы которые должен знать каждый.

    У большинства разработчиков, с которыми мне доводилось общаться, проблема именно с фундаментальными знаниями и понятиями. Самоучки, что с них взять. Я как бы и сам самоучка, но как-то меня никогда не устраивали непонятные штуки или расплывчатая терминология которую можно трактовать двояко.

    Например я сильно желею что нет предметов в университетах типа "история программирования" и т.д. где рассматривают основные идеи и предпосылки к возникновению тех или иных подходов. Вроде "зачем людям понадобилось ООП, если уже тогда было функциональное программирование".
    Ответ написан
    22 комментария
  • Как не стать недоспециалистом?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    читайте книжки, развивайтесь. Крутые тех диры иногда обитают во всяких гиттерах. А еще - учитесь задавать вопросы и ищите на них ответы. Вопросы в духе "откуда взялся active record", или откуда взялись объекты и зачем они нужны если есть функции и тд. Порой в поисках ответов на эти вопросы можно много чего узнать и понять.
    Ответ написан
    2 комментария
  • Какой micro framework посоветуете?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Берите Symfony 3 в режиме микроядра. Профит:

    по умолчани - микрофреймворк, если этого будет не хватать - можно быстро перейти на symfony full stack решение. Ну и по качеству кода и тд. у компонентов симфони конкурентов нет (разве что zend может тягаться).

    вот только без ORM.


    Composer же, можно любой взять пакет реализующий ORM. А еще хороший вопрос - нужен ли вам ORM. Это не что-то что дефакто должно присуствовать. Скажем если у вас в качестве базы данных монга - то ORM уже не нужна, так как нет связей между документами (точнее их не должно быть).

    не навязывал свою структуру/архитектуру

    Этому пункту соответствует. Есть общепринятый best-practice но он в принципе только о общих вещах. А структуру вашего кода - это уже сами решайте. Так же нет никаких ограничений по архитектуре вашего приложения, симфони предоставляет вам только адаптеры для UI (HTTP, CLI и т.д.), то есть организация UI приложения. Приложение же само хоть на plain php может быть, просто пользовать инфраструктурой предоставляемой симфони.

    цеплять любые файлы независимо от их "географического" положения.


    Это вы сейчас об автозагрузке или что? Какие файлы? Хватит мыслить файлами, мыслите объектами, нэймспейсами и т.д. А мэппинг этого на файлы один раз прописывается в composer.json.

    p.s. Опять же, фреймворк это всего-лишь набор инструментов. он ничем вас не обязывает. Симфони один из немногих фреймворков который предоставляет свободу. То есть есть по дефолту структура, но вы ее поменять можете как захотите.
    Ответ написан
    1 комментарий
  • Как правильно передать token csrf?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    токен должен выдаваться сервером.
    Ответ написан
  • Почему появилась мода на новый синтаксис?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    То есть varName : TypeName вместо TypeName varName ?


    Читабельность. "идентификатор varName содержащий TypeName" намного логичнее записывать именно в таком порядке. Ну и да, этот синтаксис не новый, далеко не новый.
    Ответ написан
    Комментировать
  • Как сделать директиву с динамическим шаблоном?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я новичок в деле Angular.js и пока только разбираюсь с ним.


    Если вам надо содержимое блока заменять, то лучше делать вообще через transclude. А если просто что бы работало:

    вместо $attrs используйте скоуп

    scope: {
            content: '@uiTooltip'  
        },


    p.s. лучше возьмите готовую реализацию
    Ответ написан
    1 комментарий
  • Что лучше для REST API подхода?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1. Берите то что знаете
    2. Всегда можно проиграть

    20 000 в сутки

    Это как бы не такие уж и большие нагрузки. Всего-то 4 реквеста в секунду, если принять в расчет распределение пользователей (что все 20К будут сидеть днем, то есть часов 12, и генерить в среднем 10 запросов к API).

    Такую нагрузку спокойно переносит что угодно, даже PHP со своей умирающей модель.
    Ответ написан
  • Какую ОС выбрать для локальной разработки на php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    это вообще нормально для профессиональных php разработчиков?


    Нет.

    так как хочу стать таковым , то меня интересует какой веб сервер использовать ?


    Ставьте себе убунту. Ну или virtualbox + ubuntu. Ну или vagrant. Ну или docker но это уже для продвинутых. Последние две штуки как раз и придуманы что бы невилировать (или хотя бы уменьшить) различия между окружениями.
    Ответ написан
    Комментировать
  • Как скопировать элемент по клику на Angular?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) по ngClick вызываем какой-то метод контроллера
    2) в методе контроллера меняем состояние (айтем из одного массива перекидываем в другой или копируем или что вам там надо сделать).
    3) вьюшка волшебным образом перестраивается сама по изменению состояния данных, слава декларативности!

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    потому что в первом случае вы оперируете цифрами 2, 3, 4, 5 и 6 (в итоге будет 20), а во втором 0, 1, 2, 3 и 4 (счетчик i, сумма равна 10).
    Ответ написан
    Комментировать
  • Как избежать дублирования в контроллерах?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Каким паттерном лучше всего решить данную проблему?


    Вы для начала не поняли зачем нужен контроллер. У вас логика "модели", то есть нашего приложения вытекла в контроллер, раз возникает дублирование. Контроллеры нужны для снижения связанности между UI (HTTP в нашем случае, шаблонизаторы и прочее) и непосредственно приложением. В вашем же случае у вас по сути нет того самого промежуточного слоя и контроллеры являются частью приложения, без которого оно не работает.

    В целом при дублировании обычно все решается очень просто - общую реализацию выносим в общую зависимость. Отдельный класс который делает дела и который юзают наши контроллеры. Сервис.
    Ответ написан
    Комментировать
  • Немного про замыкания в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    А каковы границы тут ?


    А тут никто никуда не ходит вообще. У вас есть скоуп функции и наружу вы ходить не можете. Вы можете снаружи прокидывать нужные переменные в скоуп вашего замыкания (use ($tax, &$total)). То есть вы просто даете вашему замыканию попользоваться этими переменными.

    Вернемся к "амперсанту". По умолчанию же все переменные передаются по значению, что означает что наша анонимная функция не может их изменить, туда просто скопируются значения. Амперсант же означает, что переменная $total будет передана внутрь замыкания по ссылке. В итоге вы меняеете эту переменную.

    p.s.
    Но в вашем случае в этом нет ровным счетом никакого смысла. Если вам надо просто сумму посчитать - вам стоит использовать функцию array_reduce, правда тогда придется изменить еще и способ, как вы храните ваши "продукты". А еще вот эта штука:

    $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                        strtoupper($product));


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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В дополнение к MaxKorz

    - устраните дублирование
    - то что вы там делаете в windoe resize - это лучше делать через CSS. А если так - то никакого хардкода значений в пикселях в JS уже не будет.
    - не стоит завязываться на стили (float), разруливайте все модификаторами (судя по селекторам у вас там БЭМ)

    Словом выносите почти все в CSS. Анимации все, стили и т.д. В итоге у вас останутся только классы.
    Ответ написан
    3 комментария
  • Есть ли возможность настроиь отправку почты, без MX записей?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Возьмите smtp шлюз какой готовый (sendgrid - 12000 писем в месяц бесплатно, mailgun - 10000 писем бесплатно) и не парьтесь.
    Ответ написан
    3 комментария