Задать вопрос
  • Сидер не видит фабрику, хотя она есть. В чём может быть проблема?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    Я просто не понимаю откуда берётся Providers в пути автозагрузки
    модель расположена в нестандартном месте
    App\Providers\Models
    от этой модели вызывается метод factory который относится к трейту HasFactory, там вызывается куда передается неймспейс твоей модели и подставляется к шаблону для неймспейса фабрики

    Соответственно есть 2 пути решения:
    1) перенести модель по пути App\Models (переносишь файл, обновляешь неймспейс)
    2) объяснить laravel где искать класс:

    В GameFactory
    class GameFactory extends Factory
    {
        protected $model = \App\Providers\Models\Game::class;
    ...


    В app/Providers/AppServiceProvider.php
    public function boot(): void {
         // ...  
        Factory::guessFactoryNamesUsing(function(string $modelName) {
             return 'Database\\Factories\\' . class_basename($modelName) . 'Factory';
        });
    }
    Ответ написан
    2 комментария
  • Как сделать Second Picker?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    <select id="secondsSelect">
      <option value="">Выберите секунды</option>
    </select>


    const select = document.getElementById('secondsSelect');
      for (let i = 1; i <= 60; i++) {
        const option = document.createElement('option');
        option.value = i;
        option.textContent = i + (i === 1 ? ' секунда' : ' секунд');
        select.appendChild(option);
      }
    Ответ написан
    6 комментариев
  • Как использовать и регистрировать мидлвар в ларавель 11?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    https://spatie.be/docs/laravel-permission/v6/basic...

    app.php
    ->withMiddleware(function (Middleware $middleware) {
            $middleware->alias([
                'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
            ]);
        })
    Ответ написан
    2 комментария
  • Как без перезагрузки страницы добавить параметры в строку ввода браузера с помощью jquery?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?myNewUrlQuery=1';
    window.history.pushState({path:newurl},'',newurl);


    Но может быть стоит подумать про куки или локал сторадж?
    Ответ написан
    2 комментария
  • Почему не отправляет формы в телеграм?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    Возьми curl (а лучше сразу guzzle) вместо fopen и читай нормальные http ошибки, там все напишут
    Ответ написан
    Комментировать
  • Как воспроизводить код при закрытии приложения?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    на клиенте можно отследить только целевое закрытие программы (нажатие соответствующей кнопки), для нецелевого завершения клиентского приложения можно нагородить костыль в виде дополнительной программы демона, который запускается при запуске основной программы, фиксирует PID основного приложения и по кд пингует его, когда PID пропал или присвоился другому отправлять сообщение на сервер, но это костыль и не спасет от ситуации закрытия всех программ через диспетчер задач, и даже если закрытие приложение удалось поймать на клиенте - как отправиь эту инфу на сервер если, допустим, на клиенте уже нет интернета

    на сервер условное сообщение "disconnected"


    просто на сервере отслеживать когда коннект оборвался, это может быть предусмотренное событие разрыва соединения, можно просто пинг (от сервера) понг (от клиента) реализовать, когда пинг не проходит - считаем, что приложение закрыли. тут может быть коллизия с тем, что приложение запущено, но отключился интернет например
    Ответ написан
    2 комментария
  • Как разместить laravel в подпапке?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    мне кажется тебе нужно не на уровне nginx это делать, а на уровне роутов ларавель. в ларавель есть роуты api, для этих маршрутов все идет черед префикс /api. нужно по аналогии реализовать /laravel (ну а все остальные варианты доступа убрать)

    Например вот такой провайдер (ну или можно в стандартном провайдере, но я бы там закоментил просто стандартный вариант, а кастом в новый провайдер унес)
    <?php
    
    namespace App\Providers;
    
    use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
    use Illuminate\Support\Facades\Route;
    
    class MyRouteServiceProvider extends ServiceProvider
    {
        /**
         * The path to your application's "home" route.
         *
         * Typically, users are redirected here after authentication.
         *
         * @var string
         */
        public const HOME = '/laravel/home';
    
        public function boot(): void
        {
            $this->routes(function () {
                Route::middleware('laravel')
                    ->prefix('laravel')
                    ->group(base_path('routes/laravel.php'));
            });
        }
    }


    и подключить его в config/app.php
    'providers' => ServiceProvider::defaultProviders()->merge([
            /*
             * Application Service Providers...
             */
    
            App\Providers\MyRouteServiceProvider::class,
        ])->toArray(),
    Ответ написан
    2 комментария
  • Почему неправильно работает код?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    Почему-то ничего не выводит, если вводишь диапазон дат для Козерога.

    Потому что условие
    $birthday >= (int)date('z', mktime(0, 0, 0, 12, 22, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 1, 19, $currentYear))
    для даты 1991-12-22 будет выглядить так: 358 >= 356 И 358 <= 18

    Можно в тупую проверить козерогов в начале года отдельно от козерогов в конце года
    case ($birthday >= (int)date('z', mktime(0, 0, 0, 12, 22, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 12, 31, $currentYear))):
            echo "Козероги: $horoscopes[Козероги]";
            break;
        case ($birthday >= (int)date('z', mktime(0, 0, 0, 1, 1, $currentYear)) && $birthday <= (int)date('z', mktime(0, 0, 0, 1, 19, $currentYear))):
            echo "Козероги: $horoscopes[Козероги]";
            break;


    Еще можно доработать код:
    function getZodiacSign($date) {
        $zodiacSigns = [
            ['Козерог', '01-01', '01-19'],
            ['Водолей', '01-20', '02-18'],
            ['Рыбы', '02-19', '03-20'],
            ['Овен', '03-21', '04-19'],
            ['Телец', '04-20', '05-20'],
            ['Близнецы', '05-21', '06-20'],
            ['Рак', '06-21', '07-22'],
            ['Лев', '07-23', '08-22'],
            ['Дева', '08-23', '09-22'],
            ['Весы', '09-23', '10-22'],
            ['Скорпион', '10-23', '11-21'],
            ['Стрелец', '11-22', '12-21'],
            ['Козерог', '12-22', '12-31']
        ];
    
        $birthDate = date('m-d', strtotime($date));
    
        foreach ($zodiacSigns as $sign) {
            // Тут 0, 1, 2 не очень хороший код, можешь улучшить его самостоятельно, для примера сойдет
            if ($birthDate >= $sign[1] && $birthDate <= $sign[2]) {
                return $sign[0];
            }
        }
    
        return null;
    }
    
    if (isset($_GET['birthday'])) {
        if ($_GET['birthday'] === '') {
            echo 'Вы не выбрали дату рождения!';
        } else {
            $res = getZodiacSign($_GET['birthday']);
            echo $horoscopes[$res] ?? "error";
        }
    }
    Ответ написан
    Комментировать
  • Почему некорректно срабатывает функция .hasClass?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    $('.nextstep .next')
    - вернет все html элементы с такими классами
    дальше ты работаешь со списком как с одним элементом, ожидаешь что код будет разбирать составляющие списка по отдельности
    $(document).ready(function() {
           // проходим наши элементы циклом
    	$('.nextstep .next').each(function(i, obj) {
    		// проверяем условия для каждого элемента отдельно
    		if ($(obj).hasClass('active')) {
    			// применяем классы к соответствующему спану
    			$(obj).find('span').addClass('yes');
    		} else {
    			$(obj).find('span').addClass('no');
    		};
    	});
    });
    Ответ написан
    1 комментарий
  • Как корректно валидировать поля пароль?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    Переделать функцию checkPassword, применять проверку по регулярке к каждому элементу отдельно, проверку на совпадение только при вводе подтверждения пароля

    data-passwordrepeat="Проверьте правильность пароля"


    ...
    const passwordMessage = _element.dataset.password;
    const passwordMessageRepeat = _element.dataset.passwordrepeat;
    ...
    if(passwordMessage) {
                this.checkPassword(_element, passwordMessage, successMessage);
            }
            if(passwordMessageRepeat) {
                this.checkPassword(_element, passwordMessage, successMessage);
                this.matchingPasswords(passwordMessage, successMessage);
            }
    ...
    this.checkPassword = function (_element, message, successMessage) {
            const passwordRegExp = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
            const checkPassByRegExp = passwordRegExp.test(_element.value);
    
            if (!checkPassByRegExp) {
              this.createErrorTemplate(_element, message);
            } else {
              this.createSuccessTemplate(_element, successMessage);
            }
        }
    
        this.matchingPasswords = function (message, successMessage) {
            const allPasswords = _form.querySelectorAll('input[type="password"]');
            const arrPasswordValues = Array.from(allPasswords).map(item => item.value.trim());
            const checkPassByUniqueness = new Set(arrPasswordValues).size === 1;
    
            if (!checkPassByUniqueness) {
                allPasswords.forEach((value) => this.createErrorTemplate(value, message));
            } else {
                allPasswords.forEach(value => this.createSuccessTemplate(value, successMessage));
            }
        }


    Что-то типо такого, над качеством кода сам покури

    PS оффтоп
    this.createErrorTemplate = function (_element, message) {
            const parent = _element.closest(`.${labelClass}`);
            parent.classList.add(errorClass);
            parent.classList.remove(successClass);
            parent.querySelectorAll(`.${errorItemClass}, .${successItemClass}`).forEach(item => item.remove());
            parent.insertAdjacentHTML('beforeend', `<small class=${errorItemClass}>${message}</small>`);
        }
    
        this.createSuccessTemplate = function (_element, message) {
            const parent = _element.closest(`.${labelClass}`);
            if (parent) {
                parent.classList.add(successClass);
                parent.classList.remove(errorClass);
                parent.querySelectorAll(`.${errorItemClass}, .${successItemClass}`).forEach(item => item.remove());
                parent.insertAdjacentHTML('beforeend',`<small class=${successItemClass}>${message}</small>`)
            }
        }
    Ответ написан
    Комментировать
  • Почему код некорректно работает с кириллицей?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    Потому что кириллица, когда ты берешь $uniqueSymbols[$i] ты берешь не итую букву, а итый байт

    $letter = mb_substr($uniqueSymbols, $i, 1);
    echo $letter .' - '. round((mb_substr_count($string, $letter) / mb_strlen($string)) * 100, 1) . ' %<br><br>';
    Ответ написан
    1 комментарий
  • Как решить проблемы c регистрацией посредников (Middleware) в Laravel 11 версии?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    Я развернул новый проект лары и скопировал туда твой код, все работает

    1. Проверь что путь файла CheckAdminMiddleware.php соответствует неймспейсу
    App\Http\Middleware

    2. Попробуй сбросить кэш
    php artisan cache:clear
    composer dump-autoload

    3. Если запускаешь проект в докере то убедись что изменения с локали ушли в контейнер

    UPD
    Не сразу обратил внимание что у меня не 11 лара, установилась Laravel 10

    В ларавель 11 больше нет App\Http\Kernel::class (ну наверное его можно притащить туда и какими-то костылями заставить работать, но речь не об этом)

    Все конфигурации теперь в bootstrap/app.php
    Добавь в bootstrap/app.php
    ->withMiddleware(function (Middleware $middleware) {
    ...
            $middleware->alias([
                'admin' => App\Http\Middleware\CheckAdminMiddleware::class
            ]);
        })


    https://laravel.com/docs/11.x/releases#structure
    Ответ написан
    5 комментариев
  • Нету DPR в инструментарии разработчика Google Chrome, как сделать?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    Ответ написан
    Комментировать
  • Почему добавленная через JS ссылка срабатывает только на второй клик?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    Проблема в эвенте change, при первом клике сбрасывается фокус с элемента и срабатывает событие change, которое переделывает div с ссылками. Я бы поменял
    _city_search_name.addEventListener('change', searchCity);
    _city_search_name.addEventListener('keyup', searchCity);

    на
    _city_search_name.addEventListener('input', searchCity);
    Ответ написан
    1 комментарий
  • Почему текст вылезает за пределы блока?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    стилизация для img не работает потому что в scss прописано about__img, а в html about__icon из-за этого и из-за ширины картинок блоки получаются шире чем должны быть

    кейс по ссылке не валидный, чтобы восстановить кейс надо в src прописать ссылку на картинку с шириной более чем 823 / 3 = 274.3 пикселей
    где 823 - max-width в about__body
    3 - количество блоков
    Ответ написан
    1 комментарий
  • Почему функция query выводит N/A?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    1. К вопросу про N\A
    N\A получаю если "ОТ" > "ДО" или значение в диапазоне не найдено
    примеры:
    D4 = 4 F4 = 3 -> N\A
    D4 = 299 F4 = 300 -> N\A

    в остальных случаях получаю корректные значения

    2. К вопросу об ошибке "Не удалось интерпретировать query string. Подробности: Параметр 2 в функции QUERY:PARSE_ERROR: Encountered"

    Это связано с тем как Query обрабатывает числа с плавающей точкой. Query ожидает что все будет записано через точку, а у тебя запись через запятую. Чтобы не править настройки региона предлагаю использовать другую формулу:
    =FILTER('Параметры'!B2:C; 'Параметры'!A2:A = D3; 'Параметры'!H2:H >= D4; 'Параметры'!H2:H <= F4)


    оффтоп:
    на всякий случай там где введены числа я выбрал формат "числа" и прописал значения ячеек через =
    например в D4 value == =1
    Ответ написан
    Комментировать
  • Как набрать нужную сумму из определенного количества монет?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    пусть a, b, c - номиналы монет, x, y, z - количество монет каждого номинала и e - сумма которую нужно набрать. Получается выражение x * a + y * b + z * c = e.

    - это не правильное выражение (точнее оно будет верным только в частном случае, когда искомая сумма будет равна количеству всех имеющихся денег)

    x[i] * a + y[j] * b + z[k] * c = e - вот это правильное

    Что мы знаем из входных данных? мы знаем сколько у нас есть денег всего, это как раз x * a + y * b + z * c, пусть это будет N;
    Дальше мы знаем сумму которую необходимо набрать это e;
    Нам нужно понять сколько раз мы можем получить e из N, пусть это будет Q
    N / e = M - количество способов получить e математически
    Это нам не подходит так как нам надо учитывать номиналы, но теперь у нас есть ограничение
    0 <= Q <= M
    это к вопросу
    как убедиться что я получу наибольшее количество


    Дальше будет вариант решения задачи неоптимальным способом "как получится" (смотри статус профиля) более правильным вариантом будет почитать другие ответы на вопрос и составить собственный вариант решения задачи с учетом теории из линейного программирования

    1. понять, какие номиналы будут участвовать в получение e (и есть ли они у нас в целом)
    2. отсечь случай e === N
    3. получить все комбинации для получения e
    4. понять какие из них сочитаются между собой с учетом ограниченности монет
    5. найти наибольшее количество сочитаемых

    Дальше предоставляю говнокод на js который решает эту задачу как минимум в частных случаях (я проверил парочку вариантов входных параметров)

    Оно

    // Входные параметры
    
    const a = 1;
    const b = 2;
    const c = 5;
    
    const x = 3;
    const y = 2;
    const z = 2;
    
    const e = 7;
    
    
    // Отсекаем лишнее
    
    let params = [];
    
    if (getEntryNominal(c, e) >= 1) {
        params.push({
            'count': z,
            'nominal': c
        });
    }
    
    if (getEntryNominal(b, e) >= 1) {
        params.push({
            'count': y,
            'nominal': b
        });
    }
    
    if (getEntryNominal(a, e)  >= 1) {
        params.push({
            'count': x,
            'nominal': a
        });
    }
    
    let count = 0;
    const N = getN(a, b, c, x, y, z);
    if (N === e) {
        count = 1;
    } else {
        count = getCombinationsAll(params, e)
    }
    
    console.log(count);
    
    
    function getN(a, b, c, x, y, z) {
        return x * a + y * b + z * c;
    }
    
    function getEntryNominal(nominal, e) {
        return Math.floor(e / nominal);
    }
    
    
    function getCombinationsAll(params, e) {
        let Q = 0;
    
        let combinations = [];
    
        let maxLength = parseInt() + parseInt(params[1]?.count) + parseInt((params[2])?.count ?? 0);
        const iM = (params[0]?.count ?? 0);
        const jM = (params[1]?.count ?? 0);
        const kM = (params[2]?.count ?? 0);
    
        let i = iM;
        let j = jM;
        let k = kM;
    
        let a = (params[0]?.nominal ?? 0);
        let b = (params[1]?.nominal ?? 0);
        let c = (params[2]?.nominal ?? 0);
    
        // Вычисляем количество всех возможных комбинаций из которых получается e
        while (i + j + k > 0) {
    	let bufE = getN((params[0]?.nominal ?? 0), (params[1]?.nominal ?? 0), (params[2]?.nominal ?? 0), i, j, k);
    
            if (bufE === e) {
                let obj = {};
                obj[a] = i;
                obj[b] = j;
                obj[c] = k;
                combinations.push(obj);
            }
            k--;
            if (k < 0) {
                j--;
                k = kM;
            }
            if (j < 0) {
                i--;
                j = jM;
            }
    
            if (i < 0) {
                i = 0 
            }
        }
    
        console.log(combinations);
    
        // составим список сочитаемых комбинаций
        let combComb = [];
        for (w = 0; w < combinations.length; w++) {
            i = iM;
            j = jM;
            k = kM;
    
            combComb[w] = [];
    
            for (v = 0; v < combinations.length; v++) {
                if (
                    i - combinations[v][a] >= 0
                    && j - combinations[v][b] >= 0
                    && k - combinations[v][c] >= 0
                ) {
                    i -= combinations[v][a];
                    j -= combinations[v][b];
                    k -= combinations[v][c];
    
                    combComb[w].push(combinations[v]);
                }
            }
        }
    
        // ищем максимальное количество комбинаций
        for (w = 0; w < combComb.length; w++) {
            if (combComb[w].length > Q) {
                Q = combComb[w].length;
            }
        }
    
        console.log(combComb);
    
        return Q;
    }

    Ответ написан
    Комментировать
  • Как в Linux найти файлы одинакового размера?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    https://linuxconfig.org/how-to-use-find-command-to...

    upd

    https://stackoverflow.com/questions/7541616/how-to...
    ls -l|grep '^-'|awk '{if(a[$5]){ a[$5]=a[$5]"\n"$NF; b[$5]++;} else a[$5]=$NF} END{for(x in b)print a[x];}'


    upd 2
    этот код выведет файлы с одинаковым размером, смотри рекурсивно от текущей папки и отображает вес файла
    ls -lR | grep '^-' | awk '{
        f = ""; 
        if (NF > 9) 
            for (i = 9; i <= NF; i++) 
                f = f ? f" "$i : $i; 
        else 
            f = $9;
        
        if (a[$5]) { 
            a[$5] = a[$5]"\n"$5" "f; 
            b[$5]++; 
        } else { 
            a[$5] = $5" "f 
        }
    } 
    END { 
        for (x in b) 
            print a[x]; 
    }'


    upd 3
    а тебе вот прям нужен баш? можно на питоне скрипт сделать
    Ответ написан
    7 комментариев
  • Как закруглить одну из граней элемента внутрь (сделать впалой)?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    Я бы пошел другим путем и не стал бы скруглять кучу дивов. А вместо этого спрятал бы нескругленные части.

    Добавляем новый див
    ...
    <div class="menu">
        <div class="toggle-hidden">
        </div>
        <div class="toggle">
    ...


    Прописываем ему класс
    .toggle-hidden {
      content: '';
      display: block;
      width: 65px;
      height: 65px;
      z-index: 10000;
      overflow: hidden;
      position: absolute;
      background: linear-gradient(45deg, #8460ed, #ff1252); // даем цвет чтобы спрятать ненужное
      background-size: 200% 200%; // тут можно поиграться с циферками
      background-position: calc(50% - 65px/2) calc(50% - 65px/2);  // чтобы цвета больше совпадали с боди
      border-radius: 50%;
    }


    И дальше остается только цвет подобрать чтоб в фон попадало идеально

    Касательно иконок
    ion-icon {
      color: white;
      transform: rotate(calc(-360deg / 8 * var(--i)));
      display: inline-block;
    }
    Ответ написан
    1 комментарий
  • Как вывести порядковый номер недели с помощью дизайнера бизнес-процессов в Битрикс24?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    Ну по идеи вот так получишь порядковый номер недели в месяце
    (date('W') - date('W', strtotime('first day of this month')) + 1)


    А вот так номер недели в году
    date('W')

    А дальше вставляешь это куда тебе нужно
    Или не в этом вопрос был?

    https://www.php.net/manual/ru/datetime.format.php
    Ответ написан
    Комментировать