• Правильно ли я расставляю приоритеты в развитии?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для начала, как говорится, определитесь с целями. Вы хотите больше интересных задач. При этом ваша специализация - верстка. Раз уж вы только только решили попробовать "gulp" и sass - предположу что с такими инструментами, как скажем autoprefixer вы так же не знакомы. И тем более webpack.

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

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

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ох...

    Model View Controller. Да ну его, ему уже 45 лет (придумали в 79-ом году). Давайте лучше про Model View Adapter погокорим. это то что все используют в популярных фреймворках последние лет так 10 так точно.

    mvc-mvp-mvvm-6-638.jpg?cb=1375170002

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

    View - это не только HTML, но и вообще представление в целом, а так же логика его формирования. Шаблонизаторы, фильтры, различные функции/объекты помогаютщие нам сформировать view (например форматирование дат, сериализаторы и т.д.) В подавляющем большинстве случаев "представление" наших данных - это HTTP запросы и HTTP ответы. HTML - э то лишь часть HTTP ответа.

    Model - Это целый слой, который может быть представлен в виде кучи отдельных объектиков, структур и т.д. Его задача - делать дела и хранить/менять состояние системы. Тут легко запутаться потому что термин "модель" много чего значит. Воспринимайте его как "слой логики" а не конкретные объекты. И да - база данных и прочая чушь - это детали реализации этого слоя. "не важные штуки" словом. Туда же и ActiveRecord, ORM-ки всякие. Это деталь реализации и все остальные чуваки (view и controller) о них знать ничего не должны (хотя иногда могут в целях упрощения).

    Controller или адаптер. Это опять же не обязательно один объект. это может быть цепочка адаптеров (еще называют фронт-контроллером, middlewares и т.д.). Его задача весьма простая. Получаем представление данных на входе (HTTP запрос), определяем что надо делать, и просим модель что-то сделать (ни в коем случае не меняем ничего самостоятельно в контроллере, он только просит). Потом мы можем попросить модель вернуть нужный нам кусок состояния, и попросить View сформировать представление (HTTP ответ).

    Как-то так. В целом же это я сейчас описал "идеальный мир". Вся суть этого подхода - разделение логики презентационной и логики приложения. Зачем это надо? что бы было проще жить! Обычно UI приложения или способы взаимодействия с ним меняются почаще логики или как минимум в разные моменты времени. Адаптеры в этом случае служат промежуточным слоем, они ничего сами не делают, это "переводчики". Они просто переводят то, что сказано в запросе в язык понятный приложению и обратно.

    Но на начальной стадии можно слегка нарушать эти правила, делать толстые контроллеры и т.д. В этом случае бизнес логика будет потихоньку "вытекать" из модели. Это не хорошо, и на хоть сколько нибудь больших проектах может привести к проблемам. Потому важно находить баланс.
    Ответ написан
    Комментировать
  • Как деплоить проект в Docker на Production?

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

    В целом же алгоритм такой
    - пушим образы в docker hub (или свой registry/distribution на сервере, в этом случае надо сначала задеплоить его куда-нибудь по той же схеме)
    - добавляем целевую удаленную машину в docker-machine (драйвер general) - тот ставит там докеры шмокеры и в целом настраивает все
    - при помощи docker-machine env переключаемся на удаленный docker-демон
    - делаем docker-compose up -d или как вы там оркестрируете все. Для удобства стоит отдельный yml файлик под прод сделать и указать образы которые вы запушили.

    Готово.
    Ответ написан
    5 комментариев
  • Качество кода ради производительности?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ну дак в чем собственно вопрос, стоит ли делать подобные жертвы ради производительности?


    Нет, достаточно просто настроить opcache нормально:

    1) использовать автозагрузчик который генерит вам composer (обязательно с флагом -o, тогда он сдампит жирную мэпу классов и не будет дергать файловую систему просто так)

    2) Отключить инвалидацию кэша в opcache (opcache.validate_timestamps=0) и сбрасывать кэш вручную при деплое

    3) проверить через API opcache как там по выделенным ресурсам. Для вашего теста скорее всего дефолта хватит за глаза. Для больших проектов уже можно поиграться с размерами буферов. Читать в документации о функциях opcache что бы статистику собирать.

    4) обновитесь до php7

    p.s. среднее время ответа для простеньких запросов - 30ms, память - 10-15Mb. Если запускать симфони в php-pm, то запросы отдаются за ~10-15ms, потребление памяти на запрос посчитать немогу (так как все запущено как демон). Но этот вариант пока рекомендую для очень простых апишек где нужна скорость реакции системы.
    Ответ написан
    2 комментария
  • Как динамически подключить директиву?

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

    p.s. тут лучше подходит ngIf
    Ответ написан
    9 комментариев
  • Зачем нужны обертки на request data?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    помимо GET/POST есть еще PUT/PATCH, а еще нынче часто присылают в качестве тела запроса JSON. И работать с сырыми заголовками/телом ответа как-то не очень удобно. А еще есть проекты типа php-pm которые поднимают свой HTTP сервер из под CLI, то есть вообще другое SAPI.
    Ответ написан
    Комментировать
  • Как поисковики относятся к SPA? Ожидаются ли изменения?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Доколе поисковики будут любить текстовые сайты


    Пока ваш SPA не будет загружаться так же быстро как и текстовый вариант, с уже отрисованным на нем контентом.

    которые могут быть более удобны для пользователей?


    Текстовые сайты удобнее для пользователя первые 3 секунды, так как быстро загружаются, а дальше не очень да)

    В целом серверный пререндеринг по которому сейчас все угарают как раз таки решает две проблемы сразу:

    - улучшение отзывчивости системы, поскольку пользователю не надо ждать 10 секунд пока все отрисуется
    - полностью устраняет проблему c SEO
    Ответ написан
  • Лучший ресурс/книга/видеоуроки для изучения AngularJS?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Дополню ответ bromzh

    лучший способ изучения


    Ограничивать себя и практиковаться.

    Ограничения даже могут быть искуственными, типа "никогда ни использовать $scope". То есть если хочется, лучше хорошенько подумать "а как без него?". Очень редко, его нужно использовать напрямую, но в подавляющем большинства это директивы и работа с событиями, в целом же на вашем уровне это может просто не понадобиться.

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

    Или... "Не полагаться на двустороннее связывание". То есть... оно увы в angular 1.x везде, но нужно понимать риски с этим связанные и стараться делать все так, что бы элементы нижнего уровня ничего не меняли на верхнем уровне, а все изменения проходили либо через колбэки или сервисы. Исключения - формы, тут двусторонний биндинг бывает очень полезным.

    Так же "Никогда не использовать ng-controller", или "Делать все на stateless компонентах" и все такое.

    Для всех этих правил есть свои исключения, но нужно 10 раз подумать можно ли соблюсти правило прежде чем его нарушить.

    Я так же собрал парочку толковых ссылок которые могут быть полезны новичку. Там так же пример ооочень простого приложения с тестами.

    Так же рекомендую сразу же изучить хотя бы основные плюшки ES6 с babel и использовать их. Таким образом можно сильно упростить структуру приложения.

    А ну и да, ТЕСТЫ! Пробуйте писать приложения используя TDD, это очень полезно для новичков и так же действует как ограничение. Типа "если неудобно писать тесты - подумай как сделать так что бы было удобно писать тесты изменяя тестируемый код". Ну и все такое. У TDD есть свои правила вроде "не меняйте тесты и код одновременно" и т.д.

    Новички должны быть в ежевых рукавицах.
    Ответ написан
    Комментировать
  • Написание первой CMS. Как лучше?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Т.е. прежде чем мне написать CMS мне надо "перелопатить" тысячи исходных кодов различных CMS, изучить их, проработать с ними как минимум год чтобы понять как написать правильно свою систему?


    Именно так. Я бы даже сказал годика так 3 хотя бы, и пару десятков разных проектов. Важно что бы вы получили разный опыт.

    Неужели чтобы написать даже самую простую CMS для личных элементарных нужд придется изучать куча всего другого чтобы выстроилась точная картина о ее разработке?


    нет, если вы не будете писать велосипеды и возьмете фреймворк как готовую основу.

    но интерес составляет написать самому

    Начните с фреймворка:

    - библиотека для рендринга шаблонов (буферизация вывода, работа с файловой системой немножко)
    - библиотека для маршрутизации запросов (прошаритесь в регулярках)
    - библиотека для работы с базой данных (не ORM, начните с Table Data Gateway или DAO хотя бы. Прошаритесь в SQL минимально).
    - Ядро, связывающее все это вместе. Желаельно с какой-то концепцией мидлвэров, что бы все остальныекомпоненты ничего не знали о ядре. (прошаритесь в HTTP)

    В целом же писать CMS очень и очень скучно и долго. Вы намного быстрее прошаритесь во всем что надо делая отдельные компоненты. Благо сейчас век composer-а и вы можете крутить и вертеть фреймворками как хотите, подменяя чужие компоненты на свои.
    Ответ написан
    6 комментариев
  • Зачем java программисту знать front-end?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    только из-за веба ?


    А вы как думаете? Если вы будете WEB делать то логично знать хотя бы основы WEB стэка.
    Ответ написан
    Комментировать
  • Есть ли анализатор неиспользуемого кода PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    попробуйте прогнать через phpdepend или phpmetrics. Это весьма полезные инструменты для анализа кода и отыскивания "интересных" мест.
    Ответ написан
    Комментировать
  • Как создать единую авторизацию через разные сервисы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    как найти его уже существующий профиль в базе и просто дополнить (при необходимости) несколько неуказанных в таблице полей?


    Если сервис вернул email - смотреть по email. А если нет - вы не сможете на 100% быть уверены что это два тех же человека. Все просто.

    Для авторизации через соц сервисы есть куча реализаций под oauth2.
    Ответ написан
    2 комментария
  • На каком уровне нужно знать JS начинащему?

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


    https://developer.mozilla.org/en-US/docs/Web/JavaScript - готовый план (туториалы).

    В целом с текущими трендами было бы неплохо ознакомиться с функциональным и ОО программированием. Основные конепции, понятия "сильно/слабо связанный/зацепленный код", "имутабельность", "чистые функции" и т.д.
    Ответ написан
    Комментировать
  • Функция диапазона ip?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    php.net/manual/en/function.ip2long.php
    php.net/manual/en/function.long2ip.php

    то есть работаем с IP как с числом.

    updated

    добавил свой вариант функции:

    function ipRange($startIp, $endIp) {
        $start = ip2long($startIp);
        $end = ip2long($endIp);
    
        return array_map(function ($ip) {
             return long2ip($ip); // нам не надо проверять эти условия с нулями и 255.
        }, range($start, $end));
    }
    Ответ написан
    5 комментариев
  • Почему получаю ошибку Maximum call stack size exceeded?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    У вас тут идет рекурсивный вызов геттера и сеттера (вы из геттера age вызываете геттер age). Что бы понять что значит эта ошибка - читаем как работают рекурсии и что такое "стэк вызовов".
    Ответ написан
    1 комментарий
  • На что это больше похоже: паттерн или говнокод?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Никакого отношения сингелтону этот код не имеет.

    с какой целью его автор создает экземпляр объекта в статичном методе


    У этого приема много названий. По сути это статический метод-фабрика, еще можно встретить "именованный конструктор".

    class User {
        private function __construct($email, $password) { /* ... */}
        public static function create($email, $password) { 
             return new static($email, $password); 
        }
        public static function createWithProfile($email, $password, UserProfile $profile) {
             $user = static::create($email, $password);
             $user->profile = $profile;
             return $user;
        }
    }
    
    $user1 = User::create('example@example.com', 'example');
    $user2 = User::createWithProfile('example@example.com', 'example', new UserProfile(
        $firstName, $lastName, $avatar /* ... */
    ));


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

    Отличие тут в том что мы не возвращаем экземпляр класса, он однаразовый. Только для этой последовательности.

    Почему бы не сделать так, спросите вы:
    (new Reboot())->reboot();

    Потому что нам не нужен этот инстанс. Функция reboot ничего не должна вернуть, а объект который создается - одноразовый. Почему так - надо смотреть в контексте. При работе с процессами я могу придумать десяток кейсов когда это надо.

    По сути можно было бы спокойно сделать это обычной функцией, но автор посчитал что так будет читабельнее. Говнокод часть тут только имя класса - Reboot. Имена классов, интерфейсов и т.д. должны быть существительными. Мы описываем тип объектов. Но это единственное место к которому я могу придраться.
    Ответ написан
    2 комментария
  • Какие существуют рецепты деплоймента веб-проекта на Go?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вопрос склеивания и минификации JS файлов


    Вы уже используете System.js, а стало быть можно использовать бандлеры на основе system.js: https://github.com/systemjs/builder

    Короче, я прошу совета, как довести это до ума.


    Собираем локально или на CI сервере в виде tar.gz архива, заходим на сервер и распаковываем.

    tar.gz можно заменить на deb/rpm пакеты, docker образы и все что угодно.
    Ответ написан
    2 комментария
  • Почему термин DevOps часто упоминают в паре с термином Agile?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Потому что это все buzz words. То есть "модно". Если у тебя нет людей которые называю себя devops-ами - ты не модный. Если ты делаешь не по Agile - ты не модный.

    В целом это связанные вещи. Давайте заглянем в вики и посмотрим что это такое:

    DevOps (акроним от англ. development и operations) - методология разработки программного обеспечения, нацеленная на активное взаимодействие и интеграцию специалистов по разработке и специалистов по информационно-технологическому обслуживанию.


    то есть это когда админы и программисты работают вместе а не по отдельности как обычно. Зачем? читаем дальше:

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


    То есть грубо говоря, методология DevOps помогает нам в случае если у нас частые релизы. То есть раз в неделю. Или раз в день. Или несколько раз в день.

    Частые релизы - это нормальное явление в итеративной разработке. А все "Agile" методологии основаны на идеи инкрементных релизов, итеративной разработке, уменьшение цикла обратной связи.

    И существует ли в природе DevOps фриланс?


    Как мы выяснили ранее - DevOps это методология а не человек. Так что для того что бы у нас был DevOps нам нужны минимум два человека. Или один, который занимается и Dev и Ops.

    Вы можете фрилансить в рамках Dev или Ops части и взаимодействовать с другой частью проблемы. В целом же HR-ы понимают под DevOps обычных Ops (админов) и почти никто не парится. А еще в некоторых компаниях упарываются настолько что появляются люди называющие LiveOps. Мол у них все настолько Agile что Ops-ы работают с Dev окружением и Live окружением. Серьезно, мне как-то такое втирали в одной весьма крупной компании.
    Ответ написан
  • Зачем мне нужен Docker?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Зачем нужен Docker?

    Лично я использую:

    - Docker для управлением окружением (как для dev так и для prod)
    - Docker-distribution для хранения собранных образов контейнеров
    - Docker-compose для оркестрации контейнерами на целевой машине (для dev это моя машина, для prod удаленный сервер)
    - Docker-machine для управления удаленными машинами (оно само поставит докер куда надо и все такое)
    - Docker-swarm (пока не использую, небыло необходимости) - для оркестрации контейнерами в класстере, с failover и тд.. Так как docker-machine можно настроить так что бы тот еще и создавал инстансы (например дроплеты на DO) то можно организовать полностью автоматизированную систему с определенным уровнем отказоустойчивости.

    В целом для деплоя можно вообще по SSH не заходить. Дико удобно, особенно когда много проектов и много серверов.
    Ответ написан
    Комментировать