• Почему Telegram bot API метод answerCallbackQuery не показывает алерт?

    nastya97core
    @nastya97core
    Начинающий программист
    попробуй вот это:
    $tg = json_decode(file_get_contents('php://input'), true);
    function tlgrm($method, $data, $client) {
      $data["chat_id"] = $client;
      $data["parse_mode"] = "html";
      $ch = curl_init("https://api.telegram.org/---токен---/$method");
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      $r = json_decode(curl_exec($ch), true);
      curl_close($ch);
      return $r;
    }
     
    $client = $tg['callback_query']['from']['id'];
    $cb_id = $tg['callback_query']['id'];
    tlgrm('answerCallbackQuery', ['callback_query_id'=> $cb_id, 'text' => 'СООБЩЕНИЕ', 'show_alert' => true],$client);

    создай php файл, засунь туда этот код и установи на него webhook.
    Ответ написан
    4 комментария
  • Структура, позволяющая добавлять/удалять полуинтервалы из множества и выводящая количество непересекающихся интервалов?

    @tomatho
    Сразу скажу, что описание задачи чуть-чуть отличается от того, что я понял по заголовку.
    По заголовку я подумал, что это структура хранящая некоторое множество из пар (l, r) где l, r обозначают концы интервала. И удаление l, r соответствует удалению пары.
    А оказалось, что это структура которая хранит множество, которое представимо в виде пар (l, r), где каждое (l, r) - такой полуинтервал.

    Первое, что лезет в голову - set, но set не подойдёт так как надо как-то уметь удалять сразу несколько элементов (l, r) если пришел + l r который покрывает несколько элементов, то их надо удалять быстро. Set же даёт возможность их удалять только за m log n где m - количество элементов которые надо удалить, и n размер дерева.

    Так что моё предложение: декартово дерево.
    Я бы предложил дерево отрезков, если бы min l и max r были в разумных пределах, так как оно проще пишется в этом случае.
    Ответ написан
    3 комментария
  • Как сделать типо свое шифрование? которое можно расшифровать?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Используйте существующую библиотеку и алгоритм шифрования. Например, openssl и aes-256-ctr:
    $data = "я знаю, кто убил Кеннеди";
    $abrakadabra = openssl_encrypt( $data, "aes-256-ctr", "mojSekretnyj2017ParolUzheZabyl"); 
    // 14V+9WGRWsW6hXXEWPZAydY5zWT8c3iy7vrfj8LI470aMegUosUECpqYJg==
    
    $decoded = openssl_decrypt( $abrakadabra, "aes-256-ctr", "mojSekretnyj2017ParolUzheZabyl"); 
    // я знаю, кто убил Кеннеди

    См. openssl_encrypt() и openssl_decrypt()
    Уникальность и «только у меня» – обеспечиваются не алгоритмом, а используемым ключом шифрования.
    Ответ написан
    1 комментарий
  • Какой инструмент можно использовать для логирования вызовов небезопасных/подозрительных функций PHP?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    оверрайд наверное подойдет как вариант, тут важно чтобы все запускалось обернутое вашим скриптом.
    Ответ написан
    3 комментария
  • Как можно индентифицировать пользователя на сайте?

    @Byrger
    Разработчик ПО для платежных систем
    Прочитайте про Evercookie
    Ответ написан
    Комментировать
  • Как организовать архитектуру для подписки по ключевым словам (как пример, Avito)?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Выделить из запроса сущности (имена существительные): можно использовать это
    2. Проверить по заранее подготовленному словарю синонимов и унифицировать всё, что имеет неточности и является синонимом.
    3. Делаем привязку тегов текущего объявления к ОБЩЕМУ списку тегов объявлений всей системы.
    4. Под объявлением отображаем только 5-6 тэгов, с максимальным количеством объявлений внутри каждого тега (кол-ва привязанных объявлений к этому тегу) по всей системе.
    5. В очередь пользователя для отправки - помещаем ID объявлений по его подписке: тэги и т.д.
    6. Как только пул новых объявлений превышает пороговое значение - делаем рассылку. Например, каждые 30 новых из общей очереди пользователя:
    if($newItemsForUser>=30) {
       /* 
          команда запроса инициализации рассылки
          например, команда через API микросервису
       */
    }
    Ответ написан
    1 комментарий
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как хранить бизнес-логику чтобы модели не превратились в монстров из десятков тысяч строк?

    Тут не совсем модели. Entity - это просто объект данных, умеет хранить их в себе и бросать исключения, если не правильные данные вставляете, все. Repository - умеет работать со своим Entity И БД.

    БЛ находится в классах сервисах.

    Читал про Command Bus где, если правильно понял, на каждое действие в системе – свой класс?

    Вообще под каждое дествие - не обязательно, тут нужно руководствоваться здравым смыслом.

    Как их организуете (их тогда будут сотни)?

    Иерархически. Путь к классу должен быть "понимаем".

    Есть ли смысл выносить каждую доменную модель в модуль/микросервис, хранить всю связанную логику где-то там внутри, а с остальными общаться по внешнему API?

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

    За ответы в клиентскую часть – отдельный сервис-фронтенд?

    Если в "сервис" вы вкладываете понятие простого класса, умеющего форматировать ответы вашего проекта - мысль здравая.
    Если ответы будут асинхронными (от сервера к другому) - имеет смысл выностить в отдельный клиентский класс.

    Каков оверхед?

    Ничтожный.

    Используют ли такое на практике?

    Да

    Какие подводные камни?

    Следствием серьезной декомпозиции в любом случае будут лишние сущности, чем раньше от них будете избавляться - тем лучше.

    Как не превратить кидание/получение событий типа PostBeforeEdit/PostBeforeEditHandler в "callback hell"?

    Если есть возможность отказаться от событийной модели - часто лучше отказаться.
    Листнеры доктрины конечно штука мощная, но работает не всегда очевидно.

    Функционал "PostBeforeEdit/PostBeforeEditHandler" часто дешевле и проще вынести в сервис, но опять же руководствуйтесь здравым смыслом.

    ACL Где храните указанную логику?

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

    Какие структуры для описанного выше – best practice?

    Если есть возможность привести к одноуровневому виду - сделайте. Если с точки зрения бизнеса может потребоваться иерархическая (не фиксированной вложенности) ACL - до последнего убеждайте, что это плохая идея, не повторяйте чужих ошибок.

    В моём понимании это выглядит как куча трёхмерных кубов доступа "crud – group – entity – field", как это сделать более плоским пока только одна идея – делать кучу таблиц many-to-many.

    Гибкая настройка вплоть до каждого поля 90% что не нужна. Если можно свести к понятию скопов прав - сделайте это.
    Структуру можно предлагать только зная ваш проект.

    Версионирование. Как вы версионируете подобные проекты?

    Semver.

    А если нужна "N-1" рабочая версия на продакшене?

    Значит на прод попадает ваша версия с тегом "N-1"))

    Есть ли смысл разделять версии в рамках единой кодовой базы проекта и как (неймспейсы, конфиг, модуль, что-то ещё)?

    Храните яйца в отдельных корзинках. Если модуль развивается полностью отдельно и может быть вынесен как зависимость проекта в vendor - делайте.

    И, самое главное – как всё это совместить?

    • РУКОВОДСТВУЙТЕСЬ ЗДРАВЫМ СМЫСЛОМ
    • Принимаете жесткие соглашения по правилам написания кода, например такие
    • Постарайтесь убедить бизнес в том, что без покрытия кода автотестами будет дороже, нестабильней и дольше. + Пишите тесты. Если объем тестов в 4 раза больше кода, который они тестируют - это норм. У меня бывали случаи, когда для критичного функционала тестов было в ~16 раз больше, чем кода.
    • Жесткие, обязательные кодревью.
    • Если задача крупная - декомпозируйте ее.
    • Технический долг - возвращайте обязательно И как можно скорее.
    • Перед тем как писать код для работы с внешним сервисом - имеет смысл написать его эмулятор.
    • Спешите только в случае серьезных проблем на проде)). Фичи "на вчера" отличаются от фич "на потом" только приоритетом выполнения, более ничем.
    Ответ написан
    6 комментариев
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как их организуете (их тогда будут сотни)?


    Раскидываю по неймспейсам. Скажем все действия относящиеся к юзерам находятся в папке Users.

    Только вы учитывайте что CQRS это прикольно но особо не нужно. К примеру это сразу подразумевает что вы используете UUID вместо автоинкрементов и прочей чуши. Можете сделать хотя бы как Дядя Боб предлагает в своей Clean Architecture. Просто сервис на каждое действие.

    Есть ли смысл выносить каждую доменную модель в модуль/микросервис


    Если вы не умеете писать монолиты так что бы потом все было относительно нормально, думать о микросервисах не стоит. Так же как делить проект на модули когда вы еще слабо представляете как прописывать границы этих модулей.

    Раньше для дополнительных действий мне достаточно было использовать что-то вроде beforeUpdate/afterCreate модели.


    ну а сейчас вы будете эти вещи в сервисы пихать. Причем возможно не в один сервис. Вообще старайтесь не делать "хуков" и не будет с ними проблем. Есть к примеру DomainEvents такая штука, ну и можно все эти "дополнительные действия" в хэндлерах команд делать.

    Как не превратить кидание/получение событий типа PostBeforeEdit/PostBeforeEditHandler в "callback hell"?


    Просто забудьте об этих ивентах.

    ACL. Где храните указанную логику?


    Есть в симфони security vouters, а дальше все зависит от того что вы делаете.

    Как вы версионируете подобные проекты? А если нужна "N-1" рабочая версия на продакшене?


    git + docker теги в мастере. Ветки нужно плодить только тогда, когда у вас система деплоится кастомерам и нужно поддерживать сразу кучу версий. Называется это gitflow.

    На какие проекты (точнее, на код) можете посоветовать посмотреть для лучшего понимания? Ссылки на репозитории?

    На гитхабе катострофически мало примеров хороших приложений на симфони. Да и не только на симфони - в принципе найти в открытом доступе сложный проект - это нереально. NDA и все такое. Такие системы обычно очень дорогие и закрытые со всех сторон.

    p.s. почитайте книжки:

    - Эрик Эванс - Предметно ориентированное проектирование
    - Крэйг Ларман - Применение UML 2.0

    p.p.s. Все ваши загоны не имеют никакого смысла если вы не будете пользоваться практиками вроде Test-Driven-Development, ну или хотя бы покрывать систему интеграционными тестами. Без этого вы не сможете делать частный мелкий рефакторинг, а без этого ваша система быстро превратится в легаси.
    Ответ написан
  • Ошибка на сервере "Отключите использование HOSTS". Как это сделать?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    все проще

    выходишь из опенсервера, не гасишь, а именно выходишь

    правой кнопкой по иконке

    "запуск от Администратора" - запускаешь
    Ответ написан
    7 комментариев
  • Как найти единомышленников?

    @CapeRatel
    rusbase.com/howto/gde-najti
    Держи. В статье указано 5 ресурсов.
    На teamfinding.com вроде есть народ, но ресурс умирает.
    Ответ написан
    Комментировать
  • Как заинклудить файл конфига в config.yaml, созданный PuPHPet?

    Denormalization
    @Denormalization
    Если важна цель, а не средство, то посоветую взять тот же Homestead.
    Хосты\директории настраиваются легко и быстро из конфига.
    Ответ написан
    3 комментария
  • Как использовать произвольный виджет в Angular-приложении?

    DigitalSmile
    @DigitalSmile
    http://brainstorage.me/digitalsmile
    Вы правы, пользовательские директивы должны быть обернуты в директивы ангуляра. Если изменить их не получится, могу предложить использовать сервис $compile (https://docs.angularjs.org/api/ng/service/$compile) для обертки.
    Но если предполагается, что модели внутри виджета будут взаимодействовать с Angular-приложением, то без правки кода не получится.
    Ответ написан
    3 комментария