Задать вопрос
  • Как scr=data:image Сохранить в jpg\png?

    Alexandroppolus
    @Alexandroppolus
    кодир
    в js (node.js) это делается тривиально:

    function save(str, file) {
        const match = /data:image\/[a-z]+;base64,([0-9a-zA-Z/+=]+)/.exec(str);
        if (match) {
            fs.writeFile(file, Buffer.from(match[1], 'base64'), (err) => {...});
        }
    }


    не дебажил...
    Ответ написан
    Комментировать
  • Как скопировать определенные (не все) свойства объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Если в новом объекте должны быть все указанные свойства, вне зависимости от их наличия в исходном объекте:

    // имена свойств можно передавать в виде массива
    const pick = (obj, keys) => Object.fromEntries(keys.map(n => [ n, obj[n] ]));
    const newObj = pick(obj, [ 'b', 'c' ]);
    
    // или как отдельные значения
    const pick = (obj, ...keys) => keys.reduce((acc, n) => (acc[n] = obj[n], acc), {});
    const newObj = pick(obj, 'b', 'c');

    Если отсутствующие свойства не нужны:

    const pickExisting = (obj, keys) =>
      Object.fromEntries(keys.filter(n => n in obj).map(n => [ n, obj[n] ]));

    Если нужны только собственные свойства:

    const pickOwn = (obj, keys) =>
      keys.reduce((acc, n) => (Object.hasOwn(obj, n) && (acc[n] = obj[n]), acc), {});

    Если хотим выбирать свойства не только по именам, но и по значениям:

    const pick = (obj, filterFn) => Object.fromEntries(Object.entries(obj).filter(filterFn));
    
    const obj1 = pick(obj, ([ k, v ]) => 'abc'.includes(k) && v % 2); // {a: 1, c: 3}
    const obj2 = pick(obj, n => n[1] > 2); // {c: 3, d: 5}
    Ответ написан
    Комментировать
  • Как присвоить компонентам значение по результатм логического ветвления?

    Wispik
    @Wispik
    let statuses = document.querySelectorAll('.M')
        statuses.forEach((item) => {
              if (item.innerText === 'Активен') {
                item.classList.add('Free')
    
              }
              if (item.innerText === 'Заблокирован') {
                item.classList.add('Blocked')
    
              }
            }
        )

    ну не надо во вью такими извращениями заниматься, это так делается:
    <MyStatus 
      class="M"
      :class="{'Free': item.Status==='Активен', 'Blocked': item.Status==='Заблокирован'}"
      style="width: 75%; padding: 0.25em 0.75em"
    >
        {{ player.Status }}
    </MyStatus>

    Ну и по вопросу не понятно, что надо в button передать и откуда надо путь img взять
    Ответ написан
    5 комментариев
  • Какое оборудование нужно для соединения коммутаторов в разных зданиях на расстоянии 200 м?

    anthtml
    @anthtml
    Системный администратор программист радиолюбитель
    Вариант 1 (самый простой/дешманский): Делим участок на сегменты менее 100м, желательно чтобы стыки были в районе розеток. Покупаем самый дешевый обычный свитч DES/DGS-1005, подключаем и работаем
    Вариант 2 (по дороже): Вариант 1, только вместо свитчей POE-коммутаторы(инжекторы)/удлинители. Если к местам стыков нет возможности подвести 220В
    Вариант 3 (надежный/геморойный): Оптоволокно, если позволяют условия - можно купить готовый оконеченный патчкорд и протянуть, если нет - тянуть кабель и оконечивать. Любой провайдер подрядиться такое спроектировать/сделать.
    Вариант 4. (в прямой видимости): WI-FI радиомост на направленных точках доступа/антенах. Ну не забиваем, что от каждой точки доступа до ближайшего свитча также может быть до 100м
    Вариант 5. (когда проложить нет возможности): Использование технологий PLC (powerline) - подключение по существующей электропроводке, через спец адаптеры. VDSL - подключение по существующей прямой телефонной линии (1 паре)
    Вариант 6. (арендный) При наличии на обоих концах точек присутствия провайдера. Заказать услугу темного волокна или mpls, объединение сетей
    Вариант 7. (интернетный): При наличии на обоих концах точек присутствия провайдера. Объединение сетей через классический VPN.
    Ответ написан
    2 комментария
  • Как флексами разделить блоки 2 на 2?

    mizutsune
    @mizutsune
    I will live forever in the flame of your eyes.
    .flex {
       --gap: 20px;
       display: flex;
       flex-wrap: wrap;
       gap: var(--gap);
    }
    
    .item {
       width: calc(50% - var(--gap) / 2);
       height: 100px;
       background-color: red;
    }
    Ответ написан
    Комментировать
  • Как добавить класс в зависимости от ширины экрана?

    mizutsune
    @mizutsune
    I will live forever in the flame of your eyes.
    Вам не класс нужно переключать на элементе, а включать и выключать слайдер, при достижении определенного брейкпоинта. Всё это дело можно легко решить с помощью matchMedia.

    Вот небольшой пример:

    const slider = $(".slider").slick({
         centerMode: true,
         slidesToShow: 4
    });
    
    const breakpoint = window.matchMedia("(max-width: 992px)");
    
    const breakpointChecker = () => {
       if (breakpoint.matches) {
          slider.slick('init');
       } else {
          slider.slick('destroy');
       }
    };
    
    breakpoint.addEventListener("change", breakpointChecker);
    breakpointChecker();


    А вот для дополнительной стилизации контейнера, уже можно использовать медиа запросы в CSS.
    Ответ написан
    2 комментария
  • При выполнении функции в Laravel запускаемой в Cron каждые 3 минуты, как избежать дублирования?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Если используется ларавеловский планировщик:
    $schedule->command('command')->withoutOverlapping();


    если используется системный крон
    */5 * * * * flock -w 1 /tmp/command-lock php artisan command
    Ответ написан
    Комментировать
  • При выполнении функции в Laravel запускаемой в Cron каждые 3 минуты, как избежать дублирования?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Зависит от конкретного поведения, которое вам нужно.
    Если хотите, чтобы скрипт выполнялся не чаще, чем раз в три минуты, но при этом всегда в один поток, то есть withoutOverlapping.
    Если хотите, чтобы скрипт выполнялся ровно каждые три минуты, но при этом не брал уже обрабатываемые записи, то просто добавьте поле со статусом для каждой из них (он может быть как булевым, так и более сложным) и в самом начале помечайте взятые, а выбирайте только невзятые.
    Ответ написан
    6 комментариев
  • Как сравнить введенную дату с текущей?

    0xD34F
    @0xD34F Куратор тега Vue.js
    computed: {
      deadlineText() {
        const today = new Date().setHours(0, 0, 0, 0);
        const deadline = new Date(this.task.deadline).setHours(0, 0, 0, 0);
        return [ 'Уже было', 'Сегодня', 'Жди' ][1 + Math.sign(deadline - today)];
      },
    },
    Ответ написан
    2 комментария
  • Как сделать регулярное выражение для положительных и отрицательных чисел?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Регулярка тут не нужна и вредна. Почему бы просто не конвертировать в число и проверять, что в диапазоне?

    document.querySelector('input').addEventListener('input', e => {
      const { value } = e.target;
      const num = Number(value);
      const isValid = !isNaN(num) &&
        num <= 60 &&
        num >= -60;
    
      // что-то делаем с валидным / невалидным
      if (isValid) {
        // мы молодцы, сирену можно выключить
      } else {
        // включаем мигалку и сирены, подсвечиваем красным
      }
    });
    Ответ написан
    Комментировать
  • Почему браузерная figma экспортирует картинки в архивах?

    bocmanbarada
    @bocmanbarada
    Веб-дизайнер, дизайнер на Тильда.
    Владислав, приветствую. Только что столкнулся с этой проблемой, но прикол оказался не с названием фрейма, а с названием страницы. Если в названии страницы стоит слэш, то экспорт даже одного элемента идет в архиве.
    5ffcbed81514e125576618.png
    Если слэш удалить, то сразу все норм экспортируется без всяких архивов. Взбесила эта ситуация, но с твоей помощью удалось найти причину. Триклятый слэш)))
    5ffcc0773caaf894494614.png
    Ответ написан
    2 комментария
  • Как быстро понять какие будут поля у модели после применения всех миграций?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Есть ли возможность понять, какой конечный вариант в модели должен быть и какая таблица получится с нуля, после применения всех миграций?
    Ну, собственно, применить все миграции и посмотреть в таблицу, в чём тут сложность-то?

    Как раз для того, чтобы не разбираться в куче миграций, в Laravel добавили возможность их схлопнуть после применения. И тогда можно будет и вовсе смотреть не в живую БД, а в файл с дампом схемы.
    Ответ написан
    1 комментарий
  • Почему не работает computed в vue3?

    0xD34F
    @0xD34F Куратор тега Vue.js
    setup() {
      ...
      const boards = computed(() => {
        return store.getters["boards/getBoards"];
      });
    
      return boards;
    },

    А если бы у вас было два вычисляемых свойства, что бы вы возвращали из setup? Вообще, что следует возвращать из setup? Откройте документацию и разберитесь.
    Ответ написан
    Комментировать
  • Как сделать в запрос Mysql что бы вывести по 10 записей каждой страны?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    И наш традиционный вопрос: что я делаю не так, печатая заголовок вопроса не в форму на тостере, а в адресную строку своего браузера?
    Ответ написан
    Комментировать
  • Как добавить новый параметр в существующую строку запроса?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Я пробовал request()->fullUrlWithQuery(), но тогда получается, что в методе я должен указать параметр и значение, но если у меня, например, 10 параметров, получается, что мне каждый надо указывать.


    Зачем? Только тот, который добавляется данной ссылкой

    https://laravel.com/docs/9.x/requests#retrieving-t...

    If you would like to append query string data to the current URL, you may call the fullUrlWithQuery method. This method merges the given array of query string variables with the current query string:


    <a href="{{ request()->fullUrlWithQuery(['status' => 1]) }}">Status</a>
    <a href="{{ request()->fullUrlWithQuery(['color' => 1]) }}">Color</a>
    Ответ написан
    Комментировать
  • Почему не работает аккордеон в таблице?

    0xD34F
    @0xD34F Куратор тега JavaScript
    что делаю не так?

    Всё делаете не так.

    Зачем переключаете класс active на кнопке? Его у элемента с классом d-n переключать надо - вместо той ерунды с изменением стилей напрямую. Кстати, а кому вы пытаетесь назначить style.display = 'table-cell'? Если идти от кнопки parent-parent-next (вместо того, чтобы несколько раз дёргать parentNode, следует использовать метод closest) - это будет (не будет, погуглите, в чём разница между nextSibling и nextElementSibling) строка, а не ячейка - так что перенесите-ка класс d-n на один уровень выше. Зачем создавать каждой кнопке индивидуальный обработчик? Достаточно одного на всех, создавайте его вне цикла. Наконец, у classList.toggle есть второй параметр, не надо им пренебрегать.

    Исправляем:

    document.querySelectorAll('.panel').forEach(n => n.addEventListener('click', onClick));
    
    function onClick() {
      const panel = this.closest('tr').nextElementSibling;
      const isActive = !panel.classList.contains('active');
      panel.classList.toggle('active', isActive);
      this.classList.toggle('changing-icon', isActive);
    }
    Ответ написан
    1 комментарий
  • Насколько безопасна реализация запоминания пользователя?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Требуемый параметр называется "криптографической стойкостью".
    Большая часть самопальных решений "из букв и цифр" такой стойкостью не обладает.
    Как не обладает ей и uuid v4.

    На данный момент рекомендуемым решением является использование функции random_bytes()
    $token = bin2hex(random_bytes(24));
    Далее токен пишется в БД и в куки пользователю.
    Ответ написан
    Комментировать
  • Как правильно строить крупный проект?

    @vism
    Называется, услышал звон, да не знаю где он.

    1. Сервисный слой ты превратил в контроллер.
    Т.е. у тебя есть контроллер, а ты создал ещё один, т.к. где-то слышал, что нужны сервисы.
    Но, сервисы не шлют ответы, это внутренний слой для отделения логики.
    Ты можешь те методы вызвать через консоль, другие сервисы и т.п.
    Там должен просто генерироваться return, а сам response уже в контроллере (чтоб контроллер своб функцию выполнял). Валидацию реквеста кстати тоже надо делать не в сервесе.

    2. CategoryQuery - это вобще дичь дикая.
    Ты опять создаёшь дубликат, потому что услышал о репозиториях, и даже интерфейс. Вот я угараю с людей, кто везде пихает интерфейсы. Интерфейсы нужны там, где они нужны. Где будет 2+ наследователей интерфейса.
    Откуда у тебя тут наследники, если ты завязан на элокуент?
    А ноги от индусов репозитаристов. Не нужен репозитарий, Query и интерфейсы при работе в элокуент. Он сам в себе это всё уже содержит и все повторяющиеся вещи обёрнуты уже. find, first, firstOrNew и т.д.
    Так что используй элокуент и не переусложняй проект напрасно. Не надо делать сложно, делай просто.

    3. CategoryAction.
    Опять интерфейс...
    Вот это Экшн по сути у тебя сервис. Тут ты имеено перенёс бизнес логику создания и редактирования и возвращаешь ответ данного метода. Вот удали свой CategoryAction и перенеси методы в сервис.
    Ответ написан
    30 комментариев
  • Как лучше передать данные в шаблон в Laravel?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    $var1 = '..';
    $var2 = '..';
    return view('layouts', compact('var1', 'var2'));


    $var1 = '..';
    $var2 = '..';
    return view('layouts', [
      'var1' => $var1,
      'var2' => $var2,
    ]);


    $varData = $this->formatService($responce); // ['var1' => '..', 'var2' => '..']
    return view('layouts', $varData);
    Ответ написан
    Комментировать
  • Где в Laravel лучше делать валидацию входящих данных - в контроллере или сделать кастомный Request для контроллера, или Middleware?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вообще-то в Ларе УЖЕ есть этот самый отдельный сервис - Illuminate\Http\Request, который и предназначен для валидации входящих данных.
    Ответ написан
    2 комментария