• Есть ли способ понять изменились ли файлы в директории с прошлого раза?

    @sp-megamen Автор вопроса
    RecursiveDirectoryIterator помог, в 25 раз быстрее отработал в моем коде
    Ответ написан
    Комментировать
  • Как узнать какая часть PHP кода нагружает CPU на сервере?

    @Yan-s
    Гуглите "PHP профилирование"
    XDebug, XHprof, Blackfire ...

    А так же "нагрузочное тестирование"
    jmeter ...

    Для быстрой проверки коротких сценариев: делаем замеры, вырезаем кусок, повторяем замеры.
    Ответ написан
    8 комментариев
  • Верстка с нуля: какие основные этапы работы?

    Vlad_IT
    @Vlad_IT Куратор тега Вёрстка
    Front-end разработчик
    Использую vscode+webpack+pug+scss+бэм. Из физических инструментов, основной моник: lg ultrawide 29um69g, рядом прикручен моник от ноутбука повешенный вертикально, подключенный через универсальный скаллер.

    0) Запускаю Spotify :-)

    1) Произвожу установку всех необходимых модулей для сборки. В моем случае у меня набор конфигураций для webpack (отдельные файлы для pug, scss, static и.т.д., выбираю что нужно).

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

    3) Запускаю VS Code, открываю нужную папку.

    4) Пишу размету на Pug. Пишу с БЭМ, если встречаю повторяющийся блок, то открываю файл _mixins.pug, в который пишу миксины для повторяющихся блоков, например товаров, пунктов меню, каких-то блоков и.т.д. Pug умеет делать циклы, это ускоряет сильно.

    5) Когда HTML готов, начинаю делать каркас. Если дизайн сделан по сетке, определяю контейнеры, колонки, строки в свои классы (не пишу в html тучи классов аля col-md-6, а пишу в SCSS инклуды в нужные мне блоки, типа @include make-col(2) и.т.д.).

    6) Экспортирую картинки из Avocode. Очень делается просто, указываю папку и просто кликаю экспорт и ввожу название файла и расширения. Преимущественно для иконок использую svg, если нет svg, то ищу эту иконку в интернете (дизайнеры редко рисуют иконки сами, но зато любят вставлять их не в векторе). Если иконка простая, могу сам ее в inkscape обвести, ну и если нет, то экспортирую png в размере (благо авокод это позволяет, если конечно дизайнер не вставил в исходном маленьком размере). Когда есть контакт с дизайнером, трясу его, ибо растр это плохо для иконок.

    7) Пишу стили блоков из страницы. На этом этапе можно на втором монике параллельно смотреть футураму или
    Арчера :-) Но чаще на широком монике слева браузер, справа VS Code, а на втором монике Avocode (может меняться местами с браузером). Мысленно нарезаю страницу на блоки. Для каждого блока (БЭМ) создаю отдельный scss файл (кто-то даже для элемента создает, но мне лень), из него сразу выписываю все селекторы. Иногда могу сначала выписать все селекторы со страницы (но так лучше не делать, т.к. во время работы может потребоваться изменить что-то в разметке), но чаще для одного блока выполняю этот пункт и за ним сразу выполняю пункт 8, потом для нового блока опять 7 и 8 и.т.д.

    8) Пишу css код вместе с Avocode, у него беру нужные мне параметры (а он уже подставил в них переменные), и вставляю в мой код. И параллельно сверяю со скрином макета используя вот это расширение https://chrome.google.com/webstore/detail/perfectp...

    9) Пишу адаптив. Я не могу привыкнуть к методологии mobile-first, поэтому пишу всегда сначала полную версию сайта. Я понимаю, что это чревато всякими проблемами и это типа не модно, но мне норм.

    10) Медиа-запросы пишу прямо в блоках, для каждого блока/элемента/модификатора может быть отдельный медиа-запрос. Но для начала определяю breakpoint'ы для разных экранов (чтобы их не было сотни разных), если использую Bootstrap, то беру его breakpoint'ы.

    11) Добавляю анимашки. Даже если заказчик не просил отдельно (и если не указал отдельно, что нельзя), он все равно будет доволен, а с animate.css+onscreen.js это вообще работа 10 минут. Сложные анимации обговариваю отдельно, чтобы не сделать ненужную работу.

    11) Все снова сверяю, пишу скрипты где надо. Для слайдеров в 99% случаев подходит slick (с доработками конечно, но там хорошее API), для других случаев могу написать свой.

    12) Сдаю заказчику и жду ответа сидя на тостере/пикабу.

    Это чисто мой опыт, опыт фрилансера, не знаю, как делают другие и не могу на 100% утверждать что это 100% правильный способ. Я так и не смог заставить свой конфиг webpack правильно вставлять спрайты svg.
    Надеюсь чем-то поможет мой ответ.
    Ответ написан
    7 комментариев
  • Почему chrome игнорирует обработчик события?

    child.addEventListener('click', function(){
      alert("Привет, я - Child");
    })
    
    child.addEventListener('mousedown', function(){
      alert("Привет, я - Parent");
    })


    Читать.
    Ответ написан
    Комментировать
  • Как можно сократить код?

    @Arik
    <?= array_sum(array_map(function ($item) {
        return $item['invoice_status'] == 1 ? $item['invoice_ammount'] : 0;
    }, $invoices)) ?>
    Ответ написан
    Комментировать
  • Для переопределения css файл нужно подключать выше или ниже?

    rockon404
    @rockon404
    Frontend Developer
    Ниже.
    Ответ написан
    Комментировать
  • Почему ссылка замыкается на последний элемент экземпляра?

    rockon404
    @rockon404
    Frontend Developer
    Потому что у вас свойство elements в прототипе. Все экземпляры используют один и тот же объект elements. В итоге сколько экземпляров вы не создадите, во всех будет один и тот же объект this.opions.elements со свойством link переопределенным в конструкторе последнего экземпляра.
    Поосторожней с прототипами. В прототипы помимо функций выносят только статику, но никак не динамические значения, разве, что счетчики, но это очень узко применимый и редкий кейс.
    Ответ написан
    9 комментариев
  • Как эту задачу решить с помощью JS?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Самый простой способ, сравнить строку со строкой наоборот. Например было "строка", а вторая строка "акортс", и если они равны (нужно сравнивать в нижнем регистре toLowerCase), то слово палиндром, если нет, то не палиндром.
    UPD: Также можно обрезать пробелы, чтобы третий пример работал.
    Ответ написан
    1 комментарий
  • Какую схему мотивации можно предложить программисту, решающему сложные задачи (последняя линия поддержки, с задачей никто не смог справиться)?

    sim3x
    @sim3x
    0. Избегать состояния, когда в компании есть "звезда"
    0.1 Стараться, чтоб звезда научила 2+ человек до своего уровня или близкого у нему
    1. Спросить у человека, чем бы он хотел заниматься
    2. Отговорить персонал, который не понимает, что такое ИТ, от KPI
    Ответ написан
    1 комментарий
  • Какую схему мотивации можно предложить программисту, решающему сложные задачи (последняя линия поддержки, с задачей никто не смог справиться)?

    vvpoloskin
    @vvpoloskin
    Инженер связи
    У таких людей уже не почасовой KPI, а попроектный (решено столько-то проектов в квартал/год). А там свои м5тоды оценки.
    Ответ написан
    Комментировать
  • Откуда выскакивает бесконечность?

    @Codebaker
    Всё умею, всё могу!
    var m_1 = 0

    while (m_1 <= 10){
    if (m_1 === 3){
    m_1 = m_1 + 1; // вы забыли изменить значение и оно "замерзло" на 3
    continue;
    }
    console.log (m_1+1)
    m_1 = m_1 + 1
    }
    Ответ написан
    Комментировать
  • Как работают объекты?

    rockon404
    @rockon404
    Frontend Developer
    Потому что и a и b это ссылки на один и тот же объект.
    Тут подробнее.
    Ответ написан
    2 комментария
  • Можно ли получить имена аргументов функции в JS?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Аргументы хранятся в arguments.
    UPD:
    Имена аргументов можно получить костыльным методом. Тупо разбивая строку func.toString() Другого выхода вроде нет. Вот нагуглил такой код
    function getArgs(func) {
      // First match everything inside the function argument parens.
      var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];
     
      // Split the arguments string into an array comma delimited.
      return args.split(',').map(function(arg) {
        // Ensure no inline comments are parsed and trim the whitespace.
        return arg.replace(/\/\*.*\*\//, '').trim();
      }).filter(function(arg) {
        // Ensure no undefined values are added.
        return arg;
      });
    }
    // Пример
    function a(b,c) { }
    getArgs(a); // ['b', 'c']

    Можете объединить этот код с arguments, чтобы получать и имена и значения.
    function  Worker(name, surname, rate, days) {
        var names = getArgs(Worker);
        for (var i = 0; i < names.length; i++) {
           var name = names[i];
           var value = arguments[i];
           console.warn(name, value); // Выведет имя аргумента и его значение. 
           // Значение будет undefined если оно не будет передано 
        };
      }

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

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Вы немного не понимаете, как работают события (судя по этому, и предыдущему вопросу). Грубо говоря, метод document.addEventListener("keypress", checkKeyEvent) создает событие нажатия на клавишу клавиатуры, которое будет выполнять переданную функцию. Если нажать клавишу, то выполняется событие keypress, которое выполнит функцию checkKeyEvent, в которую передается объект события (а в нем и нажатая клавиша).
    Не нужно вызывать добавление события в цикле, вызовете один раз, и уже в функции checkKeyEvent делайте проверку.
    function checkKeyEvent(event) {
         // При нажатии на клавишу выполняется эта функция. Каждый раз.
    }
    document.addEventListener("keypress", checkKeyEvent);

    Ваш цикл while(counterLetters < levelText.length) { будет бесконечным, т.к. значение levelText или counterLetters не меняются. Даже если бы он не был вечен, он бы породил множество обработчиков событий, а нам нужно только одно. Циклы тут вообще не нужны. Вот такой код. Постарался подробно прокомментировать.
    let mistakesCounter = 0;
    // Это ваша getChar. Не знаю точно, такая же реализация, но это довольно известный код
    function getChar(event) {
        if (event.which == null) { // IE
            if (event.keyCode < 32) return null; // спец. символ
            return String.fromCharCode(event.keyCode)
        }
    
        if (event.which != 0 && event.charCode != 0) { // все кроме IE
            if (event.which < 32) return null; // спец. символ
            return String.fromCharCode(event.which); // остальные
        }
    
        return null; // спец. символ
    }
    
    function checkUsersKey(levelText) {
        var theEnd = false;
        var counterLetters = 0;
        var keyName;
    
        function checkKeyEvent(event) {
            // Делаем проверку, если текущий символ равен длинне символов...
            if (counterLetters >= levelText.length) {
                // То удаляем обработку события чтобы завершить печатанье.
                document.removeEventListener('keypress', checkKeyEvent);
                // Тут можете вывести сообщение пользователю, что задание закончено
                return;
            }
            keyName = getChar(event);
            // Это ваш код, проверяет, правильно ли пользователь ввел
            if (levelText[counterLetters] == keyName) {
                alert("Проверка 1 (значение true): работает"); //просто проверка
                counterLetters++;
                //тут будет код, который меняет css буквы
            } else if (keyName == null) {
                //do nothing
                alert("Проверка 2")
            } else {
                alert("Проверка 3 (else): работает");
                //тут будет код, оповещающий о том, что пользователь допустил ошибку
                mistakesCounter++;
            }
        }
        // Добавляем обработку события нажатия клавиши на функцию checkKeyEvent
        // Добавляем только один раз, она будет вызывать checkKeyEvent после каждого нажатия и удержания клавиши
        document.addEventListener("keypress", checkKeyEvent);
    }
    checkUsersKey("something");
    Ответ написан
    Комментировать
  • Каким способом можно отслеживать работу скрипта на момент наличия зависания/ошибки и прочего?

    pavelkarinin
    @pavelkarinin
    Full Stack Web Developer
    Если первый взгляд на архитектуру кода на клиенте не помог выявить проблему, то в том месте (в скрипте), в котором вы получаете данные с сервера (я так понимаю это после AJAX-запросов), в отладчике Chrome ставьте точку останова и отслеживайте поведение функций.
    Ответ написан
    Комментировать
  • Сбор бэкапов микротик?

    1. Описанный в вики способ с отправкой бекапа по email
    2. Через scp/ssh https://wiki.mikrotik.com/wiki/Using_SSH_for_syste... Для Windows: plink, pscp
    Ответ написан
    Комментировать
  • Хотите задать вопрос администрации Тостера?

    chelovekmuravei
    @chelovekmuravei
    \(-_-)/ раз два три четыре
    Иногда "Правильный ответ - решение" пишут в комментариях, под главным вопросом. Предлагаю дать возможность отметить это как "решение". Рядом с кнопкой "нравится" добавить "Отметить решением". Добавить зелёную галочку напротив этого комментария и напротив кнопки комментарии. И отмечать в списках вопросов как ответ.

    Дополнено. Второе предложение.
    Иногда вопросы могут иметь не совсем точный и прямой ответ, некое рассуждение и высказывание мысли по вопросу и так далее. Споры ответчиков. Предлагаю дать возможность отметить эту тему как решение, но не зеленой галочкой, а зеленой иконкой чата.
    Ответ написан
    1 комментарий
  • Хотите задать вопрос администрации Тостера?

    devspec
    @devspec
    Помогло? Отметь решением
    Вот тоже не нравится удаление вопросов с пометкой "нельзя дать однозначный ответ".
    Бывает, напишешь текста пару килобайт в попытке помочь человеку, постишь - а вопроса-то уже нет.
    Может, создать отдельный раздел и переносить такие вопросы туда?
    Ответ написан
    1 комментарий
  • JavaScript - добавление в объект из массива - почему обратный порядок?

    rockon404
    @rockon404
    Frontend Developer
    Где вы тут рекурсию увидели? У вас итерация по массиву идет с последнего элемента.
    Ответ написан
    4 комментария
  • Как поддерживается безопасность при выполнении команд через ssh?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Когда мы пытаемся выполнить команду (впринципе без разницы какую, пускай будет ls -la) (пункт 4)
    делаются ли какие-то дополнительные проверки на сервере с точки зрения безопасности?

    Нет. Пользователь зашедший по ssh ничем не отличается от обычного локального пользователя.

    Может кто-то подскажет какой алгоритм выполнения команды на удаленной машине? (При условии что мы уже подключились к серверу).

    Достаточно посмотреть в вывод команды pstree:
    ├─sshd(700)─┬─sshd(8208)───sshd(8214,jcmvbkbc)───bash(8215)───ssh(8231)
    │           └─sshd(8232)───sshd(8238,jcmvbkbc)───bash(8239)───pstree(8244)

    чтобы понять, что после подключения по ssh, sshd (демон ssh, процесс 8238) запускает login-shell (процесс 8239), который показывает приглашение ввода ($). Когда в нём набирается команда pstree (процесс 8244), шелл просто запускает эту команду.
    Ответ написан
    6 комментариев