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

    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 комментария
  • При помощи какого ПО можно создать компактную gif анимацию съемки экрана?

    @yellowmew
    Cloud infrastructure, monitoring engineer. SRE
    672dac093a554364213597.gif
    Например эта gif сделан Cyotek Gif Animator, но для этих целей пойдет по моему вообще что угодно, умеющее создавать гифки из последовательности картинок
    В документации, причем как вы пишете "в текстовом документе", по-моему, важнее показать важные моменты, чем демонстрировать передвижение мышки из точки А в точку Б
    Ответ написан
    1 комментарий
  • Что это за формат видео?

    @aab137
    Для определения формата видео можно воспользоваться утилитой ffmpeg
    ffmpeg -i <ваша ссылка с m3u8>
    Будут выведены метаданные видео, включая формат, кодек и т.д.
    С помощью этой же утилиты можно и скачивать видео, а не мучиться, склеивая чанки
    ffmpeg -i <ваша ссылка с m3u8> -vcodec copy -acodec copy output.mp4
    Ответ написан
  • Что выбрать для разработки мобильного приложения?

    @Refguser
    Решения для бизнеса: корп.сайты, ИМ, боты и пр.
    1. PWA - это недоприложения. Не нужно это если речь не об узком круге пользователей.

    2. В твоём случае я бы наверное остановился на React Native, но есть и вариант с no/low code конструкторами типа Flutter Flow или AppMaster.

    Каким образом можно запустить симулятор IOS?

    Есть сервисы почасовой (а то и поминутной) аренды.
    Ответ написан
    Комментировать
  • Что выбрать для разработки мобильного приложения?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Сейчас пытаюсь на виртуалке macOS поднять. Есть какие-то хорошие советы по этому поводу?

    Только старые версии ось-х и только на интелловском процессоре. На АМД тоже можно, но только на одном ядре, медленно и многими днями секаса чтобы просто поставить и оно хотя бы работало. Либо арендовать мак. При общей стоимости разработки ПО - копейки.
    Ответ написан
    Комментировать
  • Как сохранить очередность выполнения заданий в очереди?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Надо начать читать документацию и не изобретать велосипедов с БД и прочим.
    Ответ написан
    5 комментариев
  • Как разместить 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 комментария
  • Как самому загрузить свое приложение на свой смартфон на Android?

    @pfg21
    ex-турист
    канешна. куча.
    закидываешь на смартфон - устанавливаешь. в последних андроидах у приложения должно разрешение устанавливать приложения из сторонних источников.
    гуглплей это репозиторий приложений, причем не единственный. ставишь другой репозиторий.
    еще есть Android Debug Dridge - интерфейс управления андроидом с компухтера.
    изучай литературу, а не ролики в ютубе смотри....
    Ответ написан
    4 комментария
  • Как решить проблемы 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 комментариев
  • Как скачать содержимое сайта?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Либо делать реверс-инжиниринг, разбираться, что там в JS и WASM накручено, либо просто сделать скриншоты и отправить в распознавалку.
    Второе, IMHO, на пару порядков быстрее, даже с учётом того, что скриншоты надо делать с увеличением.
    Ответ написан
    1 комментарий
  • Как организовать оптимальную безопасность для своего онлайн мультиплеера на Android?

    Steel_Balls
    @Steel_Balls
    Ты всё правильно рассуждаешь.
    Исходить из принципа: все клиенты - мошенники.
    0% доверия клиенту.
    Не хранить у клиента никакой информации.
    Клиент - это только рендеринг данных.
    Вся логика - на сервере.

    Вся логика на сервере. Клиенту отдаются только соевые данные для рендеринга.
    Интересует. как в андроид приложениях защититься от подмены данных отправляемых на сервер и быть уверенным, что каждая игра будет честной и без читерства.

    Защита от подмены данных делается простым старым дедовским способом - подписью.
    На сервере и на клиенте есть одинаковый временный ключ для подписи - signKey - длинная строка.
    Клиент отправляет тебе POST-запрос со всеми данными: тип монеты, количество монет, ID юзера,...+ sign=HASH(тип_монеты+количество+userId+...+signKey)
    HASH - это хэш-функция. Лучше использовать Bcrypt вместо слабого MD5.
    Во-первых, всё делается через HTTPS.
    Во-вторых, все операции - через сессии или аутентификацию по JWT.
    На сервере ты делашь следующее:
    - проверяешь соответствие переданных данных ожидаемым: userId (из JWT), тип монеты и прочее. От клиента ты ожидаешь МИНИМУМ изменяемых данных (количество фишек, например)
    - проверяешь все поля на типы данных и ОЧЕНЬ ВАЖНО! - на длину передаваемых значений. Не допускается в строковом поле передавать больше, скажем, 20 символов. Это очень сильно ограничивает брутфорс для поиска коллизии хэша. Количество фишек должно быть целым положительным числом в определённых допустимых пределах (от 0 до 1000, напримр. Чем меньше диапазон, тем лучше)
    - делаешь хэш по переданным значениям и сравниваешь его с переданным хэшем от клиента. Если не совпадают - юзер подменил количество монет.
    На сервере у тебя должна быть защита от брутфорса: от одного userId, IP-адреса должно приходить не более 1-3 запросов в секунду. Если больше - банить на некоторое время, например, на 1 минуту.

    Это то, что касается систем, где данные передаются ОТ пользователя серверу.

    В твоём же случае - это просто игра.
    И здесь поступают проще.
    Всю логику делают на сервере. Юзер кликнул на монету - передаём серверу инфу: click(userId, x,y)
    И вот тут включается логика сервера: он смотрит что за юзер кликнул, куда кликнул, как часто, разрешено ли ему это делать... Если всё в порядке, то сервер отправляет клиенту - Ок, вот тебе заработанные 10 монет. Клиент отрисовывает монетки, юзер радуется.
    В этом случае полностью исключается подмена юзером количество монет, потому что всё решает сервер. Клиент - это просто терминал для отображения данных и отправки кликов на сервер.
    Ответ написан
    1 комментарий
  • Как изменить размер шрифта phpstorm во время работы?

    delphinpro
    @delphinpro Куратор тега PhpStorm
    frontend developer
    Как масштаб в браузере – колесом мыши с зажатым контролом

    66daef7d1ed6a518008944.png
    Ответ написан
    Комментировать
  • Как убрать "Property does not exist on type" в рекурсивном интерфейсе?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    На каждом уровне проверять, что значение не string и не number. Иначе никак, ты сам задал такой тип, и ts не даст тебе совершить ошибку.

    Если у тебя только 2 уровня, то не надо рекурсии:
    interface CSS {
        [k: string]: {
            [k: string]: string | number 
        }
    }


    Если ты хочешь сузить тип при создании констатны, можно сделать так:
    const css = {
        default: {
            color: '#676767',
            border: '1px solid',
            border_color: '#C4C4C4',
            border_radius: '110px',
    
            padding: '16px 21px',
        }
    } satisfies CSS;
    Ответ написан
    Комментировать
  • Какой тег html является ни чем?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    нет такого
    Ответ написан
    Комментировать
  • Как типизировать пропсы в компоненте React?

    Alexandroppolus
    @Alexandroppolus
    кодир
    В данной постановке задачи - никак.

    [key: string]: string | boolean; предполагает, что у тебя значения всех пропсов, кроме пропсов-симболов, должны быть в рамках string | boolean. Ну а массив строк не вписывается.

    Здесь для key нужен тип "все строки, кроме 'items' ", но TS на данный момент такое не может.

    Можно для названий всех доп. пропсов задать какой-то шаблон. Например, вот так они все должны начинаться на символ подчеркивания:
    type CompanyInfoSectionProps = {
        title: string;
        to: string;
        items: string[];
        [key: `_${string}`]: string | boolean;
    };


    соответственно, все пропсы, названия которых не соответствуют шаблону, не ограничены в типе значений.
    Ответ написан
    Комментировать
  • Почему не работают алиасы?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    paths в tsconfig - это чисто справочная информация для подсветки, добавленная из расчёта, что вы уже используете какой-то сборщик который такие пути умеет.
    Сам по себе он влияет точно и исключительно на подсветку, нужны сторонние сборщики и\или модули.
    Это by design и wont fix.

    Предполагаемое разработчиками решение: взять какой-ниь vite или webpack и настроить там руками точно такие же алиасы.
    Популярный костыль, который сделает это за тебя для любых вариантов, в том числе и ts-node: tsconfig-paths
    Ответ написан
    Комментировать
  • Как кастомизировать вывод панели phpStrom?

    ПКМ по свободному месту в этой панели -> Appearance -> Breadcrumbs -> Top.

    P.S. А, нет - похоже, это какая-то другая панель. Скорее всего, в этой панели настройки точно так же по ПКМ настройки открываются.
    Ну, пусть будет ответ для истории, может, кому-то другому поможет.
    Ответ написан
    1 комментарий
  • Как кастомизировать вывод панели phpStrom?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Ответ написан
    Комментировать
  • Как отфильтровать модель по наличию связи с другой моделью?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Waste::whereHas('components', static fn($q) => $q->whereIn('id', [1,2,3]))
    Ответ написан
    Комментировать
  • Как отфильтровать модель по наличию связи с другой моделью?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    If you need even more power, you may use the whereHas and orWhereHas methods to define additional query constraints on your has queries, such as inspecting the content of a comment:

    use Illuminate\Database\Eloquent\Builder;
     
    // Retrieve posts with at least one comment containing words like code%...
    $posts = Post::whereHas('comments', function (Builder $query) {
        $query->where('content', 'like', 'code%');
    })->get();
     
    // Retrieve posts with at least ten comments containing words like code%...
    $posts = Post::whereHas('comments', function (Builder $query) {
        $query->where('content', 'like', 'code%');
    }, '>=', 10)->get();
    https://laravel.com/docs/11.x/eloquent-relationshi...
    Ответ написан
    7 комментариев