PHP и каноникализация C14N

Цель канонизации — обеспечить, чтобы для одних и тех же данных на уровне XML не менялся хэш, необходимый для проверки подписи.  Т.е. удаляются лишние пробелы, символы и т.д. У себя реализовал примерно так:

function CanonicalXML($xml_text){
   $xml = new DOMDocument( "1.0", "utf-8" );
   $xml->loadXML($xml_text);
   $xml = $xml->C14N();
   return $xml;
}

echo CanonicalXML('<Envelope       xmlns:xsd="http://www.w3.org/2001/XMLSchema" ><Body>Привет всем!</Body  ></Envelope >');

WordPress: просмотр pdf с параметром FitH

В WordPress есть возможность разместить на странице pdf файл в контейнере object, при помощи стандартного блока «Файл». Но есть нюанс — из настраиваемых параметров размера — только высота в пикселях. Ширина автоматически при просмотре подразумевается 100%.. Соответственно файл встраивается в страницу с автоматическим параметром отображения (т.е. не на всю ширину страницы). Для того чтобы страница растянулась на всю ширину экрана, нужно добавить параметр view, например чтобы было примерно так:

<object data-wp-bind--hidden="!state.hasPdfPreview" class="wp-block-file__embed" data="Полезные_советы.pdf#view=FitH" type="application/pdf" style="width:100%;height:800px"></object>

Но, к сожалению после редактирования html кода блока, он ломается. Поэтому одним из решений является написание плагина, который ищет на страницах размещенный pdf файл, и добавляет ему соответствующий параметр. Вот как это реализовано у меня:

Добавляем веб хук:

add_filter( 'gettext', 'PDFFix', 20 );

Функция:

function PDFFix($text){
    $text= str_replace(".pdf>", ".pdf#view=Fit&toolbar=0>", $text);    
    return $text;
};

PHP Curl: Segmentation fault

Столкнулся со странной ошибкой на Astra Linux, а именно если вызывать:

curl --insecure 'https://esia.gosuslugi.ru/login/'

То получаем ошибку:

Хотя в любом другом дистрибутиве получаю стандартное:

ошибка сегментирования

Начал рыть….долго и упорно… искал разницу между установленными версиями curl. И единственное что по большому счёту отличало версию Astra Linux — поддержка сертификатов шифрования ГОСТ. А сайт Госуслуг именно их и использует. Причем шифрование на этом сайте версии 1.3. А что если попробовать принудительно попросить curl именно это шифрование? И в правду заработало:

curl --insecure  --tlsv1.3  'https://esia.gosuslugi.ru/login/'

На PHP аналог выставления данного флага:

curl_setopt ($ch, CURLOPT_SSLVERSION , CURL_SSLVERSION_TLSv1_3);

Хотя конечно остаются вопрос, почему просто падает не показывая почему..

PHP и его странная математика

Столкнулся с очень чудесной ошибкой на PHP:

<?php
$a=1.15;
$b=$a*100;
var_dump($b);
echo $b;
echo "\n";
?>

Что вы ожидаете увидеть в выводе? 115? А вот и нет. Если echo выведет 115, то var_dump выведет 114.99999

Что не так с float?

Тип float в языке PHP, как и его “родственник” тип double, вовсе не предназначен для точного представления десятичных дробей. Всё что мы записали в float, хранится в приближенном значении, с некоторой погрешностью.

Решение: в виду того что в PHP это считается фичей, а не багом, то для точной работы с математикой нужно использовать модуль bcmath. Ну или использовать округления до нужной точности

P.S. Не первый раз уже вспотыкаюсь об это

Распознавание картинки в текст при помощи yandex.cloud

Довелось давече попробовать по распознавать текст при помощи сервиса Vision OCR от Яндекс облако. Результатом родился класс на PHP:

<?php
class TCloud {
    public $token="";
    public $cloud_id="";
    public $folder_id="";
    public $zone="";
    public $iam_token="";
    public $debig=false;
    /**
     * Инициализация класса
     * @param type $token - токен
     * @param type $cloud_id - идентификатор облака
     * @param type $folder_id - идентификатор папки
     * @param type $zone - идентификатор зоны     
     */
    public function __construct($token,$cloud_id,$folder_id,$zone,$debug=false) {
        $this->token=$token;
        $this->cloud_id=$cloud_id;
        $this->folder_id=$folder_id;
        $this->zone=$zone;
        $this->debug=$debug;
    }  
    
    /**
     * Получение IAM токена
     * Подробнее: https://yandex.cloud/ru/docs/iam/operations/iam-token/create#api_1
     * @return bool
     */
    public function GetIAMToken(){
        $ch = curl_init("https://iam.api.cloud.yandex.net/iam/v1/tokens");        
        curl_setopt($ch, CURLOPT_VERBOSE, $this->debug);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        
        curl_setopt($ch, CURLOPT_POST, 1);   
        $data["yandexPassportOauthToken"]=$this->token;
        curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data));
        
        $res=curl_exec($ch);        
          if (curl_errno($ch)) {
            $error_msg = curl_error($ch);
              var_dump($res);
              var_dump($error_msg);
              return false;
          }                
         $res= json_decode($res);
         if ($res==null){return false;};         
         $this->iam_token=$res->iamToken;         
        return true;
    }
    
    /**
     * Распознать картинку
     * @param type $mimetype - тип входящего файла (JPEG, PNG, PDF)
     * @param type $model - режим распозанвания (page)
     * @param type $content - контент в формате BASE64
     * @param type $languageCodes - языки для распознавания (*), массив
     * Подробнее: https://yandex.cloud/ru/docs/vision/quickstart
     */
    public function OCR($mimetype="JPEG",$model="page",$content,$languageCodes=["*"]){        
        $ch = curl_init("https://ocr.api.cloud.yandex.net/ocr/v1/recognizeText");        
        curl_setopt($ch, CURLOPT_VERBOSE, $this->debug);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Content-Type: application/json",
            "Authorization: Bearer ".$this->iam_token,
            "x-folder-id: ".$this->folder_id,
            "x-data-logging-enabled: true"
        ]);        
        $data["mimeType"]=$mimetype;
        $data["languageCodes"]=$languageCodes;
        $data["model"]=$model;
        $data["content"]=$content;
        curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data));
        
        $res=curl_exec($ch);        
          if (curl_errno($ch)) {
            $error_msg = curl_error($ch);
              var_dump($res);
              var_dump($error_msg);
              die();  
          }        
          return $res;
    }
    
}

Результатом возвращается json с блоками распознанного текста/таблиц.

1 2 3 4 5 29