Pull to refresh
32
Бучнев Павел@butschster

Senior PHP Developer

32
Subscribers
Send message

Кайф, спасибо за норальное тесто!

Спасибо за статью. Centrifugo действительно крутой инструмент и его главное отличие от reverb и ему подобных это то, что он не только может отправлять события клиенту, но и клиент может через него слать сообщения на сервер. И вот здесь он крут.


У них есть в доке раздел Proxy events to the backend где они описывают механизм отправки сообщений от клиента на сервер и не только. Я очень часто использую фичу, когда клиент только устанавливает соединение с Webscoket сервером, то я его сразу авторизую и подписываю на те каналы которые ему нужны и мне не нужно из JS управлять подписками.

Причем там есть проксирование по gRPC и мы можем вообще скрыть endpoint для обмена данными между Centrifugo и backend сервером и это прям мега фича.

Короче он нам в своё время настолько зашел, что у RoadRunner из коробки появился плагин для Centrifugo с двухсторонним взаимодействием по gRPC и PHP SDK для работы. И проводили стрим на тему создания чата с RoadRunner и Centrifugo

P.s. посмотрел composer пакет и там только про push и ничего про проксирование(

Ну если твой проект покупала другая компания, то тебе бояться нечего, твой код идеален и запашка в нем быть не может! Спи спокойно.

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

Помню в бородатые годы, кстати, на хабре было много постов на тему говнокода:

P.S. Кстати, пора бы обновить свой профиль на Хабре, у тебя там стоит вилка ЗП от 120к, по рассказам у тебя там должно быть намного больше!

Да да да, уже изучали этот профайлер. https://github.com/wikimedia/mediawiki-php-excimer В планах сделать интеграцию с ним. Спасибо!

Blackfire) Кстати есть в планах их коллектор примерить к Buggregator, если подойдет, то можно будет слать трейсы прям в багри с прода. А так если проблема на конкретном серваке, то клонируй сервак и на нем уже профилируй, если проблема именно с конкретным серверов. Но как по мне, так попахивает дебаг сервера, а не приложения, раз все работают норм, а один сервер не норм.

