• Откуда у Google столько памяти?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    индекс всего интернета и "весь интернет" это не одно и тоже. объем хранилища у них несомненно большой, но значительно меньше чем "весь интернет"

    размер индекса гугла примерно 100 Петабайт на 2016 год. сейчас наверно подрос где нибудь процентов на 10.
    прибавим сюда кучу личной инфы с их сервисов, ну скажем еще процентов 20 от этого объема.

    Объем всего интернета по примерным оценкам исследователей из Cisco (самая большая контора по производству сетевого оборудования) - где то в районе 1.2 Зетабайта на текущий момент, что примерно в 10 000 раз больше чем размер индекса Google.

    При желании можно разместить 200 Петабайт данных даже в одном ДЦ.
    Более интересный вопрос - как они обеспечивают оперативность доступа к такому объему данных (я могу представить только в общих чертах)
    Ответ написан
  • Как грамотно настроить AWS Amazon?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    касательно "закрытия" сетей можно глянуть этот официальный пример (референсный темплейт от AWS)
    https://github.com/awslabs/ecs-refarch-cloudformation

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

    касательно SQS - ну это все специфично - если вы решили "плотно" сидеть на AWS - тут просто вопрос интерграции под это самого приложения, если же не хотите вендор-лока - то разверните себе RMQ как обычно и всё.
    Ответ написан
  • Каким должен быть правильный контроллер?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    Отвечу с позиции опыта на больших и средних проектах:

    Как говорят другие ответчики - D3lphi и Александр Шаповал , контроллер должен содержать минимум логики, и нет "единого правильного способа" его реализовать.

    Однако, исходя из своей практики, для обеспечения таких качеств проекта как сопровождаемость, тестируемость и изменяемость, я поступаю следующим образом:

    Контроллер, каким бы он не был и как бы не организовывался - содержит только обработку входных данных (валидация и преобразование) и преобразование выходных данных в нужный формат

    Логика и оркестрация которая в 80% случаев и является предметом спора о том как стоить контроллер (речь всех этих вызовах сервисов, управления потоками данных между ними, последовательности действий и пр), находятся в отдельном классе согласно паттерну Unit of Work - что позволяет легко покрыть все что связано с логикой вменяемыми юниттестами без танцев с бубном.

    Т.е. структура в итоге такая:

    {view} <--> {controller} <---> {unit_of_work} -->>> {{{..lots of services...}}}

    по сути класс семейства UnitOfWork - это полный сценарий обработки входных и выходных данных , с оркестрацией потоков данных и порядком действий, возможно какой то мелкой вспомогательной логикой, эдакий фронтенд над сервисами, заточенный под каждое конкретное действие извне (сам паттерн предполагает что класс создается на каждый отдельных случай и почти один в один описывает UseCase логику как она пришла от бизнеса (заказчика/аналитиков/моей головы/etc).

    Сами классы семейства UnitOfWork (имеется ввиду в одном приложении) могут иметь собственные иерархии наследования и композии - в угоду бизнес логики и дабы не дублировать код - главный критерий - это полная независимость бизнес и сервис слоев от контроллера. - что и является на мой взгляд "каноничным" вариантом реализации композии M и C в MVC.

    У меня, как у человека который не пишет фронты в принципе (имею ввиду сам UX/UI), но постоянно занимается сервисами, рестом, библиотеками - этот подход выработался по одной просто причине:
    взаимодействие с командой, я предоставляю "библиотеку"(не в классическом понятии этого слова) полностью абстрагированную от любых фронтов, оттестированную, полностью функциональную - а люди пишут к ней шаблонные обвязки где только валидация данных и рендер нужного формата под HTTP/Sockets/AMQP/etc типа всяких там CRUD/REST или RPC
    Ответ написан
  • Как произвести валидацию модели до сохранения при использовании паттерна Repository?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    при использовании паттерна репозиторий вам стоит перестать думать о модели которая путешествует через систему, как о месте где должна случаться валидация входных данных. Такой подход получил распространение благодаря RAD-framework'ам (Yii и ему подобные) - упрощенка цель которой - быстрая скорость разработки.

    Если смотреть на архитектуру с точки зрения "чистоты", то:

    Модель которая путешествует через всю систему должна содержать в себе только доменную логику, или не содержать ее вовсе (т.е. по факту являться Value-object'ом).

    Валидация входных данных описывается отдельной моделью - моделью реквеста - и содержит в себе логику валидации/маппинга/и пр.

    т.е. более менее стандартный подход со стороны расширяемости, надежности, тестируемости и гибкости приложения к последующим изменениям - это иметь валидацию/парсинг входных данных отдельно для каждого случая (например отдельно для вебформ и отдельно для JSON/XML/etc API, конечно фрагменты могут быть переиспользованы, наследованы или примешаны и т.д.), модели - отдельно, работу со стораджом отдельно.

    Последнее вы уже сделали = репозиторий как раз оно.

    Так что ваше предположение - верно.
    Ответ написан
  • Как собрать портфолио для back-end разработчика?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    Любой невизуальный опыт (т.е. как раз как у бекенд разработчиков, то что нельзя представить просто "показав") лучше всего представлять описанием своих обязанностей и фактически достигнутых целей которые привели к получению этого самого опыта.

    Я при отборе кандидатов на работу ориентируюсь прежде всего на резюме с подробными (но краткими, не более 2 абзацев) расписанными пояснениями к тому что человек в проекте делал, каких целей достиг. Это толчок к тому чтобы пригласить человека на собеседование, и поговорить предметно.

    Разумеется раздел "я знаю такой-то стек технологий, а еще я ковырял вот это, и вообще я крутой парень" тоже нужен, иначе как вас тогда вообще найти)

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

    Также стоит прикладывать ссылки на проекты (пусть даже снаружи не ваша работа, а фронтендеров), с вашими пояснениями (то о чем я писал выше) - становиться понятно в каких областях и с каким примерно кругом задач вам приходилось сталкиваться.
    Ответ написан
  • Есть ли рисовалка инфраструктуры для веб-проектов?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    plantuml.com

    инструмент для рисования примитивных UML (и не очень UML) диаграмм из текстового описания в автоматическом режиме. для простых вещей его хватает за глаза и не надо париться с рисованием стрелочек и прочей херней. библиотека полностью бесплатная, есть плагины под IDE. все генерится в PNG.
    Ответ написан
  • Как в PhpStorm просмотреть блочные комментарий для функций?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    под виндой и линуксом дефолтная комбинация - Ctrl+Q (Quick Documentation) при курсоре на имени функции. для OSX вроде по F1 доступно.

    а просмотр параметров как у вас это по дефолту Ctrl+P

    5c071965c1d649f3a53e5d047bd7e75d.png
    Ответ написан
  • Как сделать автоматический деплой PHP приложения?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    есть еще хороший инструмент magephp.com

    в отличии от Deployer работает более стабильно (сравнивал с версией 2 - сейчас если не ошибаюсь есть версия 3 - её не смотрел.)
    и в отличии от упомянутого Rocketeer - гораздо более продуманная и простая архитектура - писать кастомные процессы развертывания под него в разы проще чем под Rocketeer.
    Ответ написан
  • На что можно заменить \r\n\ в php или как выявить символ переноса каретки в linux?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    в PHP существует константа PHP_EOL - строковое значение перевода каретки под ту платформу на который работает код.

    Ответ написан
  • Как правильно настроить XDebug в PHPStorm?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    при работе с удаленным хостом через интернет вам необходимо иметь белый IP адрес (т.е. тот который можно пингануть с любого другого хоста в интернете)

    если он назначен роутеру - то именно на роутере настроить портфорвардинг того порта который используется xdebug (по дефолту - 9000) на вашу машину в локальной сети.

    именно белый IP и должен фигурировать как remote_host на удаленном сервере.

    и да, autostart тормозит сервер, так как даже если вы не "слушаете" xdebug - он запускается и долбит в указанный в настройках порт на указанном хосте.

    коннект там UDP.

    а вообще - лучше так не делать. =)
    Ответ написан
  • Как сделать предпросмотр файла doс в браузере?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    а пдф в хроме грузится в локальный кэш. просто вы об этом не знаете.

    при всем желании невозможно организовать "предпросмотр" с пользовательской стороны, если сервер не предоставляет вам такой возможности.

    разве что написать плагин к хрому, который просто будет делать тоже самое, но для doc файлов.
    Ответ написан
  • При запуске одного теста в PHPUnit инициализуется ли только его dataProvider или все?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    теоритически не должны, так как провайдеры мапятся к тесту аннотациями и внутри phpUnit происходит примерно следующее:

    1) загружается класс теста
    2) он реверсится, находятся все методы тестов
    а вот дальше возможны два варианта развития событий:
    а)
    3) начинается цикл по тестам,
    4) запуская каждый тест, сначала ревёрсятся его аннотации и вызываются дата-провайдеры
    5) запускается сам тест и ему передаются результаты работы провайдеров
    б)
    3) реверсятся все аннотации всех тестов
    4) выполняются все дата провайдеры
    5) запускаются тесты.

    Собственно, пардон за наглость, но проще проверить экспериментально. или почитать код фреймворка. заодно нам расскажешь. =)
    Ответ написан
  • Как сказать по-русски слово yield???

    Deroy
    @Deroy
    Senior Developer, Software Architect
    ну по смыслу - генерирует, отдает.
    чисто речевой перевод - много раз обсуждая как программист с программистом, используем прямой англицизм, т.е. "йилдит".

    примеры из повседневной речи:
    <..> и генератор будет йилдить до тех пор пока <..>
    <...> каждый раз йилдит новый джоб <...>
    для разговорной речи этого более чем достаточно.

    более литературно и по русски:
    <...> он будет отдавать значения с шагом в 10 единиц <..>
    <..> должен выдавать срез заданного размера <...>

    т.е. полностью аналога вроде как нет, но за счет окружающего контекста смысл придается тот же.
    Ответ написан
  • Как лучше выкладывать релизы при работе по модели git flow?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    за интерфейс не скажу... наверно подойдет любой гит-менеджер который рисует сеть коммитов в виде древа/графа

    а вот насчет релизов и проблем с пониманием что откуда взялось - что бы было меньше коммитов и история была понятней - можете попробовать использовать --squash при мердже фичи в dev - тогда у вас будет по одному коммиту на каждую законченную фичу.
    Ответ написан
  • Web-разработка. Уровень погружения в язык программирования: PHP vs JavaScript. Где "глубже"?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    Многое несомненно зависит от того как позиционируется PHP бэкенд в составе проекта,
    однако в целом если говорить про разработку приложений на PHP как такового (без зоопарка вокруг)
    список инструментов примерно следующий (представлены самые популярные)

    Стандарты - по хорошему надо прочитать и понять всё что издает php-fig в сфере юзерленд кода,
    самые важные - PSR 0-4

    Вспомогательные (обязательные) технологии - YAML, XML, CSV, JSON;
    Библиотеки "все-в-одном" - на бэкенде не водятся (да здравствует linux-way);
    Фремворки общего назначения, скелеты приложений - Yii (1,2), Symphony2, ZendFramework2;
    CMS-фреймфорки - Drupal, ... Wordpress? ищите под задачу;
    Модульность, Зависимости - Composer и все что с ним связано, PEAR/PECL (потихоньку отмирает);
    Сборка - Phing (хотя я собираю php-проект gulp'ом - у него API приятнее);
    Тестирование - PHPUnit, Behat, CodeCeption;
    Деплой(Развертывание релизов) - Mage (aka Magallanes), Deployer
    Помощники - Vargant, Docker (тестирование и разработка в готовых окружениях)

    Здесь я не упоминал того что нужно знать о самом языке и его компонентах.

    теперь поговорим о зоопарке..

    технологии и зоопарк специфичный только для PHP:

    Сервера приложений - php-fpm, apache-mod-php;
    Кэш и быстродействие - APC (APCu для PHP >= 5.5)
    дебаг - ZendDebug, XDebug, XHProf

    Далее то что не отличается от одного серверного языка к другому.
    это часть ответа безгранично велика на самом деле =)

    Сервера и прокси - Nginx, Apache, Varnish, etc.
    Кэши и NoSQL - Memcached, Redis, Mongo, etc.
    СУБД - MySQL, PostreSQL, etc..
    Поисковые индексы - ElasticSearch, Sphinx
    Очереди и межпроцессовое взаимодействие - RabbitMQ, ZeroMQ, linux-sockets, posix-treads
    Протоколы взаимодействия (4 уровень OSI) - HTTP(во всех его подробностях! просто MUST HAVE), POP, SMTP, IMAP, REPL.
    Траспортные Протоколы (3 уровнь OSI) - TCP, UDP
    Библиотеки уровня системы - cURL (абсолютный MUST HAVE - большинство взаимодействия поверх HTTP строится на этой библиотеке в абсолютном большинстве серверных скриптовых языков)
    Ответ написан
  • Как сверстать одноэкранную страницу без вертикальной прокрутки?

    Deroy
    @Deroy
    Senior Developer, Software Architect
    используйте для элементов хэдера, футера и контента CSS-свойство position:fixed
    для контента - overflow:scroll и будет вам счастье.
    Ответ написан