Задать вопрос
  • Не приходит в голову алгоритм лучше. Как сделать лучше?

    Lynn
    @Lynn
    nginx, js, css
    Откройте для себя циклы.
    https://doka.guide/js/loop/
    for (let i = 0; i < clickCount - 1; i++) {
        elementstypeWorkFirst[i].innerHTML = '';
    }
    Ответ написан
    Комментировать
  • Какую панель управления хостингом на VPS выбрать в 2021?

    Я перепробовал множество панелей, и имел разный опыт эксплуатации и впечатлений оставленных после использования.

    Cyberpanel - веб-дизайн панели очень плох, но с точки зрения принципов построения панели для сервера который хостит разные сайты - этой панели нет равных среди всех опробованных мною панелей описанных выше. И open_basedir, и разграничение каждого сайта под отдельным пользователем, и приятная структура хранения сайтов аля: /home/пользователь/public_html,log,backup
    И приятные бекапы, и возможность подкрутить всякие штуки по типу Lets Encrypt без проблем, либо ограничение доступа, либо WAF из коробки, либо файловый менеджер, и так далее.

    Но за несколько лет меня эта панель достала. Во-первых, она крайне забагована. Её неоднократно ломали, и ломали мои хобби проекты (статичные сайты). Во вторых - у них через версию баги с обновлениями, которые полностью ломают всю панель и возможность входа внутрь. Причем ломается напрочь без возможности починить, только чистая переустановка. Неоднократно сообщал об этом - никакой помощи нет. В третьих - это баги OpenLiteSpeed, либо баги конфигурации веб-сервера. Когда за 1 месяц собирается сессий на 19 гигов в папке lsphp - это вообще не ок, что аж сервер крашит и inodes все заняты. И это один из багов. Были баги с их кешированием которое включено по умолчанию, и приходилось принудительно в каждом .htaccess отключать для доменов. И баги с бекапами были. Т.е. по принципу созданию в абстрактном понимании - панель топ, классная, молодцы, очень хорошо сделано в плане архитектуры. Но вот баги дурацкие, просто выбешивают.
    Нравилось с ols что все работало относительно хорошо с любым проектом, любыми реврайтами, кешированиями, разными версиями php, и занимало существенно меньше ресурсов чем апач, либо апач и nginx. Но увы - порекомендовать именно эту панель не могу. Я не знаю что должно произойти что бы её допили до нормального состояния.

    VestaCP - долго пользовался этим огрызком. Просто дичайшее отвращение к их темплейтам и конфигам веб-серверов. Какой идиот это писал? И под какие нужды? Огромное количество раз ломали эту панель как в общем, так и лично мне. Но визуально и в плане юзабилити одна из самых беспроблемных и простых и удобных панелей на рынке. В 2021 она мертва. Последние какие-то подвижки и обновления и работа над панелью завершились в году так 2017-2018. Всё остальное делают когда есть свободное время.

    HestiaCP - кусок г. базирующийся на VestaCP, после того как последние забили на разработку.
    Автор этой панели не вытягивает количество проблем и багов в этой панеле и сообщество. Не компетентен, плохо тестирует. Но с точки зрения безопасности в плане админки - он хорошо поработал. Всё остальное - очень плохо. Может даже инсталятор не установить с первого раза панель. Не полноценно поддерживаются разные конфиги установки без апача например на nginx+php-fpm. Крайне убогие наследуемые шаблоны от весты со всеми косяками и проблемами.
    Регулярные баги и проблемы с LetsEncrypt. Жрёт очень много озу. Но визуально хорошо сделано в плане внешнего вида. Под капотом - бред и анархия, но есть куда хуже панельки.
    Этой панели так же как и cyberpanel не хватает крепкого сообщества и волонтеров по допилу панели до нужной кондиции. Увы - очень сырая. Но критических багов как в CyberPanel среди веб-компонентов не было выявлено. Регулярно нужно что-то допиливать в панели.

    FastPanel - лично для меня это какое-то недоразумение. Снова принципы и архитектура вроде хорошая, но все как-то сыро, и иннертно.

    DirectAdmin - скорее мертв, чем жив. Хоть и используется массово на хостерах, но с безопасностью у этой панели швах полный. Если речь идет о шаред хостинге, то взлом одного сайта почти с 100% вероятностью повлечет за собой взлом всех сайтов, так как никаких ограничений в рамках одного аккаунта в плане ACL (разного рода) у панели нет. Из коробки куча абсурда и дегенеративных решений аля блок mysql порта, либо блок других портов через csf. Либо лимиты на размеров файлов. Ранее года 2-3 назад панель была полным днищем. Но после изменений ценовой политики cPanel - нарастили базу, и приняли пулреквесты и предложения, что бы как-то перехватить поток пользователей которые начали мигрировать на другие панели. Я не могу сказать что DirectAdmin в моем личном опыте эксплуатации была хорошей панелью. Мне не понравился опыт взаимодействия, и озвученные выше проблемы особенно с php. В 2021 году интерфейс панели и фичи панели наконец-то удобно расположили, и улучшили для удобства пользователей. Но я бы на этой панеле не сидел. Ну не нравится мне такой подход к панелям в плане архитектуры. Я считаю его не безопасным, убогим.

    ispconfig - тяжеловесный монстр со скрытыми платежами аля: "купить нашу документацию, что бы нормально все настроить, иначе из коробки будут неприятные проблемы с производительностью сервера". Пользовался - не зашло вообще ниразу. Не плохая, особых багов не было замечено, но тяжеловесная панель.

    centminmod - это даже не панель, это скрипты, и автор eva2000 - очень хорошо поработал над ними, и конфигами nginx, myslq, php, и так далее. Это пример того, как должно быть в любой панели из коробки. Конфиги хорошо отточены, допилены, протестированы, и разраб испытывает страсть к серверам и своей панельке, но у него не хватает скилов создать веб-панельку, которой ой как не хватает этому проекту. Одна из лучших панелей в плане стабильности работы и конфигов серверов, из списка озвученного выше. Но не удобная в использовании. Но конфиги - прям конфетка. Но не для мультисайта вообще ниразу, хоть и опции есть. Эта панель для меня некий фундамент, который до меня настроили хорошо, и дали на эксплуатацию. Ручками придется поработать немного в зависимости от веб-приложения (если специфичное), но не так много как в весте. Обычно пару строк измененний в конфигах, не более. Но не работает нормально с множеством сайтов на одном сервере.

    CentOS Web Panel - я вообще не понял что это такое, и зачем оно нужно, и почему оно имеет какую-то популярность.

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

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

    Одна из самых удобных для меня и простых панелей были: cPanel, Plesk, ISPManager но все платные, и дорогие.
    Сейчас сижу на самописных скриптах и своих nginx конфигах. Ибо достало каждую панель ручками допиливать, либо получать уведомления что сайт не работает, потому что баг в модуле очередной панели.

    И да, в моем "ответе" опыт с 2012 по 2021 год.
    И все панели выше я проверял в 2021 году так же, и у кого-то были существенные изменения, а у кого-то вообще их нет. Т.е. отзыв актуален, но субъективен. Возможно у кого-то был другой опыт, но мой таков, каков он есть.
    Ответ написан
    5 комментариев
  • Почему дочерние элементы странно удаляются?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    output.children имеет тип HTMLCollection.
    An HTMLCollection in the HTML DOM is live; it is automatically updated when the underlying document is changed.

    Таким образом, при удалении, например, элемента с индексом 0, коллекция перестраивается, все элементы смещаются, элемент, имевший индекс 1, получает индекс 0 и остаётся в списке, так как следующим вы удаляете элемент с идексом 1 (изначально 2).
    Решить можно несколькими способами:
    --let childrens = output.children;
    ++let childrens = [...output.children];

    --for(let i = 0; i < childrens.length; i++){
    --  childrens[i].remove();
    ++while (childrens.length > 0) {
    ++  childrens[0].remove();

    --let childrens = output.children;
    --for(let i = 0; i < childrens.length; i++){
    --  childrens[i].remove();
    --}
    ++output.innerHTML = '';
    Ответ написан
    Комментировать
  • Почему дочерние элементы странно удаляются?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    children – «живая» коллекция. Поэтому цикл
    for (let i = 0; i < childrens.length; i++){
      childrens[i].remove();
    }
    удаляет через одного.

    Вот, например, вариант:
    while (childrens.length) {
      childrens[0].remove();
    }
    Ответ написан
    4 комментария
  • Как задать несколько transition для разных CSS-свойств?

    aliencash
    @aliencash
    Партизан
    Как вы пробовали через запятую? У меня все работает codepen.io/aliencash/pen/LRkjxR
    Ответ написан
    1 комментарий
  • Как просмотреть локальный сайт на телефоне?

    squadbrodyaga
    @squadbrodyaga
    帆は風を変えた
    Если сайт запущен локально, а не просто HTML страница в браузере, то можно узнать ip своего компьютера, а потом на телефоне написать айпи:порт.
    Пример: 192.168.0.103:3000
    Ответ написан
  • Максимальное число в массиве, как правильнее?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Конечно же, второй вариант: list[0].
    Доказательство: найти максимум в массиве отрицательных чисел.

    А быстрее встроенным методом Math.max():
    Math.max.apply(null, list)
    Ответ написан
    2 комментария
  • Альтернатива document.execCommand?

    @Hi-Pyncho
    Можно использовать Clipboard API, так как в самой MDN предупреждают, что лучше избегать использование document.execCommand

    Например, у тебя есть кнопка "Скопировать", которая скопирует содержимое нужного элемента в буфер обмена.

    const copyButton = document.querySelector('.button')


    Вешаешь обработчик события на эту кнопку и через объект Navigator записываешь в Clipboard нужный фрагмент текста

    copyButton.addEventListener('click', () => {
      window.navigator.clipboard.writeText(input.value)
    })


    И теперь нужный текст в буфере обмена
    Ответ написан
    1 комментарий
  • Удалить из массива объект добавленный с помощью this?

    Lynn
    @Lynn
    nginx, js, css
    Найти себя и удалить:
    window.popUpers.splice(window.popUpers.indexOf(this), 1)


    Только это приведёт к смещению индексов, так что если у вас какой-то код зачем-то запоминал позиции элементов в этом массиве, то он будет глючить.
    Ответ написан
    3 комментария
  • Удалить из массива объект добавленный с помощью this?

    twobomb
    @twobomb
    close() {
            // удалить объект из массива используя this или ещё другим способом без перебора уникальных идентификаторов
       let inx =    window.popUpers.indexOf(this)
    if (inx > -1) 
    window.popUpers.splice(inx , 1)
       }
    Ответ написан
    1 комментарий
  • Как используя addEventListener передать параметр в функцию?

    @alexeyproject
    // Вариант 1. Привязываем контекст и первые по порядку параметры
    function someFunk(a, b, event) {
    	console.log(a, b, event);
    }
    element.addEventListener('click', someFunk.bind(null, 1, 2));
    
    // Вариант 2. Используем интерфейс EventListener
    function someFunk(event) {
    	console.log(this.a, this.b, event);
    }
    element.addEventListener('click', {handleEvent: someFunk, a: 1, b: 2});
    Ответ написан
    5 комментариев
  • Многоязычный сайт php twig - как лучше реализовать?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если говорить про Twig, а не просто вспоминать былые денёчки, как в пятом классе на коленке переводил мамкин сайт для бижутерии, то для переводов в нем используется фильтр.

    То есть берется готовый или делается кастомный фильтр. Который и занимается поиском соответствия для переводимой фразы. Которая выводится, как {{ message|trans }}

    Вот пример реализации такого фильтра в Симфони

    Если же говорить про переводы вообще, то хранить как угодно, но при деплое писать в массив в пхп файл. Который лежит себе спокойно в опкеше, и подключается тем самым фильтром.
    Ответ написан
    Комментировать
  • Многоязычный сайт php twig - как лучше реализовать?

    @artem-dainov
    Php, java, js. Boot spring, jquery, git
    Я всегда держу в файлах ini ключи для слов.
    У меня есть папка lang_pack
    В ней имеются подкаталоги de,ru,en,uk и тд.
    В каждой из этих папок имеются файлы .ini в которых есть ключи для слов
    title=Мой сайт
    link_index=Главная страница
    И так далее.
    Кстати, я делаю для каждого модуля отдельный такой файл.
    А на самом сайте использую что-то подобное.

    <?php
    echo "<a href='/'>".$main->lang('link_index','head_menu.ini')."</a>";
    ?>
    Ответ написан
  • Многоязычный сайт php twig - как лучше реализовать?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Локализация (хорошая) всегда держится на кастомных наборах переводов, обычно это или таблица в бд, либо файлик с массивом, который правят по ходу наполнения сайта. Как конкретно реализовывать зависит от многих параметров, в том числе и от наличия готовых решений для используемого фреймворка. Ну или свое что-то пишут. Но смысл всегда примерно один - итоговый массив с ключами типа
    $translate = ['welcome'=>['ru'=>"Приветики",'jp'=>"Komichiwa"]...];
    Как достать значения по ключу думаю не надо разжевывать?..
    Ответ написан
    2 комментария
  • Актуально ли щас учиться вёрстке в 2020?

    @pinky03
    А как изволите вёрстку с конструкторов в бекенд интегрировать? Разработчик расплюётся от неё и попросит х5 цену за это копание в помоях, да и возиться с ней будет долго. Тут только чистая - верстальщиком написанная.
    Отсюда вытекает ограничение этих всех конструкторов - только мышкой сделать картинку и не трогать её больше никогда. О какой-то поддержке и функциональности речи не идёт.
    Ответ написан
    Комментировать
  • Когда стоит вкладывать input в label, а когда нет?

    KulakovAngel
    @KulakovAngel
    Full Stack Developer (Node.JS)
    В целом, с точки зрения правильности/валидности кода, как заметил Danny Arty, разницы нет. В примитивных случаях верстки визуальной разницы тоже особо не наблюдается.

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

    1. В таком варианте у нас имеется два рядом расположенных тега. Чтобы выбрать второй, идущий после первого, можно использовать "соседский" селектор "+" (Label идет сразу после Input). Данный вариант более "независимый", так как мы можем менять местами input и label, и даже разносить их на удаленное расстояние.
    <style>
      input + label {
        color: #ff0000;
      }
    </style>
    
    <input type="checkbox" id="checkbox" />
    <label for="checkbox">чекбокс</label>


    2. И второй вариант. Здесь мы не можем только средствами html/css обратиться "от input к label", так как не существует способа обратиться от ребенка к родителю (это можно, конечно, легко сделать через JS). Существуют селекторы потомков и соседей, но не родителей. Можно обратиться только от label к input, что дает мало преимуществ, так как
    1. input плохо стилизуется
    2. label обычно ничем не примечателен в отличие от input, который информативен (содержит, например, атрибут type).

    <style>
      label > input  {
        outline-color: #ff0000;
        outline-style: double;
      }
    </style>
    
    <label>
      <input type="checkbox" />
      чекбокс
    </label>


    А теперь представим, что нам нужно сверстать нечто подобное на основе (см. картинку):
    5ffea6239c1da641320430.png

    Как это реализовать? Для label соорудим ":before" и ":after", которым дадим форму скругленного прямоугольника и круга (который, к тому же будет перемещаться).

    Здесь второй вариант нам явно не подойдет, так как мы бы хотели в зависимости от состояния checkbox (.checkbox:checked) изменять родственный ему label:before (изменять цвет, перемещать).
    Если хотите взглянуть подробнее на код, пожалуйста:

    Таким образом, принципиальной разницы нет, но первый вариант (с id) более универсален, так как
    1. input и label могут быть разнесены физически (находится в разных местах документа)
    2. label может идти после input, что дает нам возможность обратиться в CSS от второго к первому

    Надеюсь, ответил на Ваш вопрос.
    Ответ написан
    Комментировать
  • Как сделать такое меню?

    @markak
    Frontend developer
    transition 3d css в гугл
    Ответ написан
    Комментировать
  • Не цветной PhpStorm?

    @Dj_Vreditel Автор вопроса
    Всё оказалось куда проще.
    Я как новичёк по своему не знанию сам обрубил всю подсветку. На деле как писал Orbb менять можно почти всё, что вам угодно.

    Моя ошибка заключалась в следующем:
    1) Правая кнопка мыши по скролл бару
    5b79ff1a2884d128003365.png

    2) Customize Highlight Level
    5b79ff6ea6616799044491.png

    3) Перетаскиваем ползунок с "None" на "Syntax" или "Inspection"
    5b79fff3a100e707910729.png

    Теперь у вас будет полная подсветка синтаксиса!
    Ответ написан
    Комментировать