Задать вопрос
  • Как в Webpack 4 сделать отдельный vendor для некоторых entry?

    @yakov_255
    После долгих поисков по интернету, написал свое решение:

    Проверено на версии Webpack 4.29

    добавить в начало файла webpack

    const SplitChunksPlugin = require("webpack/lib/optimize/SplitChunksPlugin");
    const filterByEntryPoint = (entry, test = /[\\/]node_modules[\\/]/) => {
        const recursiveIssuer = m => m.issuer ? recursiveIssuer(m.issuer) : m.name;
    
        return function (module, c) {
    
            const name = recursiveIssuer(module);
            if ((typeof entry === "string" && name === entry) ||
                (Array.isArray(entry) && entry.indexOf(name) !== -1)) {
                return SplitChunksPlugin.checkTest(test, module);
            }
            return false;
        }
    };



    optimization: {
            splitChunks: {
                cacheGroups: {
                    vendor: {
                        name: "vendor",
                        chunks: "all",
                        test: filterByEntryPoint("bundle")
                    },
                    admin_vendor: {
                        name: "vendor-login-offer",
                        chunks: "all",
                        test: filterByEntryPoint(["login","offer"])
                    }
                }
            }
        },


    скриншот BundleAnalyzerPlugin

    5d6e92feb0e7e662354880.jpeg

    Как видно на картинке, vendor для сайта содержит jquery
    А для админки jquery + vue
    Ответ написан
    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 приложения или способы взаимодействия с ним меняются почаще логики или как минимум в разные моменты времени. Адаптеры в этом случае служат промежуточным слоем, они ничего сами не делают, это "переводчики". Они просто переводят то, что сказано в запросе в язык понятный приложению и обратно.

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

    MaxDukov
    @MaxDukov
    впишусь в проект как SRE/DevOps.
    FROM clause
    WHERE clause
    SELECT clause
    GROUP BY clause
    HAVING clause
    ORDER BY clause
    Ответ написан
    1 комментарий
  • Domain model

    zizop
    @zizop
    По Фаулеру вам необходимо охватить поведение и свойства системы. Есть три варианта:
    • Простой — это классы моделей (ActiveRecord/Zend_Db/Doctrine_Record) инкапсулирующие поведение внутри себя.
    • Сложный — модели инкапсулируют данные и методы доступа к ним (Doctrine_Record) и базовое поведение ОДНОГО экземпляра модели, а сложные (групповые, операции бизнес-логики) операции реализуются в сервисном слое(стр.143 книги Архитектура корпоративных программных решений).
    • Самый сложный — почти вся бизнес-логика уходит в сервисы, которые становятся отчетливым программным интерфейсом API взаимодействия с предметной областью.

    В качестве реализации можете посмотреть на Doctrine_Record + Zend_Controller + самописные классы сервисов.
    Ответ написан
    Комментировать
  • Надо ли бросать исключение при приеме ошибочных (невалидных) данных?

    muhammad_97
    @muhammad_97
    PHP-разработчик
    Да, нужно, в большинстве случаев. Можно создать класс ValidationException, который принимает в конструкторе массив сообщений с ошибками и унаследовать его от класса Exception:

    class ValidationException extends Exception
    {
        /**
         * Validation error messages.
         * 
         * @var array
         */
        protected $errors = [];
    
        /**
         * Constructor.
         * 
         * @param array $errors
         */
        public function __construct($errors)
        {
            $this -> errors = $errors;
        }
    
        /* геттер для свойства $errors */
    }
    Ответ написан
    6 комментариев
  • Надо ли бросать исключение при приеме ошибочных (невалидных) данных?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Нужно ли бросать исключение, в случаях, когда данные не прошли валидацию?

    Если это валидатор - достаточно вернуть ErrorResponse объект с ошибкой.
    Если это вызов метода с не правильным данными - бросайте исключение.

    Или достаточно просто занести код и сообщение ошибки в массив errors и при выводе работать с ним?

    Не стоит, возвращайте сразу ErrorResponse.

    Полезна ли информация с Исключений при валидации во время дебагга?
    Да, так вы получаете stacktrace, помимо сообщения об ошибке.

    Работа с ошибочными данными может вызвать ошибку непосредственно при их обработке.

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

    Вот вам пример, Assert::assert - это штука из либы ko-ko-ko/assert
    public function loginAction(Request $request) : Response
    {
        try {
            $userName = $request->request->get('userName');
            $password = $request->request->get('password');
    
            Assert::assert($userName, 'userName')->match('/^[\a-z\d]{3,32}$/i');
            Assert::assert($password, 'password')->lengthBetween(6, 32);
        } catch (\Throwable $exception) {
            return new Response($exception->getMessage(), Response::HTTP_BAD_REQUEST);
        }
    
        try {
            // Your business logic here
            
            return Response();
        } catch (\Throwable $exception) {
            $this->get('logger')->error($exception->getMessage(), ['exception' => $exception]);
            return new Response('Could not login', Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }
    Ответ написан
    1 комментарий
  • Как правильно пользоваться chroot ?

    @inkvizitor68sl
    Linux-сисадмин с 8 летним стажем.
    Если вам просто запускать несколько инстансов демонов от разных пользователей - то chroot здесь не нужен. Нода прекрасно работает от разных пользователей (на разных портах, само собой).

    Про то, как сделать chroot я здесь - https://debian.pro/440 - писал.
    Если паранойя грызет, то вот - https://debian.pro/1237

    Вот только вы не написали, как вы её вообще запускать собираетесь.
    Можно нечто такое почитать - https://www.exratione.com/2011/07/running-a-nodejs...
    Но там либо init-скрипт под каждый инстанс писать (пользователей, пути менять), либо его переписывать, чтобы он в зависимости от имени пользователя, запустившего скрипт, шел в нужный каталог.

    В простейшем же виде Node.JS (одним тредом, емнип) запускается так:
    npm app
    или
    node/nodejs чтото там.

    Соответственно, если команда npm app, то запускать из консоли (до первого ребута) можно так:
    disown npm app; echo $!
    И потом делать kill на циферку, чтобы остановить.

    Это всё актуально, если вы пользователей по ssh пускать будете.
    Ответ написан
    Комментировать
  • Как включить подсветку клавиатуры?

    @Nikon_NLG
    В /etc/default/grub
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_osi="
    попробуйте указать.
    И проверьте что модуль asus_nb_wmi загружен
    Ответ написан
    7 комментариев
  • Чем отличаются JSON от JSONB?

    @curator
    JSONB — двоичная разновидность формата JSON, у которой пробелы удаляются, сортировка объектов не сохраняется, вместо этого они хранятся наиболее оптимальным образом, и сохраняется только последнее значение для ключей-дубликатов. JSONB обычно является предпочтительным форматом, поскольку требует меньше места для объектов, может быть проиндексирован и обрабатывается быстрее, так как не требует повторного синтаксического анализа.

    Источник: https://habrahabr.ru/post/282764/
    Ответ написан
    1 комментарий
  • Как убрать (или хотя бы локализовать) ошибку Error: ENOENT: no such file or directory `some_file_name.ts___jb_tmp___`?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    jb_tmp, это, очевидно, JetBrains temp-файл:) А проблема в том, что у вас вотчер пытается смотреть за всеми файлами:
    watch('src/ts/**/**', function(event, cb) {
    Исправьте путь на 'src/ts/**/*.ts', должно помочь.
    Ответ написан
    2 комментария
  • Какую стратегию настройки ядра принять новичку в Gentoo?

    baragoon
    @baragoon
    Люблю попяченое щачло
    emerge sys-kernel/gentoo-sources
    emerge sys-kernel/genkernel
    zcat /proc/config.gz >> /usr/src/linux/myconfig
    genkernel all --menuconfig
    load your config from file myconfig
    собери для начала по дефолту, потом по немногу будешь разбираться с тем что нужно, а что нет.
    Ответ написан
    Комментировать
  • Какие существуют способы оптимизации часто идуших MySQL запросов на выборку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сферический вопрос в вакууме, причём без возможности уточнения, поскольку «проект был».
    «медленные запросы» — насколько медленные?
    «сайт с посещаемостью» — с какой посещаемостью?
    «потому что запросы на поиск» — так может, это поиск вынести отдельно на Сфинкс?

    То есть, выяснить, что там — кривая настройка сервера mysql, кивые таблицы или кривые запросы — не представляется возможным.
    Но вопрос, как всегда, формируется в самом общем виде — «где тот волшебный гвоздь, по которому 1 раз ударить — и всё сразу залетает?»

    Ну ок. В самом общем виде оптимизация запросов (неважно — частых или нечастых) заключается в оптимизации запросов.
    Оптимизированный запрос выполняется (допустим) 0.001 секунды. То есть, БД может обслужить 60 тысяч одновременно сидящих пользователей.

    Берем EXPLAIN и смотрим. Если он говорит, что с запросом все окей, просматриваем ровно столько записей, сколько нужно — 5-10, но все равно запрос исполняется медленно (насколько конкретно медленно — в секундах?) то смотрим, SHOW ENGINE [engine] STATUS. Там уже надо опять же смотреть по месту, решать, чего серверу не хватает.

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

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

    Кэширование, как и любая другая денормализация данных, всегда чревато проблемами и неудобствами. И это должно быть средство последней надежды, когда всё остальное уже сделано.
    Ответ написан
    1 комментарий
  • Есть ли более производительные аналоги Phonegap?

    AMar4enko
    @AMar4enko
    Боюсь вас разочаровать, но PhoneGap никакого отношения к производительности не имеет.
    Это всего лишь мостик между функциональностью, доступной в native-режиме конкретной платформы, и JavaScript-ом, исполняемым в in-app браузере.
    Ваше приложение работает так быстро, как быстро работает реализация JavaScript на конкретной платформе в конкретном браузере и также скорость зависит от того, какую именно функциональность HTML5 использует ваше приложение.

    Поэтому ваша проблема не в PhoneGap. Она в Android+HTML5, увы.

    P.S. Я знаю о чем говорю — разрабатывал приложение под PhoneGap на Sencha Touch. То, что вполне нормально работает на iOS, на Андроиде может быть катастрофически неповоротливо — я тестировал и там и там.
    Ответ написан
    Комментировать
  • MySQL запрос из двух таблиц

    seriyPS
    @seriyPS
    Надеюсь эту картинку вы знаете?



    Допустим, таблица A это SELECT * FROM games, а таблица B это SELECT * FROM uploaded_games WHERE user_id = ?.

    Т.е. вам нужно из таблицы A вычесть таблицу B (в терминах теории множеств). На картинке это левый столбец, второй сверху.

    SELECT *
    FROM games as A
    LEFT JOIN uploaded_games as B ON (A.game_id = B.game_id)
    WHERE B.game_id is NULL AND B.user_id = ?
    


    Можно записать более наглядно, но, скорее всего, MySQL его не соптимизирует эффективно

    SELECT *
    FROM games
    WHERE game_id NOT IN (
      SELECT game_id FROM uploaded_games WHERE user_id = ?
    )
    
    Ответ написан
    Комментировать
  • Стандарт в обозначении городов при межсистемном обмене данными?

    @mpetrunin Автор вопроса
    Решил использовать коды ИАТА:
    betravel.ru/iata-country-list.php
    Ответ написан
    Комментировать
  • Стандарт в обозначении городов при межсистемном обмене данными?

    jumbastic
    @jumbastic
    Можно использовать систему WOEID которую предлагает Yahoo и использует Twitter
    en.wikipedia.org/wiki/WOEID
    developer.yahoo.com/geo/placemaker/
    habrahabr.ru/blogs/webdev/25315/
    Ответ написан
    Комментировать