• Как работает grpc?

    @deliro
    А что тут понимать-то? Представь, что у тебя есть два сервиса, которые общаются по JSON-RPC over HTTP. Приходит сервис1 к сервису2 и говорит, ну-ка бахни мне метод getSomethingOfSomething с аргументами вот такими. И всё это в виде JSON внутри HTTP body. Сервис2 идёт, смотрит у себя в реестре метод getSomethingOfSomething, вызывает его с аргументами и отдаёт результат. Легко? Легко. Теперь тоже самое, только вместо HTTP там HTTP/2, а вместо JSON — protobuf. То есть, два сервиса договорились, что в первых четырёх байтиках будет лежать, например, int32, в следующих восьми будет лежать float64 ну а там дальше ещё что-то будет лежать.
    Ответ написан
    3 комментария
  • Почему не получается записать в базу данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    База данных всегда сама подробно расскажет, почему у неё не получилось выполнить запрос. Надо её только об этом попросить.

    Поэтому сначала учимся правильно соединяться.
    Весь этот детский лепет "не могу соединиться с БД" выкидываем и пишем нормальный код, который сам, без всяких проверок, сообщит нам об ошибках.
    В случае mysqli это
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");

    Здесь первая строчка отвечает как раз за информирование об ошибках

    Кроме того надо не забыть про ошибки РНР
    Во-первых, всегда в коде должно быть error_reporting(E_ALL);
    Плюс на домашнем компе ini_set('display_errors',1);, а на боевом - ini_set('display_errors',0);ini_set('log_errors',1);, и смотреть, соответственно, в логах.

    После этого переписываем запрос. Причем так, чтобы данные в БД всегда попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    • Привязать переменные к запросу.
    • Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $title, $discription, $date, $path);
    $stmt->execute();

    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    И тогда никаких ошибок запроса уже никогда не будет. Не говоря уже о том что при любых других вариантах твой сайт поломает любой пятиклассник

    Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute

    Подключение
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $port = "3306";
    $charset = 'utf8mb4';
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
    $pdo = new \PDO($dsn, $user, $pass, $options);

    Здесь за информирование об ошибках отвечает параметр PDO::ERRMODE_EXCEPTION, а остальные просто для удобства/корректности.

    Выполнение запроса
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$title, $discription, $date, $path]);
    Ответ написан
    2 комментария
  • Как ограничить количество одновременно исполняемых Promise?

    @GrayHorse
    Это называется семафором (Semaphore).
    class Semaphore {
        constructor(max = 1) {
            if (max < 1) { max = 1; }
            this.max = max;
            this.count = 0;
            this.queue = [];
        }
        acquire() {
            let promise;
            if (this.count < this.max) {
                promise = Promise.resolve();
            } else {
                promise = new Promise(resolve => {
                    this.queue.push(resolve);
                });
            }
            this.count++;
            return promise;
        }
        release() {
            if (this.queue.length > 0) {
                const resolve = this.queue.shift();
                resolve();
            }
            this.count--;
        }
    }


    const semaphore = new Semaphore(10);
    for (const url of urls) {
        await semaphore.acquire();
        void downloadUrlSynchronized(url, semaphore);    
    }
    
    async function downloadUrlSynchronized(url, semaphore) {
        const resp = await fetch(url);
        const blob = await resp.blob();
        semaphore.release();
        // const name = new URL(url).pathname.slice(1);
        // downloadBlob(blob, name, url);
    }

    Загрузка (fetch) будет не больше 10 в один момент, что собственно и требовалось.

    ---
    На примере 3:
    61ee50a555b4a690601785.png
    Ответ написан
  • Говорят в России недостаток IT специалистов составил 1 млн, так ли это?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Да, не хватает миллиона программистов - профессионалов от мидлового уровня с опытом работы в коммерческих проектах не менее трёх лет. А начинающих, которые только хотят стать программистами, переизбыток.
    Ответ написан
    9 комментариев
  • Как настроить автоматические отступы от скобок при автоимпорте в phpStorm?

    Preferences/Settings | Editor | Code Style | JavaScript | Spaces | Within | ES6 import/export braces.
    Ответ написан
    Комментировать
  • Как лучше сделать вывод количества в фильтрах в Laravel?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Это называется фасетный поиск и реализуется иначе. По этой фразе вы найдёте множество инструкций, включая готовые пакеты под Laravel - выбирайте что понравится.
    Ответ написан
    1 комментарий
  • Не выключается macbook pro?

    lamer350
    @lamer350
    กำลังสูงสุด
    Да, лет 5 как ввели. Так же он будет автоматически включатся если при открытой крышке воткнуть кабель питания, монитор или что либо еще.
    В настройках нет возможности это отключить, но возможно отключить в терминале. Просто введите команду:
    sudo nvram AutoBoot=%00
    после ввода команды терминал попросит ввести пароль, все теперь при открытии крышки бук не будет автоматически включатся, как и при подключении кабелей. А вот за включение обычными кнопками не помню... Попробуйте, отпишитесь.

    Чтобы вернуть все обратно просто в конце вместо 0 вставьте 3:
    sudo nvram AutoBoot=%03
    Ответ написан
    1 комментарий
  • Как верстать изогнутые секции?

    RAX7
    @RAX7
    SVG + 2 маски, одна пропорционально растягивается, другая непропорционально. Отрицательным margin загнать секции одна на другую.
    Ответ написан
    6 комментариев
  • Как называется плагин для vs code?

    Комментировать
  • Что это за переменная в php - $IWP?

    metallix
    @metallix
    Backend - developer
    Выглядит что ТС фишинговую страницу пытается запилить. https://github.com/Manisso/Fake-instagrame/blob/ma...
    Я бы не помогал ему
    Ответ написан
    Комментировать
  • Как сделать ленту как на https://postila.ru/?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    Ответ написан
    Комментировать
  • Как веб студии продвигают свои услуги?

    @d-sem
    Качественная работа, сарафанное радио, откаты, родственные связи.
    Ответ написан
    Комментировать
  • Где изучать symfony?

    @tukreb
    Я буду более конкретен
    https://symfony.com/doc/current/the-fast-track/ru/...
    Все буквально на блюдечке подано. Даже про докер и git вскользь есть, просто бери и делай проект.
    Ответ написан
    Комментировать
  • Самый короткий способ обработать каждый элемент массива?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Профессионалы, например, понимают, что присвоение $value здесь бессмысленно и не пишут его. И вот я сэкономил вам целых 9 символов - потратьте их с умом.
    Ещё профессоналы понимают, что в коде важна читаемость, а не краткость. И именно умение писать понятный код является показателем квалификации.

    Ну а прям профессиональные профессионалы решают эту задачу исключительно вот так:
    Посмотреть профессиональный код

    <?php
    declare(strict_types=1);
    
    class Ellipsis
    {
        private string $char;
        private int $count;
    
        /**
         * @param string $char
         * @param int $count
         */
        public function __construct(string $char, int $count)
        {
            $this->char = $char;
            $this->count = $count;
        }
    
        /**
         * @return string
         */
        public function getChar(): string
        {
            return $this->char;
        }
    
        /**
         * @return int
         */
        public function getCount(): int
        {
            return $this->count;
        }
    }
    
    class Ellipsisist
    {
        private Ellipsis $ellipsis;
    
        /**
         * @param Ellipsis $ellipsis
         */
        public function __construct(Ellipsis $ellipsis)
        {
            $this->ellipsis = $ellipsis;
        }
    
        /**
         * @param string $value
         * @return string
         */
        public function __invoke(string $value): string
        {
            return str_pad($value, mb_strlen($value) + $this->ellipsis->getCount(), $this->ellipsis->getChar(), STR_PAD_LEFT);
        }
    }
    
    class EllipsisistFactory
    {
        /**
         * @param string $char
         * @param int $count
         * @return Ellipsisist
         */
        public static function make(string $char, int $count): Ellipsisist
        {
            return new Ellipsisist(new Ellipsis($char, $count));
        }
    }
    
    $arr = ['foo', 'bar', 'baz'];
    
    $ellipsisiatedArr = array_map(
        EllipsisistFactory::make('.', 3),
        $arr
    );
    
    var_dump($ellipsisiatedArr);

    Ответ написан
    4 комментария
  • $$$ что значит в php?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Это называется переменная с переменным именем (variable variable).

    class Foo {
      public $deepest = 'Limbo';
      
      public function __toString()
      {
        return 'deep';
      }
    }
    
    $deeper = 'deepest';
    $deep = 'deeper';
    $b = new Foo();
    
    echo $b->$$$b;


    Выражение выполняется справа налево:
    1. $b->$$($b) превращается в $b->$$($b->__toString()), поскольку именно так ведут себя объекты, когда на них пытаются натравить echo;
    2. $b->$$($b->__toString()) превращается в $b->$(${'deep'}), именно это значение возвращает метод __toString класса Foo, инстансом которого является $b;
    3. $b->$(${'deep'}) превращается в $b->$($deep), это как раз вызов переменной при помощи значения из другой переменной;
    4. $b->$($deep) превращается в $b->${'deeper'}, поскольку именно такое значение находится в переменной $deep;
    5. $b->${'deeper'} превращается в $b->($deeper);
    6. $b->($deeper) превращается в $b->deepest;
    7. наконец, получается значение свойства 'deepest' из $b, а там как раз хранится 'Limbo', оно и выводится в echo.

    dd178a12658f41679b71884846669132.jpg
    Ответ написан
    8 комментариев
  • Как избавиться от сообщения в консоле при разработке React приложения?

    @shipmanager
    Действитель из-за хромовского расширения.
    У себя отключил friGate - ошибка исчезла.
    Ответ написан
    Комментировать
  • Что такое slug в разработке?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Чаще всего, как уже написали, встречается в URL, но все же его значение чуть более шире - slug это уникальная строка идентификатор, понятная человеку (в отличие от ID) и содержащая только "безопасные" символы:
    - 0-9
    - a-z (общепринято - в нижнем регистре)
    - символ -
    - иногда еще символ _
    Могут использоваться не только в URL для понятности, но и, например, в запросах к БД (в первую очередь - на уровне АПИ) - ведь
    SELECT * FROM pages WHERE category="some-slug"
    более понятно, чем
    SELECT * FROM pages WHERE category=126.
    На уровне API это выглядит как
    get_pages_in_category( 'some-slug' )
    или
    $object->get_pages_in_category( 'some-slug' ).
    В общем, это человеко-понятный уникальный идентификатор.
    Ответ написан
    1 комментарий