Задать вопрос
  • Как деплоить небольшие проекты?

    @Stqs
    senior software developer
    вопросы у вас философские, на каждый можно отвести часы обсуждения
    Полноценный CI/CD поднимать не вижу смысла ввиду размеров

    вы ж все равно собираетесь какие-то скрипты мутить и чото выдумывать,
    какая разница это будут крон скрипты на сервере или джоба в дженкинсе? по-скорости написания - одно и тоже будет. так что по-моему размер тут не имеет значение
    единственное что имеет значение - насколько явно у вас описан процесс(алгоритм) билда/разворачивания приложений
    с этой точки зрения мое видение примерно такое:

    1) git не есть инструмент для развертывания по, git лишь для версионирования кода
    и по-идее результатом вашей работы должен быть не код в гитхабе, а какой-то вменяемый артефакт, готовый к деплою (docker-image, pip пакет, npm пакет, deb пакет, jar, war, zip в крайнем случае, и тд и тп). Если производить артефакты то вопрос с тегами отпадет сам собой - у вас будет артефакт какой-то версии и все
    сервер не должен знать ни про какие гиты и ни про какие-то теги в нем
    Здесь я бы рекомендовал паковать все в докер-имеджи хотя бы только потому, что сервер в итоге не будет знать ничего о зависимостях приложения, нужных библиотеках, ниочем вообще, вам нужно установить только докер
    Огромное преимущество использование докера - в Dockerfile вы вынуждены волей/неволей описать точно и явно все шаги требуемые для установки приложения. И что самое замечательное - это все будет храниться в том же репозитории, под контролем гит - шикарно.
    Артефакты желательно хранить в каком-то артефактории,
    но если реально все просто - то можно хранить несколько последних версий прямо на сервере в какой-нибудь папочке

    2) как только вы получили артефакт - его можно деплоить
    неплохо было б знать особенности вашего проекта, но грубо говоря допустим что достаточно его зааплоадить на сервер, положить в нужное место
    опять же с этим дженкинс справится на ура и займет у вас это все дело 10 минут . Если вы опишете логику в Jenkinsfile вы выиграете еще раз потому что процесс развертывания(алгоритм) будет описан опять же ЯВНО. И будет тоже под контролем гита. (Jenkins должен знать только в каком репозитарии и в каком месте ему искать Jenkinsfile)
    Если же вы будете крутить какой-то спрятанный cron скрипт на сервере - о нем никому ничего не будет известно. Поверьте уже через короткое время все это дело начнет усложнятся, что-то забудется, что-то измениться и это все вместе больно ударит вас по яйцам.

    В чем еще преимущество такого подхода: если вам нужно сделать roll-back на предыдущую версию вам не нужно собирать проект заново выкачивая все с гита, ведь у вас есть предыдущие артефакты, ролбек в таком случае вообще не проблема - просто указываем предыдущую версию артефакта и деплоим еще раз и все

    3) Env Variables
    когда приложение стартует - считывает все что ему нужно из переменных окружения
    деплой джоба может каждый раз эти переменные устанавливать перед тем как деплоить - это было бы тоже круто потому что вы сделали бы это знание так же явным

    Итого имеем
    - логика сборки проекта описана в Dockerfile и находится под гитом
    - логика деплоя находится в Jenkinsfile и находится под гитом, и что самое главное является кодом (Jenkinsfile пишем на груви, для простых вещей вам понадобиться 30 минут изучения и все)
    - на сервере мы ничего не устанавливали совершенно кроме самого докера
    - мы храним несколько версий нашего приложения на всякий случай и можем быстро откатиться не прибегая к гиту вообще
    - сервер не знает ничего о гитах
    - на сервере нет НИКАКОЙ дополнительной логики по разворачиванию вашего приложения
    - имея все это очень легко добавлять другие сервера для деплоя - что нам нужно - грубо говоря указать другой айпи и набор env variables к нему ( если они конечно отличаются)
    giphy.gif
    Ответ написан
    5 комментариев
  • Где кончаются границы возможностей CMS в сравнении с web-разработкой?

    saboteur_kiev
    @saboteur_kiev Куратор тега Веб-разработка
    software engineer
    Какие самые топовые двигатели существуют?
    Где заканчиваются возможности двигателей и начинаются возможности других способов что-либо двигать?

    Вы же понимаете, что нельзя сказать что есть самое топовое, потому что сразу станет вопрос об области применения.
    Ездить, летать, ползать, закручивать.

    Так же и тут - "топовых" небывает, есть популярные для решения конкретных видов задач.
    Любая CMS это обычно веб-продукт, и при желании ВСЕ можно реализовать в CMS, просто иногда задача бывает такова, что нет смысла переписывать CMS, а проще написать с нуля свое.
    Ответ написан
    Комментировать
  • Как разбить код из одной строки в несколько на js?

    wapster92
    @wapster92 Куратор тега JavaScript
    \n перенос, \t табуляция
    Ответ написан
    6 комментариев
  • Как сделать чтобы слик слайдер начинался с элемента на который кликнули, а не с самого первого слайда?

    petyagrill
    @petyagrill
    var num = 1;
    $('.b1').on('click', function (e) {
      num = parseInt($(this).data('num')); 
    })
    
    $('.modal').on('shown.bs.modal', function () {
      $('.slider__prod').slick({
        initialSlide: num-1,
        arrows: true,
        prevArrow: '<button class="slick-prev slick-arrow" aria-label="Prev" type="button" style=""><i class="fa fa-chevron-left" aria-hidden="true"></i></button>',
        nextArrow: '<button class="slick-next slick-arrow" aria-label="Next" type="button" style=""><i class="fa fa-chevron-right" aria-hidden="true"></i></button>'
      });
    });
    Ответ написан
    1 комментарий
  • Как отправить html код по почте?

    Chefranov
    @Chefranov
    Новичок
    content-type: text/plain заменить на content-type: text/html
    Ответ написан
    1 комментарий
  • Как посчитать общую сумму если убрать select?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Ну и откуда тогда должна браться цена, если селект с ценой отсутствует? Можете подставлять случайное значение - как, подойдёт такой ответ? Нет? Тогда дополняйте вопрос.

    UPD.

    Цена завернута в див price prc-new

    ОК, тогда замените

    $('[name="variant"] option:checked').data('price')

    на

    $('.price.prc-new span').text()
    Ответ написан
    Комментировать
  • Как запретить ввод чисел больше 999 в input[type="number"]?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('input').on('input', function() {
      $(this).val((i, v) => Math.max(this.min, Math.min(this.max, v)));
    });

    или

    document.querySelector('input').addEventListener('input', ({ target: t }) => {
      t.value = Math.max(t.min, Math.min(t.max, t.value));
    });
    Ответ написан
    1 комментарий
  • Форматирование чисел на js. Как сделать пробелы в цене?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('.price').text((i, text) => {
      const [ price, currency ] = text.split(' ');
      return `${(+price).toLocaleString()} ${currency}`;
    });
    
    // или
    
    document.querySelectorAll('.price').forEach(n => {
      n.textContent = n.textContent.replace(/\d(?=(\d{3})+\D)/g, '$& ');
    });

    Ну или (что желательно), перед выводом пропускайте цену через toLocaleString.
    Ответ написан
    3 комментария
  • Считаются ли процентные padding-и и margin-ы плохой практикой?

    inkShio
    @inkShio
    нет, там где это уместно.
    Ответ написан
    Комментировать
  • Как использовать apache если он уже есть в "недоступном" приложении?

    flapflapjack
    @flapflapjack
    на треть я прав
    А пути то хоть какие у приложений?

    Если вебморда облака висит на 80-м порту, и располагается в /var/www, то создайте подпапку application там и суньте туда ваш проект, который станет доступным по адресу:
    http://айпишник/application

    Можно субдоменом сделать, если днс поднят, но судя по вопросу - вам проще подпапку создать как я выше написал, или симлинк бросить
    Ответ написан
    7 комментариев
  • Как организовать запись с ip камеры без ПК?

    NeiroNx
    @NeiroNx
    Программист
    На регистратор проще всего писать. Если хочется дешевле - купить плату регистратора - стоит 1500 на алишке. В камере надо включить Onvif.
    Ответ написан
    6 комментариев
  • Как оптимальнее при клике на кнопки изменять состояния связанных с ними блоков?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const buttonSelector = '.button';
    const blockSelector = '.div';
    const activeClass = 'red';
    
    function toggleBlock(blocks, buttons, button) {
      const index = Array.prototype.indexOf.call(buttons, button);
      blocks.forEach((n, i) => {
        n.classList[i === index ? 'toggle' : 'remove'](activeClass);
      });
    }
    
    
    // обработчик клика делегированный, назначается один раз
    document.addEventListener('click', e => {
      const button = e.target.closest(buttonSelector);
      if (button) {
        const blocks = document.querySelectorAll(blockSelector);
        const buttons = document.querySelectorAll(buttonSelector);
        toggleBlock(blocks, buttons, button);
      }
    });
    
    // или, назначаем обработчик клика каждой кнопке индивидуально
    const buttons = document.querySelectorAll(buttonSelector);
    const blocks = document.querySelectorAll(blockSelector);
    const onClick = e => toggleBlock(blocks, buttons, e.currentTarget);
    buttons.forEach(n => n.addEventListener('click', onClick));
    Ответ написан
    6 комментариев
  • Ленивая подгрузка страниц во всплывающем окне?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    $(document).on('click', '.open-modal-button', function (e) {
            $.ajax({
                //бла бла бла
            });
        })
    Ответ написан
    1 комментарий
  • Как манипулировать обьектом который динамически создан?

    ThunderCat
    @ThunderCat Куратор тега JavaScript
    {PHP, MySql, HTML, JS, CSS} developer
    $(document).on('someEvent','newElementSelector',function(){
       // do some stuff
    })
    Ответ написан
    1 комментарий
  • Как посчитать в екселе стаж в разных фирмах?

    Собирайте дату с помощью
    для VBA DateSerial
    для EXCEL ДАТА
    т.к. даты представлены числами то вы можете смело вычитать и складывать их
    т.е
    ДатаНачалаСтажа = СегодняшняяДата - DateSerial(X, Y, N)

    Дальше простая арифметика
    Ответ написан
    1 комментарий
  • Как создать массив в зависимости от условия в jquery?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const data = $('.price')
      .filter((i, n) => +n.value)
      .closest('tr')
      .find('input[type="hidden"]')
      .get()
      .map(n => n.value);

    или

    const data = Array
      .from(document.querySelectorAll('.price'))
      .filter(n => +n.value)
      .map(n => n.closest('tr').querySelector('input[type="hidden"]').value);

    или

    const data = Array.prototype.reduce.call(
      document.getElementsByClassName('price'),
      (acc, { value: v, parentNode: { parentNode: tr } }) => (
        +v && acc.push(tr.cells[0].children[0].value),
        acc
      ),
      []
    );
    Ответ написан
    1 комментарий
  • Как сверстать такой элемент?

    0xD34F
    @0xD34F
    .xxx {
      background: silver;
      display: inline-flex;
      justify-content: center;
      align-items: center;
      font-size: 24px;
      padding: 0.3em 0.6em;
      position: relative;
    }
    
    .xxx::before {
      content: "";
      width: 1em;
      height: 1em;
      left: -0.2em;
      top: -0.2em;
      background: orange;
      position: absolute;
      z-index: -1;
    }

    https://jsfiddle.net/km85s9fv/
    Ответ написан
    Комментировать
  • Как по клику убрать класс у элемента и добавить предыдущему/следующему?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Добавляем кнопкам атрибут, который будет указывать относительную позицию нового активного элемента:

    <span class="prev" data-step="-1">Prev</span>
    <span class="next" data-step="+1">Next</span>

    Индекс нового активного элемента будет суммой индекса текущего и относительного положения нового. Чтобы произошёл переход из конца в начало - необходимо брать остаток от деления суммы на количество элементов, индекс несуществующего элемента, расположенного за последним, превратится в 0. Переход из начала в конец - в случае jquery ничего делать не надо, метод eq позволяет указывать отрицательные индексы, которые используются для отсчёта позиции элемента начиная с конца; в случае чистого js надо будет добавить к сумме количество элементов, чтобы потенциальное отрицательное значение стало положительным, и при этом не изменился остаток от деления.

    const itemSelector = 'li';
    const buttonSelector = '[data-step]';
    const activeClass = 'active';

    $(buttonSelector).click(function() {
      const { step } = this.dataset;
      const $items = $(itemSelector);
      const $active = $items.filter(`.${activeClass}`);
    
      $active.removeClass(activeClass);
      $items.eq(($active.index() + +step) % $items.length).addClass(activeClass);
    });
    
    // или
    
    const items = document.querySelectorAll(itemSelector);
    let index = 0;
    
    document.querySelectorAll(buttonSelector).forEach(n => {
      n.addEventListener('click', onClick);
    });
    
    function onClick({ currentTarget: { dataset: { step } } }) {
      items[index].classList.remove(activeClass);
      index = (index + items.length + +step) % items.length;
      items[index].classList.add(activeClass);
    }
    Ответ написан
    1 комментарий
  • Как в динамическую таблицу добавить нумерацию строк?

    RAX7
    @RAX7
    Проще сделать как в документации написано, чем изобретать велосипед.
    https://datatables.net/examples/api/counter_column...
    Ответ написан
    Комментировать