• Как получить "хеш"/сравнить изображение?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Гуглить perceptual hash.

    Одна из реализаций

    https://github.com/jenssegers/imagehash
    Ответ написан
    2 комментария
  • Headerless cms на базе Laravel можно/нужно?

    @nozzy
    Symfony, Laravel, SQL
    Laravel уже заточен для headless, нужно использовать routes/api.php, там убраны все middleware, которые используются в обычном приложении (routes/web.php), JSON для ответа.
    Для админки используй backend в Winter CMS, хватает за глаза.
    И категорически не надо никаких WP.
    Ответ написан
    2 комментария
  • Какие отношения в "юридическом правовом поле" относительно "Домена"(доменного имени) существуют?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Какой тип собственности?

    Никакой. Тут нечего передавать в собственность - нет обьекта собственности.
    Какие правовые акты / статьи(каких кодексов) используются для регулирования отношений и сопров?

    1. Договор об оказании услуг. Он у каждого регистратора свой, берем для примера Договор с АО "РСИЦ" (Руцентр, nic.ru) - Договор с физиком от nic.ru
    2. ГК РФ, глава 39 "Возмездное оказание услуг"

    Термины "купить домен" или даже "арендовать домен" - по сути юридически неверны. Покупка/аренда подразумевает передачу в собственность (постоянную или временную) некоего материального обьекта.

    Доменное имя - нематериальный обьект, оно возникает в момент заключения договора услуг и исчезает после его расторжения.

    Поэтому юридически верным будет говорить об оказании услуг "администрирования доменного имени", "аминистрирования первочной зоны DNS", "администрировании вторичной зоны DNS" и прочих услугах.

    Тогда конечно же возникает вопрос - а что же я покупаю-то за свои кровные?

    Покупается право занести в справочник, которым пользуются все (DNS) - информацию, которая нужна тебе.
    Ответ написан
  • Как правильно подходить к возвращаемым типам функциях php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хорошие вопросы.
    Разумеется, увеличивать количество запросов к БД ради красивой типизации - это абсолютно не вариант.

    Как можно увидеть, в приведенной цитате написано не однозначно, а "скорее всего".
    И поэтому надо конечно стараться, чтобы функция возвращала какое-то одно значение, но не делать этого любой ценой. Поэтому getUserDataFromDatabase вполне может возвращать array|false, а getUserIdFromDatabase - int|false, хотя я бы с ней не заморочивался, первой вполне достаточно. А userIsPresentInDb вообще не нужна, вместо неё можно использовать одну их предыдущих.

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

    return $result ?: []; // дёшево и сердито

    Но это будет всё равно не очень красиво. В одной стороны - да, для проверки, вернула ли функция непустое значение, такой вариант вполне сгодится. Но с другой стороны все равно как-то неаккуратненько. Ведь мы на самом деле ждём не абы какой массив, а вполне определённый, с конкретным набором полей. То есть, если эта функция вернет массив вида [0, 42, 100500], то это будет явно не то, что нам нужно, но при этом типизация и слова поперёк не скажет.

    Если думать от типизации, то функция getUserDataFromDatabase, возвращающая какой-то абстрактный массив - это нонсенс, бессмыслица. Эта функция должна возвращать юзера. Поэтому в идеале надо придумать способ указать, что функция возвращает не абстрактный, а конкретный массив определенного формата. Тем более, что такой способ как раз есть, ведь типизованный массив - это же объект! И для данного случая даже специальный паттерн есть - ValueObject (хотя в случае с пользователем лучше будет все-таки делать полноценный класс, содержащий не только данные, но и методы, например auth(), который сравнивает хэш пароля с введенным).

    Соответственно, в идеале функция должна возвращать объект, представляющий пользователя.

    И уже в этом объекте поле id может либо либо быть нулём, либо иметь какое-то положительное значение. Или даже объект может содержать отдельное свойство, заполнен/не заполнен.

    И вот в этом случае типизация заиграет совсем новыми красками, и будет использоваться на 100%
    function getUserFromDb( int $userId ) : UserObject {
            return $result ? UserObject::fillFromArray($result) : new UserObject();
    };
    $user = getUserFromDb();
    if (!$user->id) {
        // нинашли :'(
    }


    Но опять же, как пишет ниже Сергей delphinpro, зависит от задачи.
    И решив проблему правильной типизации значения, которое функция вернет, если нашла пользователя, можно вернуться к вопросу о том, что возвращать, если функция ничего не нашла. И в этом случае вполне подходящим вариантом будет вернуть null
    function getUserFromDb( int $userId ) : ?UserObject {
        return $result ? UserObject::fillFromArray($result) : null;
    };
    
    if ($user = getUserFromDb()) {
        // нашли :)
    }
    Ответ написан
    6 комментариев
  • Подтверждение почты при регистрации - PHP?

    Почтовые сервера (фильтр антиспама, антивирь), получая письмо, могут для проверки на вирусы пройтись и по ссылкам в письме, вот ссылка и протухает. А может и браузер при отрытии письма ссылку перепроверить. Ставьте защиту, например, в виде банального чекбокса, чтоб ограничить возможность ложного срабатывания.
    Ответ написан
    7 комментариев
  • Почему коэффициенты показывает все 0?

    Adamos
    @Adamos
    name='coefficients[$i][$j]'
    $_POST["coefficient-$i-$j"]

    Можно один раз воткнуть в код print_r($_POST), посмотреть, что в нем пришло, и сравнить с тем, что ожидается.
    Или просто включить все ошибки и насладиться простыней варнингов о несуществующем индексе массива.
    Ответ написан
    Комментировать
  • Как лучше сделать добавление корзины/избранного?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Все очень просто.
    Надо всего лишь различать зарегистрированных и незарегистрированных пользователей.
    Для первых ничего не пишется на клиента, а только в базу.
    Для вторых ровно наоборот - в базу писать нечего, поэтому все сохраняется локально.
    Плюс нужна процедура мержа с клиента в базу, когда в момент авторизации что-то есть локальное. По уму надо у пользователя спросить, "вот такие-то товары были в корзине, добавить их к вашей?" Но многие магазины не заморочиваются и просто сливают локальную корзину с той что лежит в базе.
    Ответ написан
    9 комментариев
  • Python как быстро получить число элементов архива tar.gz?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Не получится из-за специфики устройства tar-файла. Пока весь не прочитаешь, не узнаешь сколько в нём каталогов. Это потоковый формат, а тут он ещё и сжат сверху gzip'ом.

    Это как посчитать быстро сколько вещей в чемодане. Пока по одной не вытащишь и каждую не посчитаешь - не узнаешь.
    У других архиваторов, например zip, есть индексная табличка. Это как бумажка с перечнем всех вещей в чемодане. Она лежит прямо под крышкой и её можно достать первой.

    Придётся как-то обходить эту проблему. Например использовать другой формат архива, или еред архивацией делать отдельный файл с перечнем всех файлов, и его класть в архив первым. А может быть вам и не нужно на самом деле количество элементов в архиве,а того, что вы этим количеством хотите добиться можно достичь иначе.
    Ответ написан
    2 комментария
  • Зачем для кеширования использовать Redis, если можно сделать файловое кеширование?

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

    Но понятие кэша гораздо шире. Кэшироваться может и специфичная для конкретного пользователя или запроса информация. В этом случае никаких .php файлов не напасешься.

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

    Еще одна причина, не главная, но все равно важная - масштабирование. Один сервис редиса можно использовать с несколькими инстансами РНР. Плюс сам редис можно масштабировать на несколько физических инстансов.
    Ответ написан
    Комментировать
  • Можно ли в php найти все отнаследованные классы одного определенного?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    $result = []);
    foreach (get_declared_classes() as $class) {
        if (is_subclass_of($class, $parent))
            $result[] = $class;
        }
    }
    Ответ написан
    1 комментарий
  • Как определить, что у пользователя включен vpn?

    @AlexVWill
    Есть подозрение, что из-за него некорректно работает форма авторизации / регистрации на сайте.

    Надо бороться с причиной, а не с явлением как таковым. Если форма криво работает из-под VPN, то виновата форма, а не VPN. Половина мира уже сидит в интеренет под VPN, поэтому стоит задуматься о том, что у тебя не так реализовано. Тем более, что каких то объективных причин нарушения работы web-сервера если на него поступают запросы от VPN нет.
    Я бы скорее предположил, что в форме реализованы какие то скрипты (возможно даже сторонние JS библиотеки), который блокировщики рекламы считают спамом, и режут их, отсюда и проблема. Надо конкретно смотреть, что не так.
    ак определить, что у пользователя включен vpn

    Ну определишь ты, и что дальше? Как это тебе поможет реализовать исправление ошибки формы? Лучше задуматься о том, как исправить форму, чтобы все могkи ей пользоваться независимо от VPN.
    Ответ написан
    4 комментария
  • Как заменить символы в начале и в конгце строки?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Подключить пакет для парсинга markdown и скормить ему эту строку.
    Зачем самому писать то, что уже давно написано?
    Ответ написан
    Комментировать
  • Переменная и namespace?

    toxa82
    @toxa82
    Смотря как вы подключаете файл с объявленной переменной. Переменные вне нэймспэйсов, но если вы подключаете файл в функции/методе, то эта переменная будет видна только в этой функции/методе. Подробнее вам нужно читать про области видимости.
    У вас извращенное представление о правильном коде, то что вы пишите это полная фигня. Я б на вашем месте описал глобальную цель, а то у вас уже второй вопрос про неймспейсы, которые вы неправильно поняли и пытаетесь криво использовать.
    Ответ написан
    2 комментария
  • Хочу изучить внутренности php, какую литературу посоветуете?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Ответ написан
    Комментировать
  • Почему не выполняется функция из подгруженного через ajax контента?

    @romazhan
    Вызов функции `jsDo` из тега `a` с использованием атрибута `onclick` работает только если функция объявлена в области видимости, в которой выполняется обработчик события `click`. Это означает, что если функция `jsDo` объявлена в модуле, то она не будет доступна для вызова из разметки HTML.

    Одна из возможных реализаций с учетом ООП - это создание экземпляра класса с нужными методами, в которые можно передавать необходимые параметры, и обработка события `click` у тега `a` через вызов этих методов.

    Например, можно создать класс `PopupHandler`, содержащий метод `open`, который будет отвечать за обработку нажатия на ссылку:
    class PopupHandler {
      private ajax: Ajax;
    
      constructor() {
        this.ajax = new Ajax();
      }
    
      open(action: string, title: string): void {
        this.ajax.setRequest({ action, title });
        this.ajax.resultProcessing('.popup__ajax');
      }
    }
    
    const handler = new PopupHandler();

    Теперь вы можете использовать экземпляр класса `PopupHandler` для обработки события `click` у тега `a`:
    <a href="#popup" class="popup-link" onclick="handler.open('two', '#TWO')">Попап №2</a>

    Таким образом, функция `open` будет вызываться при каждом нажатии на ссылку, и вы можете использовать ее для обработки запроса с нужными параметрами.

    Класс `PopupHandler` должен быть объявлен в области видимости, доступной из разметки HTML. Это может быть файл, подключенный к странице через тег script, или модуль, импортируемый с помощью директивы `import`.
    Ответ написан
    1 комментарий
  • Можете опознать хэш функцию?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Это не хэш, это UUID Version 4 Variant 1, полностью случайно генерируемые значения за исключением кодов версии и варианта.
    Ответ написан
    1 комментарий
  • Как устроена структура маркетплейса?

    @mxrdxfxrrx
    flstudio20, py3.x
    https://vc.ru/dev/198863-kak-sozdat-marketpleys-ko...
    Отличная статья, тут написана структура back-end, про бд и про остальные составные части с алгоритмами
    Ответ написан
    3 комментария