проплаченная реклама детектед(

Это перевод. Для тех, кто в теме Temporal должно быть более-менее понятно. Для тех кто нет, я планирую провести стрим, где разберем весь код Workflow и поизучаем как оно работает.

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

Что касается твоего кода, то первый вопрос, зачем копировать к себе в «велосипед» куски чужого кода, если за это время можно было взять готовый фреймворк/микрофреймворк и на нем уже создать полноценный продукт? И тратить время на более важные вещи, а именно на свой рост.
Правильно ли я понимаю, что папка classes в CMS это скопированные классы из yii? Почему не затащил свой проект на базу Yii?

Я бегло изучил код, его кол-во и т.д. и как по мне, проще было взять чистый фреймворк и перенести кодовую базу в него, нежели пытаться файлики из yii внедорять в свой проект, на это есть одна простая причина — твой код необновляем. Вот представь, завтра выходит обновление ядра Yii, твои действия?

В общем я увидел исключительно небольшой рефакторинг кода и все, кодовая база небольших размеров. Глядя на твою CMS я не совсем понимаю в чем посыл твой? В том что ты написал код 2010 года и закинул туда пару файликов из Yii? Ну код ревью такой код не прошел бы.

P.s. В свое время я также занимался велосипедостроением (CMS разрабатывал). Начинал я это делать на фреймворке Kohana (Github) и он мне казался время мега крутым, но через год, он устарел и перестал развиваться и я принял решение переехать на новый фреймворк Laravel, который мне казался очень перспективным, тем самым.Куча модулей, сложный UI, я не представлял как перенести код с одного фреймворка на другой. Но я сделал это практически в одиночку (Github и Base Github), пришлось переделывать всё. Короче CMS умерла потому что я плохой маркетолог, хотя старался сделать ее на современных технологиях, оказывал поддержку, но не хватило сил сделать это в одиночку и привлечь для ее развития разработчиков, просто никому это не интересно. В России слишком маленька ЦА. Но главное, что я получил от использования фреймворков и интеграции с ними — это опыт работы с ними, изучение применяемых практик, ООП, паттерны проектирования и т.д.
Привет, Олег! Прочитал твою статью, очень впечатлила, т.к. ты сделал то, что никак не решусь сделать я по разным причинам, хотя есть понимание того, чему хочу учить, кого хочу и т.д.

Я решил не продолжать делать курсы в одиночку.

Предлагаю созвониться и обсудить это. Вполне возможно, что найдем точки соприкосновения.
Всегда приятно видеть ссылки на свои разработки в новостных дайджестах! Кстати, я сейчас занимаюсь разработкой нового пакета для Lumen, который позволит с минимальными временными затратами создавать микросервисы с использованием шины RabbitMQ и JMS\Serializer. Нужны помощники в доработке и тестировании пакета. Ссылка на репо github.com/butschster/LumenMicroservice
Да, именно так я в основном и делаю, гугл я не использую, привел как пример. Но в тех местах, которые, скажем так я посещал с помощью этих браузеров умеют детектировать через время такие браузеры и блокировать аккаунты, которыми браузеры прикрывались. Но вообще это отдельная история
Там сам гугл говорит об этом, а это значит, что он знает как детектировать значит смогут и другие.
На самом деле проблема намного глубже и не решается лишь подменой заголовков и user agent. Это легко проверить, достаточно попробовать пройти гугл авторизацию в headless режиме.
Не так давно я изучал этот вопрос и наткнулся на статью intoli.com/blog/not-possible-to-block-chrome-headless где показаны некоторые особенности браузера. Но я уверен, что даже этого будет недостаточно для прохождения гугл авторизации.
Сейчас этот код сложно будет тестировать.

Что бросилось в глаза:
  • класс InstaLite отвечает за работу с сессиями. По хорошему это должен быть отдельный класс, который содержал бы в себе только те методы, который отвечают за работу с ними.
  • класс Request отвечает и за Response. По хорошему выполнение запроса должно было бы возвращать объект Response, который в свою очередь имел бы необходимые методы для получение информации об ответе от сервера
  • методы all и id класса InstaLite можно вызвать до вызова метода searchUser, что приведет к неверному поведению. По хорошему класс InstaLite не должен содержать этих методов, а вызов метода searchUser должен возвращать новый объект, например FoundUsers, который должен содержать эти методы.


Хотелось бы вас попросить описать процесс добавления мной, как пользователя вашим пакетом нового API. Например, я решил получить список лайков. Что я должен сделать, чтобы выполнить данный запрос без изменения исходного кода библиотеки.

P.S.
Советую как можно скорее перейти к написанию тестов и тогда вы сами начнете дробить свой код на более мелкие части и выделять в отдельные классы. А также почитать про внедрение зависимостей.
Иногда глаз цепляется за код, который совершенно лишний и выдает глубину знаний фреймворка, например вот этот код:
protected function fields(): array
{
     return array_filter(
         array_map('trim', $this->request->all())
     );
}


Если мы посмотрим вот сюда github.com/laravel/laravel/blob/master/app/Http/Kernel.php#L20, то увидим, что Laravel уже изначально применяет функцию trim ко всем стринговым значениям для Request.

В остальном это самый примитивный вариант реализации фильтров.
Я сам люблю красивый и структурированный код, но иногда нужно все-таки исходить из задачи и применения. В данном случае я вижу, что это вспомогательная функция и, возможно, она не стоит того, чтобы выглядеть супер читабельной не в угоду производительности, главное чтобы тестами была покрыта.
Если исходить из поста про собеседование, то, как по мне, там важнее всего понимать и упомянуть про сложность алгоритма и показать интервьюеру своё мышление.
Нечто подобное было в курсе codecourse.com/courses/filtering-in-laravel
Ох, если бы только на Windows. У меня такая же проблема на Ubuntu 18… с двумя мониторами. HDMI + DisplayPort, самое обидное то, что при выходе из спящего режима DisplayPort монитор не всегда просыпается и приходится руками выключать и включать на кнопку.
Пара вопросов:

— Почему у вас какие то параметры именуются $comment, а какие то $DoctrineRepository? Почему разный стиль?
— Почему бы не использовать, хотя бы при создании репозиториев принцип инверсии зависимостей? Куда приятнее работать с интерфейсами, а не с реализацией, благо в Laravel это достаточно легко реализуется.

Вот кстати у меня вопрос, я как человек мало понимающий в DDD и в вашем коде,
class Comment implements CommentTypeFactoryInterface {
    private function addComments()
    private function editComments()
    private function deleteComment()
    private function retrieveComments()
}

Кто и откуда запускает эти методы?

В методе editComments() вызывает метод $this - > page - > addComments($comment);, но ведь DDD подразумевает, что мы общаемся на языке бизнеса, а получается, что редактирование комментария у нас приравнивается к добавлению?

Хотелось бы более детального разбора кода.
1
23 ...

Information

Rating
5,920-th
Location
Батуми, Аджария, Грузия
Date of birth
Registered
Activity

Specialization

Бэкенд разработчик, Архитектор программного обеспечения
Ведущий
From 500,000 ₽
PHP
Docker
PostgreSQL
Git
Английский язык
Разработка программного обеспечения