Задать вопрос
  • Как самому загрузить свое приложение на свой смартфон на 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 комментариев
  • Почему не собирается проект из за PrismaAdapter?

    Alexandroppolus
    @Alexandroppolus
    кодир
    ["useVerificationToken", "getUserByEmail"].filter((method) => !adapter[method])


    Этот твой массив ["useVerificationToken", "getUserByEmail"] автоматически определяется как массив строк.

    Сделай так:
    (["useVerificationToken",  "getUserByEmail"] as const).filter((method) => !adapter[method])


    -----
    в dev-режиме скорее всего выставлен конфиг suppressImplicitAnyIndexErrors=true, который подавляет ошибку. Посмотри конфиги, если найдешь эту содомию, выпиливай сразу.
    Ответ написан
    9 комментариев
  • Как найти причину почему отказал Wireguard VPN?

    @q2digger
    никого не трогаю, починяю примус
    openvpn и wireguard блокируются роскомнадзором. именно вчера похоже чтото подкрутили - много жалоб уже.
    Ответ написан
    Комментировать
  • Кто-нибудь знает что за неизвестная железка подключена посторонними к роутеру?

    anthtml
    @anthtml
    Системный администратор программист радиолюбитель
    https://www.raspberrypi.com/products/raspberry-pi-5/
    Стявят VPN прокси сервер (выходную TOR-ноду)
    Чтобы потом "товарищи" приходили к Вам, а не к ним или их клиентам
    Ответ написан
    1 комментарий
  • Какая ширина канала нужна для видеохостинга?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Ну, Netflix писали, что у них один узел стримит как раз до 40 Гбит/сек. Сколько все ЦОДы отдают - представить страшно.
    Ответ написан
    Комментировать
  • Почему маршруты определенные в пользовательском сервис-провайдере в Laraval недоступны?

    pickHabr
    @pickHabr
    Костыльных дел мастер
    <?php
    
    namespace App\Modules\Orders;
    
    use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
    
    class OrdersServiceProvider extends ServiceProvider
    {
        public function boot(): void
        {
           $this->routes(function () {
                Route::prefix('api/orders')
                    ->group(base_path('routes/api/orders.php'));
            });
        }
    }


    Также, рекомендую сравнить неймспейс в провайдере и в конфиге где его подключаешь, и путь к новому файлу с роутами, что в папке routes действительно есть подпапка апи и в ней файл
    Ответ написан
    Комментировать
  • Изучение vue без хорошего знания JS?

    @SigmaMale
    Middle Frontend developer (плюс минус middle)
    Использовать vue не зная JS теоретически можно, при условии, что умеете программировать на другом языке, но Ваши возможности будут очень сильно ограничены.

    Кроме того, решение самых простых проблем и ошибок превратится для Вас в ад. Получится замкнутый круг: Вы не знаете JS потому что не любите его, а не любите потому что у Вас будет негативный опыт с ним, который возникнет из за того, что Вы не знаете JS.

    Скорее всего, Вы не любите JS из за того, что уже привыкли к логике и синтаксису Go. Человеческий мозг не очень любит оказываться в новой обстановке. Среднестатистический программист знает 3 языка программирования, если Вы планируете работать в этой области, то рано или поздно Вам придется работать с другими, не привычными технологиями. По сути, в Вашем случаи, лучший способ полюбить JS - это поработать с ним какое то время, что бы мозг привык. В прошлом я сильно не любил язык PHP, так было до тех пор, пока я не поработал с ним какое то время и не привык ко всем его странностям. Сейчас я к нему нейтрально отношусь.

    P.S.
    и на vue просто в 1 файле сделал разметку с css и используешь в других страницах, а в HTML нужно копировать html и переносить, что не особо нравится.

    Для вёрстки Вы можете начать использовать шаблонизаторы (pug) и препроцессоры (SCSS). Они решают описанную Вами проблему. Обычно для их компиляции используют gulp или webpack, но Вам как новичку я рекомендую использовать программу preposs. Хотя в целом, для маленьких тестовых проектов - это вообще не проблема.
    Ответ написан
    2 комментария
  • Как запустить composer i в контейнере PHP что бы он остался в статусе Up?

    liaFcipE
    @liaFcipE
    Ну потому, что ты запускаешь композер... И все, это весь твой ENTRYPOINT, который отработав отдает код 1. Ты же не запускаешь свой условный php-fpm и правда этому удивляешься?

    > что бы при старте контейнера в нем сразу загружались все перечисленные зависимости из файла composer.json

    В этом не то, чтобы много смысла, Dockerfile это не про старт контейнера, а его сборку. Если тебе нужно будет обновить зависимости - ты будешь пересобирать весь образ? Это не очень логично.

    Можно запустить любой готовый образ композера с командой install, чтобы у тебя приехали все зависимости.
    Можно зайти в шелл запущенного контейнера php и сделать composer i.
    Можно конечно написать рабочий Dockerfile, который делает RUN composer i, а в ENTRYPOINT'е имеет запуск демона php-fpm...
    Ответ написан
    Комментировать