• Как сделать динамическое логирование в Laravel?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Что либо писать руками - это спагетти.
    Суть ларавеля в том, что все делается автоматом

    В данном случае делается middleware,

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use \Illuminate\Http\Request;
    
    class UserActivityLoggerMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle(Request $request, Closure $next)
        {
            // тут пишешь свое логирование
           $user_id = $request->user()->id;
           $action = $request->route()->getName();
            // обяязательная строчка
            return $next($request);
        }
    }

    регистрируешь в Kernel.php
    'logger' => \App\Http\Middleware\UserActivityLoggerMiddleware::class,


    и рауты пользователей заключаешь в вызов этой мидлвари

    Route::group(['middleware' => ['logger']], function()
    {
    }
    Ответ написан
    7 комментариев
  • Как в phpstorm заново открыть боковое окно remote host?

    zorro76
    @zorro76
    Tools - Deployment - Browse Remote Host
    Ответ написан
    Комментировать
  • Как увеличить время сессии пользователя?

    @SvetlanaKasjanova Автор вопроса
    Да, стояли ранее галочки.
    Также увеличили значение по умолчанию (время хранения авторизации) глобально в PHP, через значение параметра session.gc_maxlifetime (в настройках PHP, файл php.ini)
    Ответ написан
    Комментировать
  • Как в текстовом редакторе vim выделять текст?

    nonlux
    @nonlux
    Попробую обобщить, помню свою панику когда первый раз открыл vim

    Выриант 1:
    - Жмем v (vim переходит visual mode, выделяет все от текущей позиции курсора)
    - двигаем курсор ( можно стрелочками, можно hjkl, можно web%$ как угодно)
    - нажимаем y

    Вариант 2:
    Если речь идет о строках, надо решить эту проблему
    Просто я допустим захлотел скопировать 10, а скопировал 11, как без выделения я это пойму без вставки, наверное что никак

    - набираем :set relativenumber
    - определяем сколько строк надо скопировать по нумерации строк слева (допустим 43)
    - нажимаем y43y

    Профит
    P.S. копировать можно не только строки
    можно слова yw
    можно от текущей позиции до конца строки y$
    можно от начала блока до его конца y%

    Вариантов много и каждый д%#@, как хочет.
    Ответ написан
    5 комментариев
  • Из чего состоит окружение продвинутого php разработчика?

    nonlux
    @nonlux
    Поправил ответ, так будет логичнее.
    Ниже приведены инструменты, которые использую лично я и причины почему.

    1. docker-окружение
    (в 90% случаев для веб-разработки достаточно php -S 0.0.0.0:8000)
    виртуальные машину становятся нужны:
    - когда надоест переустанавливать хост-систему из-за обилия хлама
    - когда работаешь с несколькими проектами имеющие специфические (разные) настройки окружения(php, web-сервер, база)
    - когда надоест решать проблемы в команде из-за того что по разному настроено окружение

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

    3. composer - пакетный менеджер для php
    Нужно, когда лениво помнить все ссылки на все php библиотеки, самому качать их, подключать в автозагрузку

    4. behat + phpspec
    Тесты нужны:
    - когда хочется почувствовать себя безопасности и для сладко спать ночь, забыв о кошмарах о сломанном коде
    - когда в production все снова сломалось
    - когда ты написал одну новую фичу, а сломал три

    5. zsh
    Хорошей консолью приятно пользоваться, работа идет быстрее.
    Консоль есть жизнь, жизнь есть shell.

    6. tmux
    Мало одно окошка в консоли, тогда tmux идет к вам.
    В качестве бонуса получите возможность парного программирования совершенно бесплатно

    7. tmuxinator
    Надоело каждый раз открывать кучу окон для tmux, попробуйте его )
    8. vim
    - Потянуло на что-нибудь необычное?
    - Хочется эффективнее писать код ?
    Ну что открыли vim? В первый раз? Поздравляю закрыть вы его не сможете )
    Вызывает зависимость при частом потреблении


    9. continuous integration сервер
    Вообще ci сервер это одушевленная машина. Это твой тамагочи, ты кормишь его хорошим кодом, он радуется и ты видишь приятный зеленый огонек. Если ты дал с код от скажет что не вкусно. Ну а если ты ему, что гнилое он будет долго на тебя орать плохими словами. Со временем он растет и учится делать более серьезные вещи, и начнет помогать тебе:
    Его скилы:
    - он может сам выполнить 10 минутные тесты
    - подготовить и опубликовать проект
    - рассказать о твоем коде, даже то что ты не знаешь
    Он легко обучается и ты легко сможешь научить его удивительным вещам.

    10. куча линтеров на pre commit hook
    Чтобы ci не кормить плохими продуктами, хорошо бы проверять что ты сделал до отправки на сервер. Что бы не забыть это сделать git сам работу.

    11. gulp
    gulp - это еще один твой помощник.
    как если использовать, как watcher файлов + livepreview, можно забыть о F5 в браузере

    12. bower
    Тоже что и composer но для управления ассетами. Это я о всяких jQuery и Bootstrap

    666. Линукс
    Даже если не хочется ставить как хост-систему, его все равно надо знать. Ваш код будет работать на нем )
    Ответ написан
    16 комментариев
  • Как запускать локальное приложения в битрикс24 каждые n минут?

    @humoured
    Вы всё на свете найдёте в коробке с карандашами
    2 комментария
  • Как в main.ui.filter применить фильтр через JS?

    IgorVader
    @IgorVader
    let filter = BX.Main.filterManager.getById('ИД ФИЛЬТРА');
      let values = filter.getFilterFieldsValues();
      
       values['НАЗВАНИЕ ПОЛЯ'] = 'Значение для фильтра ';
    
      filter.getApi().setFields(values);
      filter.getApi().apply();
    Ответ написан
    1 комментарий
  • Как сделать постраничную навигацию в Битрикс в своем компоненте?

    @jasper-blondin
    Если взять стандартный компонент news.list - там черт ногу словим

    Смотрите компонент news.line. Он простой и содержит разбиение на порции.

    По самой навигации, здесь все написано (ядро D7): https://dev.1c-bitrix.ru/learning/course/index.php...

    Если по какой-то причине Вам нужен старый стиль:
    $arFilter = Array("IBLOCK_ID" => 22, "ACTIVE_DATE" => "Y", "ACTIVE" => "Y");
    $res = CIBlockElement::GetList(Array(), $arFilter, false, array("nPageSize" => 20), Array());
    $res->NavStart(0);
    while ($ob = $res->GetNextElement()) {
    	$product_fields_list = $ob->GetFields();
    	$product_props_list = $ob->GetProperties();
    	
    	echo "<pre>";
    	print_r($product_fields_list);
    	echo "</pre>";
    }
    
    $navStr = $res->GetPageNavStringEx($navComponentObject, "Страницы:", ".default");
    echo $navStr;
    Ответ написан
    Комментировать
  • Как подключается ядро в модуль?

    @alexprowars
    \CModule::includeModule("sale"); или \Bitrix\Main\Loader::includeModule('sale');
    Ответ написан
    6 комментариев
  • Как во flex сделать одинаковую высоту блоков на всех строках при использовании wrap?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Гриды заюзать
    Ответ написан
    Комментировать
  • Не добавляются компоненты на страницу через визуальный редактор в 1с Битрикс?

    Logic87
    @Logic87
    Программист/администратор сайтов на 1С-Битрикс.
    Проверьте не добавляете ли вы компонент в режиме кода.
    Переключите в визуальном редакторе "визуальный вид".
    Ответ написан
    4 комментария
  • Лучший клиент для работы по FTP/SFTP для ubuntu?

    shambler81
    @shambler81 Куратор тега Linux
    зачем вам вообще клиент?
    никогда не понимал зачем для линукса он нужен вообще?
    у тебя в навигаторе есть кнопочка подключить фтп и пользоваться им как обычной файловой системой.
    если вы работаете часто тоо можно создать закладки.
    Если прям совсем бесшовный ( я так делаю)
    монтирую их
    https://help.ubuntu.ru/wiki/%D0%BC%D0%BE%D0%BD%D1%...

    вопрос зачем вам сторонние решения если сама ос ( в отличие от винды)
    может напрямую работать через этот протокол ?
    Про sftp я вообще помолчу
    Ответ написан
  • Как пользоваться virtualenv в IDE PyCharm?

    nextel
    @nextel
    ненавижу javascript
    Здравствуйте, по шагам, открываем ИДЕ, жмем на ключь рожковый с шестенеркной, пояляется то что на кратинке
    6f1cb45135024d50b89ef3e3f7c2783b.png
    далее жмем Configure interpreters
    далее все просто появляется вот такое окно
    92ba6c39c4ce4a938ac641dfd237d865.png
    оттуда можно сразу постаивть сетуптулс, так же создать окружение. Для создания окружения он берет либо сторонний венв если ветка 2.х либо венв версии интерпритатора.
    с этого окна ксатти можно в вирт окружение поставить пакеты из пайпай
    Ответ написан
    Комментировать
  • JavaScript: объясните return в конструкторе

    apangin
    @apangin
    Для простоты понимания примеры можно сократить до следующих.
    Первый: function Test() { this.qqq = a; }
    Второй: function Test() { return {qqq: 'a'}; }

    Теперь обратимся к спецификации ECMA-262, пункт 13.2.2. [[Construct]]

    When the [[Construct]] property for a Function object F is called, the following steps are taken:
    1. Create a new native ECMAscript object.
    2. Set the [[Class]] property of Result(1) to «Object».
    3. Get the value of the prototype property of the F.
    4. If Result(3) is an object, set the [[Prototype]] property of Result(1) to Result(3).
    5. If Result(3) is not an object, set the [[Prototype]] property of Result(1) to the original Object prototype object as described in 15.2.3.1.
    6. Invoke the [[Call]] property of F, providing Result(1) as the this value and providing the argument list passed into [[Construct]] as the argument values.
    7. If Type(Result(6)) is Object then return Result(6).
    8. Return Result(1).

    Разгадка кроется в двух последних строках: если функция возвращает объект, то результатом работы конструктора считается этот объект, если же функция возвращает что-либо другое (либо ничего не возвращает), результатом работы конструктора считается новый объект, созданный на шаге 1.
    Ответ написан
    1 комментарий
  • Что такое end-to-end тестирование?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Понятие еnd-to-end обозначает всего-навсего классификацию тестов по уровню, на котором тестируется система, и, само по себе, ничего не говорит ни о том, какие конкретно должны быть эти тесты, ни о том, какую роль они играют в общей стратегии обеспечения/проверки качества и, также, не является методикой тестирования. (Методика - это совсем другое понятие.)

    Для понимания сути этого понятия хорошо сравнить его с модульным ("нижний" уровень) и интеграционным ("средний") тестированием на каком-нибудь конкретном примере. Давайте рассмотрим некий сферический webshop в вакууме. Предположим, в нем есть 50 классов и для большинства из них написаны модульные тесты. Они проверяют исключительно функционал конкретного модуля (чаще всего, класса), т.е. тот, что зависит только от самого модуля и ни от чего чего более. Потом есть интеграционные тесты. Они проверяют корректность работы отдельных "модулей", если их собрать вместе согласно архитектурe. Например, работает ли правильно "Корзина", состоящая, в свою очередь, из 10 классов (предварительно проверенных модульными тестами), или "Корзина", подключенная к "Вебморде" и т.д. Где-то повыше в этой иерархии есть такие интеграционные тесты, которые проверяют конкретный функционал всей системы. Например, отправляется ли юзеру мейлом копия оплаченного заказа...

    И вот тут начинается самое интересное для понимания того, что такое end-to-end тестирование! Можно представить себе тест, проверяющий, что соответствующий мейл генерируется и сбрасывается SMTP серверу. Если SMTP сервер не рассматривать, как часть разрабатываемой системы, то этот тест вполне можно назвать end-to-end тестом (послали кучку HTTP запросов через "Вебморду" и проверили сброс мыла на SMTP - все зашибись!). Однако, если настройки и эксплуатация SMTP сервера - часть проекта (например, заказана разработка webshop "под ключ"), может оказаться, что это мыло будет отфильтровано каким-нибудь спам-фильтром, превысит лимит почтового ящика пользователя... короче, не дойдет до него. Тогда этот же самый тест уже нельзя считать end-to-end, а нужно бы было написать тест, проверяющий приход мыла в POP3/IMAP ящик. (Опять же, если это действительно нужно! Ибо, в зависимости от конкретных функциональных и нефункциональных требований, архитектор и QA инженер вполне могут найти возможность обеспечить адекватный контроль качества и без такого теста.)

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

    Tiendil
    @Tiendil
    Разработчик ПО.
    Преимущество у динамически типизированных языков, конечно, не в синтаксисе, а в семантике.

    Благодаря определению типов во время исполнения программы сильно облегчается метапрограммирование. Очень сильно облегчается. Оно, в свою очередь, упрощает всю остальную работу.

    Благодаря гибкости кода в рантайме (см. тот же duck typing) и интроспекции (анализ свойств объектов и кода) получается на порядок проще и быстрее писать универсальные алгоритмы и конструкции вроде декораторов, всяческих ORM и подобных вещей. Это сильно упрощает интерфейсы библиотек, что в совокупности ведёт к более простому коду и к плавной кривой обучения новичков.

    Из моей практики (5 лет писал на C++, потом столько же на Python, эти сроки немного пересекались) могу сказать, что с точки зрения ошибок типизации (а собственно их и ставят в недостаток динамически типизированным языкам) разница минимальна — они очень редки и все отлавливаются автоматическими тестами. Конечно, если у вас руки откуда надо растут, а если не откуда надо, то эти ошибки будут далеко не самой большой проблемой. Поэтому в области разработки софта, не требовательного к производительности, такие языки рулят.

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

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

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

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Забавно читать ответы.

    Когда читал Философию Java, автор высоко оценивал python. И не с проста. Как и Java, у Python свои плюсы.

    По производительности что Python, то и Java примерно равны. Python имеет "нативный" byte-code, если так можно выразиться (не смотря на то, что его портировали и на CIL, и на JVM, и на сам Python). Так что здесь паритет.

    По удобству зависит от проекта и задач. Если цель - сделать как можно быстрее, то Python явно удобнее. Ибо можно набросать прототип в интерактиве, немного подправить его и вауля - проект "готов". Если цель надёжность - наш выбор Java: статическая типизация и компилируемость выявляет сотни ошибок ещё до запуска приложения.

    Стоит заметить, что вэб в Java развит очень сильно. Причём настолько, что он просочился до клиентских вэб-приложений (и умер лет 10 назад), хотя backend всё равно в разы сильнее. Что это значит? Это значит, что для Java есть множество отличных фреймворков, ориентированных на web. Каноничная реализация ООП позволяет использовать паттерны банды четырёх "из коробки". Интерфейсы, если ими уметь пользоваться, решают. Python же не создавался как web-движок, а создавался просто как удобный инструмент для быстрого программирования как прикладных, так и теоретических задач. В этом помогает всё - и сахарный синтаксис, и крутейшие итераторы, и пресловутый интерактивный режим, и невероятные slice'ы, и неплохие лямбды, и красивый код. RoR, если говорить о языке фреймворка, так же сильно похож на Python, но магии в нём много больше. Но Python-приложения тяжко отлаживать. Можно пару лет вести баг, который окажется из-за того, что мы не проверили возможность преобразования объекта к строке в аргументах. Динамическая типизация, причём очень хардовая из всех, наверное, это и дар и проклятие.

    Собственно, если вопрос стоит "стоит ли изучать", то да, конечно стоит. Как и Java, Python - мультипарадигмальный язык, и те практики, которые Вы изучите в Python несомненно улучшат код в Java.
    Ответ написан
    7 комментариев