• Почему не работает параметр grpc_send_timeout, Nginx закрывает GRPC streams спустя минуту?

    Судя по https://kubernetes.github.io/ingress-nginx/example... надо к grpc_send_timeout 7d; добавить ещё и client_body_timeout 7d; дабы таймаут связи с клиентом тоже увеличить.
    Ответ написан
    Комментировать
  • Как начать использовать технологию WebSocket?

    ukko
    @ukko
    php, js (es6), golang, symfony, react
    Вам стоит почитать о демонизации процессов, как их перезапускать в случае падений, как обрабатывать различные ситуации, очищать память и прочее.

    В этом демоне подключаете любую популярную библиотеку (ratchet, wrench, ...).

    Ps Менять технологии на nodejs я не вижу смысла. Nodejs не идеальная технология со своими проблемами.
    Ответ написан
    Комментировать
  • Symfony 2 или Laravel для распределённой системы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    без разницы, в принципе. И на том и на том можно сделать как просто и быстро так и плохо. Разница по сути только в подходах по работе с базой (доктрина - domain centric, ларавелевская ORM - database centric).

    Ну и да, в Laravel вполне себе удобный IoC (даже не смотря на то что в symfony2.8 уже сделали автовайринг), и концепция мидлвэров. Но у Symfony2.8 можно включить микроядро, и по производительности он уйдет вперед (чисто фреймворк, без учета ORM и т.д.)
    Ответ написан
    5 комментариев
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

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

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Подключение зависимостей вендорного бандла в Symfony2 автоматически?

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

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

    то подключал зависимые бандлы в app/AppKernel.php (все 10 штук).

    так и напишите в инструкции.
    Ответ написан
    3 комментария
  • Какую бесплатную cms/фреймворк использовать для интернет-магазина?

    @djay
    Рекомендую Magento - гибкий, много документации, все нужды для магазинов - там есть. А хороший магазин ты за год не напишешь, даже на Yii 2
    Ответ написан
  • Как получить renderView в сервисе, который не наследуется от класса Controller?

    @shoomyst
    dumb
    Если необходимо такое, значит что-то не так в архитектуре приложения.
    Если очень надо, контроллер делается сервисом и инжектится через DIC
    Ответ написан
    2 комментария
  • Правильный способ хранения текста и HTML-кода в базе MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ на вопрос из заголовка:
    Никак особенно не хранить. Хранить абсолютно так же, как и любые данные, - как есть. То есть, НИКАК их не модифицируя для хранения.

    Решение конкретно твоей проблемы:
    mysql_set_charset('utf8'); после коннекта
    +
    плюс таблицы должны иметь кодировку utf8
    Подробнее: phpfaq.ru/charset

    Разбор вопроса:
    везде совет для записи в базу использовать mysql_real_escape_string(),

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

    Как я понимаю необходимо обрабатывать текст вот так перед вставкой:

    Неправильно понимаешь.
    Перед вставкой текст обрабатывать не надо вообще никак.
    Для корректной работы SQL, как я уже писал выше, должны использоваться подготовленные выражения.
    HTML же к SQL не имеет ни малейшего отношения. и никакая HTML функция, разумеется, при сохранении в БД использоваться не должна.

    К примеру "⇔" при записи в базу превращается в "?"

    Вот с этого и надо было начинать. У тебя проблема с кодировками.
    Ответ написан
    2 комментария
  • Как понимать асинхронность в Tornado?

    @ykalchevskiy
    tornado.gen.coroutine + yield != асинхронность. Вызовы, которые делаются должны уметь работать асинхронно. Смотрим здесь первый пример:
    class AsyncHandler(RequestHandler):
        @asynchronous
        def get(self):
            http_client = AsyncHTTPClient()
            http_client.fetch("http://example.com",
                              callback=self.on_fetch)
    
        def on_fetch(self, response):
            do_something_with_response(response)
            self.render("template.html")

    Метод fetch объекта класса AsyncHTTPClient -- асинхронный. На это указывает аргумент callback (и название класса, конечно :)). Когда страница будет получена, вызовется _on_fetch. Как и в AJAX.
    Пример ниже на этой же странице -- это переписанная версия того же самого, просто красивее, без лапши коллбеков. Для этого и нужна пара tornado.gen.coroutine + yield.

    Вызов time.sleep(2) блокирует весь ioloop, вместо него можно воспользоваться чем-то типа
    yield tornado.gen.Task(tornado.ioloop.IOLoop.current().add_timeout, time.time() + 2)


    Но даже заменив эту строку, асинхронности не будет заметна. Это связано с ограничениями браузеров: они не умеют одновременно открывать одну и туже вкладку. Поэтому нужно открыть вкладки в разных браузерах.

    Еще одно: декоратор @tornado.web.asynchronous не нужен при использовании @tornado.gen.coroutine.

    Вот эту страничку нужно обязательно прочитать.
    Ответ написан
    Комментировать
  • Что делать с тупыми ответами на Тостере?

    karaboz
    @karaboz
    Директор продуктов в Хабре.
    Мне кажется, для заявленной вами проблемы как раз подходит пункт жалобы «Это какая-то реплика, а не ответ». И не стоит искать другой формулировки, нам нельзя их слишком много плодить, иначе жалобами невозможно будет пользоваться.

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

    1. Самое простое, что можно сделать — привлечь в уже существующую систему жалоб больше участников. Для этого можно высылать уведомления всем, кто жаловался, что ответ был удалён. Плюс выдавать награды тем, чьи жалобы чаще всего удовлетворяются. Система наград у нас на подходе, кстати.

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

    3. На днях мы выкатим возможность коллективного редактирования вопросов. Когда обкатаем этот функционал и увидим, что он работает, что сообщество может модерировать само себя, сразу же перенесем этот же принцип коллективного редактирования на ответы. Активные и отвественные участники смогут показать менее радивым, как стоит оформлять свои тексты и свои мысли. По идее, это сильно должно улучшить качество ответов.
    Ответ написан
    38 комментариев
  • Как переопределить значение свойства сущности при помощи сервиса в Symfony2?

    error500
    @error500
    PHP-developer
    В вашем случае, я считаю, можно поступить иначе - реализовать twig фильтр, и в самом шаблоне уже делать так {{ item.price| actualPrice }} .
    Ответ написан
    1 комментарий
  • Как включить перевод в symfony для форм?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    не делайте в messages.ru.yml раздел "forms:", поставьте перевод прямо так, как написано на странице. У вас в форме поля maker и category, а на странице они выводятся как Maker и Category. Так?
    Напишите в переводе именно так:
    Maker: Создатель
    Category: Категория

    Ну а если хотите добавлять префикс form, то добавьте в описание формы атрибут label:
    $builder
            ->add(
                'maker',
                'entity',
                array(
                    'label' => 'form.maker',
                    'class' => 'MyBundle:ItemMaker',
                    'property' => 'name',
                    'empty_value' => '-- Все --'
                )
            )
    
            ->add(
                'category',
                'entity',
                array(
                    'label' => 'form.category',
                    'class' => 'MyBundleCategory',
                    'property' => 'name',
                    'empty_value' => '-- Все --'
                )
    );

    то есть, укажите label в том же виде, как фреймворк его видит в файле перевода. Но тогда не забудьте добавить и английский перевод! (если он вам нужен)
    Ответ написан
    4 комментария
  • Деплой symfony2. Как установить composer на хостинге timeweb?

    RussellKvashnin
    @RussellKvashnin
    WEB-developer
    Композер нужен для установки зависимостей (vendor).
    Раз уж на то пошло - никто не мешает залить проект вместе с вендорами, а не устанавливать их на хосте.
    Ответ написан
    Комментировать
  • Почему все так любят Bootstrap?

    denver
    @denver
    Я фронтендщик, мне не сложно сверстать, но использую бутстрам. Не из-за лени, а просто, во-первых, времени жалко. А во-вторых, часто сверстанное переверстывается. Соответсвенно и усилий тоже жалко. Главный мой (и собственно любого начальства) довод - а какая разница?

    Семантичный HTML это тот что теплый лампловый? Умер семантичный, не успев понадобиться.
    А бутстрап... это инструмент для верстки (не лучший, не худший). И я верстаю на нём не только админки, как вы сами видите по темам - несколько строчек CSS кода и бутстрап превращается.... в элегантный сайт. А тем кто не умеет делать элегантно - просто показано его использовать, придет нормальный фронтендщик и спасибо скажет.
    Ответ написан
    3 комментария
  • Почему все так любят Bootstrap?

    @IvanOne
    лично мне верстать не очень нравится, я больше в backend люблю копаться, а так набросал быстро интерфейс и сосредоточился на кодинге функционала сайта
    Ответ написан
    Комментировать
  • Почему все так любят Bootstrap?

    @zugo
    Очевидно же, потому что очень распространен и универсален - для не умеющих/не желающих верстать (например, для создания прототипа) позволяет очень быстро и безболезненно создать кроссбраузерный адаптивный (и пристойно выглядящий при том) интерфейс, а профессионалы фронт-энда могут на полную задействовать его возможности (LESS mixins, API JavaScript-плагинов и т.д.), чтобы создать уникальный и довольно мощный интерфейс, при этом не отвлекаясь на рутину вроде написания сетки. Собственно, благодаря всему этому у него огромное коммъюнити и большое количество всевозможных тем и плагинов.
    Ответ написан
    2 комментария
  • В двух словах, что такое БЭМ?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    БЭМ - это такая методология вёрстки от Яндекса. Она подразумевает разбиение страниц на отдельные смысловые блоки (комментарий, пост, заголовок, футер, форма, инпут и т.п.). Каждый блок может состоять из других блоков. Основная идея - как можно больше повысить возможность повторного использования уже написанных блоков, для чего используются модификаторы. Плюс, БЭМ подразумевает отказ от каскадных стилей, потому что они препятствуют повторному использованию.
    Например, на странице есть два разных заголовка (например, отдельно в статье, и отдельно во врезке). Как все привыкли делать это? есть код заголовка:
    <h1 class="header">Заголовок</h1>
    И мы ставим эти заголовки в текст статьи и во врезки:
    <article class="article">
        <h1 class="header">Заголовок</h1>
        <p>Текст текст текст</p>
    </article>
    <aside class="incut">
        <h1 class="header">Заголовок</h1>
        <p>Текст текст текст</p>
    </aside>

    Тогда обычно мы используем каскад, чтобы стилизовать заголовок во врезке:
    .header {font-size: 2em; padding-bottom: 1.5em;}
    .incut .header {text-decoration: italic;}

    Всё хорошо, но теперь мы не можем просто перенести эти стили заголовка во врезке в другое место, потому что эти стили привязаны именно ко врезке (классу incut). Плюс, что ещё хуже, если к элементу привязано несколько различных стилей, образующихся подобными каскадными правилами, то перенести такой внешний вид в другое место становится очень трудоёмко. А также, из-за большей специфичности каскадных стилей, их сложнее "перебить" новым стилем.
    БЭМ предлагает отказаться от каскадных стилей и создавать отдельные стили-модификаторы:
    <article class="b-article">
        <h1 class="b-article__header">Заголовок</h1>
        <p>Текст текст текст</p>
    </article>
    <aside class="b-article b-article__incut">
        <h1 class="b-article__header b-article__header_incut">Заголовок</h1>
        <p>Текст текст текст</p>
    </aside>


    .b-article__header {font-size: 2em; padding-bottom: 1.5em;}
    .b-article__header_incut {text-decoration: italic;}


    Чем больше проект, тем выгоднее использование подобной методологии. На маленьких и средних проектах БЭМ может быть избыточен. Хотя вот была статья habrahabr.ru/company/yandex/blog/234905 про использование в маленьких проектах.

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

    Ну вот. Получилось не в двух словах, но менее подробно качественно описать БЭМ не получится, имхо.
    Ответ написан
    Комментировать
  • Как называются сайты с анимированным содержимым, которое меняется при скроллинге, и как такие сайты делают?

    Это называется параллакс-скроллинг.

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

    Petroveg
    @Petroveg
    Миром правят маленькие с#@&ки
    Всё построено на animation.

    Для картинок может использоваться SVG.
    Инфо где можно изучить SVG?

    Для сложной графики canvas.
    Какую книгу посоветуете по Canvas HTML5?

    Примеры
    Полно реализаций с анимацией как HTML, так и SVG.
    Ответ написан
    6 комментариев