• Как сделать комит в GITLABE без запуска runner?

    @d-stream
    Готовые решения - не подаю, но...
    Самое простое - в commit message поместить "волшебный" текст [skip ci] либо передать опцию ci.skip гиту
    Либо менять слегка схему сборки и там уже либо реагировать на условия, а в остальных случаях например не собирать (gitlab yml when/rules)
    Ответ написан
    3 комментария
  • Laravel как правильно обновить баланс при покупке?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    В таблице баланса ограничиваете возможность отрицательных значений
    create table user_balance (
    	user_id int,
      	balance decimal(9, 2) check (balance >=0)
    );


    create table user_balance_unsigned (
    	user_id int,
      	balance decimal(9, 2) unsigned
    );


    любая попытка списать больше чем баланс вызывает ошибку

    SQL online environment
    Ответ написан
    1 комментарий
  • Laravel как правильно обновить баланс при покупке?

    iMedved2009
    @iMedved2009
    Не люблю людей
    1. Лочить запись в таблице балансов до момента списания. Залочили, проверили, списали, разлочили. Другие процессы либо будут ждать - либо вылетят по таймауту.

    2. Использовать update с условием. update user_balance where user_id = ? and balance > нужного. У вас запрос не выполнится если кто то уже списал деньги. А вы по affected rows можете судить списалось или нет
    Ответ написан
  • Как обработать запрос в Laravel Octane в одном потоке?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Операция проверить есть запись и вставить - не атомарная. У вас одновременно может выполнится вагон проверок и начать вставку.

    1. Использовать локи. Залочили таблицу, проверили, вставили, убрали лок.

    2. Повесить unique на связку поле ['user_id', 'post_id'], и через catch ловить нужный exception.

    3. Повесить unique на связку поле ['user_id', 'post_id'], и добавить макро upsert - на вставку pivot.
    Ответ написан
    5 комментариев
  • Как встроен HTTP в HTTPS?

    vabka
    @vabka
    Токсичный шарпист
    Если HTTP - это тупо текст поверх TCP, то HTTPS - это текст, завёрнутый в TLS, который идёт поверх TCP.

    что значит "модификация"

    1. Хз что ты там читал, но мне вся выдача гугла говорит, что HTTPS - это расширение HTTP
    2. Если не вдаваться в этимологию, то "расширение" - это когда суть расширяемого объекта не меняется, но добавляется что-то ещё. В случае HTTPS - у нас остаётся вся семантика HTTP, но добавляется шифрование.

    По факту это всё-таки другой протокол, который не совместим с обычным Http
    Ответ написан
    Комментировать
  • Как лучше добавить на сайт текстовый логотип, как SVG изображение или ЗАГОЛОВОК?

    @archelon
    tldr: подключайте svg и не мучайтесь.

    а) Трудозатраты
    Подключить картинку быстрее и проще.
    б) Надежность
    Изображение будет гарантированно отображаться как надо на всех устройствах. Если где-то вдруг не загрузится шрифт, или не успеют прогрузиться стили, вы потеряете оформление.
    в) Индексация
    Теоретически может оказаться полезным то, что текст будет прочитан и учтен поисковиками, хотя обычно это не дает каких-то преимуществ.
    г) Оптимизация
    В разных случаях меньше будет весить картинка или оформленный текст.
    Если для текстового логотипа надо прилинковать пару нестандартных шрифтов, это значительно увеличит количество кБайтов. Если нет, текст будет немного меньше весить, но выигрыш будет несущественным.
    д) Особенности дизайна
    В некоторых случаях может быть нестандартный дизайн, где текстовый логотип — необходимость.
    е) Действительно простой логотип
    Ну и конечно, если логотип — это банально название компании / марки, набранное уже подключенным шрифтом, и никаких дополнительных итераций (интерлиньяж, трекинг и т.п.) не требуется, тогда, действительно, проще набрать текстом.
    Ответ написан
    Комментировать
  • Как сохранить личные данные на публичном сайте?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Просто добавить авторизацию, пусть даже базовую.
    Ответ написан
    1 комментарий
  • Как конвертировать HTML-текст в обычный?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. создать элемент
    2. в него положить исходный HTML как innerHTML
    3. забрать из него уже textContent

    const textFromHTML = html => {
      const el = document.createElement('div');
      el.innerHTML = html;
      return el.textContent;
    }
    
    textFromHTML('на уровне около $300') // "на уровне около $300"
    Ответ написан
    Комментировать
  • Почему PHP кэширует содержимое скрипта при запуске из sudo?

    @rPman
    linux запущен из wsl windows?
    что то похожее (точнее там была разница значений внутри linux контейнера из windows было странно разное)

    для linux это однозначно неправильное поведение, на дефолтном окружении такого поведения не возникает, вспоминай что такое делал с linux что оно так стало вести.

    p.s. консольный php работает без кеширования
    Ответ написан
    6 комментариев
  • Нужны ли интерфейсы?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Spring
    Седой и строгий
    Вам виднее, нужны ли они в вашем проекте. Обычно это зависит от сложности проекта и темпов его развития. В чëм-то мелком и мало изменчивом внедрение через интерфейсы - это карго-культ. В большом и сложном проекте, который постоянно изменяется - это жизненно необходимый подход, без которого работа сначала превращается в ад, а потом и вовсе становится невозможна.
    Ответ написан
    1 комментарий
  • Как использовать сессию для всех клиентов одновременно?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Единственно правильный ответ - никак.

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

    Если под "сессией" имелось в виду общее хранилище для всех пользователей, то оно называется "база данных". И в этом смысле "БД не предлагать" выглядит беспочвенным капризом. Как правильно заметил N в комментарии, такое заявление звучит как "Как кушать суп? Ложку не предлагать."
    Такие заявления надо всегда подробно обосновывать. И в этом случае вам либо действительно подскажут, как обойтись без БД, либо объяснят, что это просто блажь.

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

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

    Aetae
    @Aetae
    Тлен
    Правильный ответ: нельзя (невозможно надёжно) использовать регулярные выражения для парсинга html. Используйте библиотеку для html-парсинга, имеющуюся для любого языка, какой бы вы не использовали.

    Ответ: /(?<=">).*?(?=<\/)/.
    Ответ написан
    2 комментария
  • Как выполнить многотабличный запрос Laravel Query Builder?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Я так понимаю что база данных MySQL. И у вас на локалке один strict_mode, а на проде другой. На локалке не правильный - и вам соверженно правильно пишут что нельзя выбирать поля в селекте если они не используются в group by.
    Ответ написан
    6 комментариев
  • Как избежать блокировки редиректа браузером?

    Что-то вы не договариваете, редиректы никто не блокирует, к примеру редирект с кодом 302 прекрасно работает. Блокируются только зацикленные редиректы сами на себя, когда браузер понимает, что выхода из этого редиректа никогда не будет. К примеру если вы перейдете по ссылке https://toster.ru/q/364913, то в итоге волшебным образом попадете на адрес https://qna.habr.com/q/364913, это и есть редирект и никакой блокировки нет)
    Какое сообщение показывает браузер когда в вашем случае происходит блокировка редиректа?
    Ответ написан
    2 комментария
  • Кто лучше подходит под «создание бизнеса» — макретолог, экономист или же менеджер?

    @mkone112
    Начинающий питонист.
    что не хочу работать долго, а хочу иметь свой бизнес,

    Выбрать одно из двух.
    макретолог, экономист или же менеджер?

    Никакое учебное заведение на научит тебя как создать бизнес, как любое другое знание - его предстоит получать самостоятельно, в колледже, вузе или где-то еще не имеет принципиального значения.
    Ответ написан
    1 комментарий
  • Как проверить есть ли в тексте выделение жирным?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно спарсить фрагмент HTML в документ, в котором обычными методами вроде querySelector() поискать нужный тег:
    const code = `
    <li class="search__list-item">
      <div class="search__img-wrap">
        <img class="search__img search__img_indents" src="search.svg" alt="Иконка">
      </div>
      <strong>поиск</strong>
      текста
    </li>
    `;
    
    const parser = new DOMParser();
    const doc = parser.parseFromString(code, 'text/html');
    
    if (doc.querySelector('strong')) {
      console.log('Есть!');
    }
    Ответ написан
    Комментировать
  • Как вызывать функцию с теми же аргументами не более одного раза?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    memoization
    это называется «мемоизация» (не от слова «мем», нет : ) Функция запоминает значения аргументов и результат выполнения. Если уже вызывалась с такими аргументами – вернёт «запомненное» значение, не выполняясь ещё раз. Статья на Хабре

    В качестве кэша можно использовать объект или WeakMap, если аргумент – объект.

    distributed lock
    Из вопроса не вполне понятно: в контексте одного выполнения скрипта только один раз, или глобально? Для глобального случая можно использовать какое-то быстрое хранилище, например, Redis, и механизм MutEx ("mutual exclusion" – взаимного исключения), например RedLock.

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

    Генерится случайный ключ. Пара (X, ключ) отправляется в асинхронное хранилище, где если нет ещё сохранённого значения под этот X, ячейка запирается (lock) этим ключом. Тут необходима особенность механизма самого хранилища – в Redis это "NX" – записывать только, если уже нет значения. Это гарантирует, при параллельных запросах, что только чьё-то одно случайное значение запишется. Закон джунглей: первый прибежал — наелся!

    Далее надо прочитать записанное значение и получить ключ. Сравнить со своим ранее сгенеренным ключом. Совпали? Значит, это именно мы заперли этот аргумент, и можно выполнить функцию. Не совпали – параллельный процесс выиграл. Просто запросим готовое значение чуть попозже.
    Ответ написан
    1 комментарий
  • И снова по теги — как быть, если не знаешь какой тег указать?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Указывать не более двух тэгов — меньше шансов вызвать негативную реакцию и больше шансов, что кто-то поправит тэги.
    Ответ написан
    2 комментария