PHP: Рисуем SVG

Один из вариантов генерации картинок svg «на лету». Капля, внутри буква, окруженная полукругами.

<?php

$blob_status=5; 
$pies=[1,2,3,4,5,6];

function GetColorPieByState($state){    
    switch ($state) {
        case 1:$color="#2afc24";break;  
        case 2:$color="#2afc24";break;  
        case 3:$color="#fc2424";break;  
        case 4:$color="#fc2424";break;  
        case 5:$color="#fc2424";break;  
        case 6:$color="#cccccc";break;  
        default:$color="#7DD8B5";break; 
    }
    return $color;
};

function String2Array($st){
    $st=mb_substr($st, 0, -1);
    return explode(",", $st);
};

function GetColorBlobByState($state){    
    $station_fill="#D1FFB4";
    if ($state==1) $station_fill="#2afc24";
    if ($state==2) $station_fill="#fc2424";
    if ($state==3) $station_fill="#fc2424";
    if ($state==4) $station_fill="#fc2424";
    if ($state==5) $station_fill="#cccccc";
    return $station_fill;
};

function SaveSvgBlobIco($blob_status,$pies,$filename){
    
}

Draw($blob_status,$pies);

function Draw($blob_status,$pies){
    
    $station_fill=GetColorBlobByState($blob_status);

    $svg="";
    $svg=$svg.'<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="264">';
    $svg=$svg."<defs>";
    $svg=$svg."    <style>";
    $svg=$svg."        .blob_fill {fill:$station_fill;}"; /*Цвет капли*/       
    $svg=$svg.'    </style>';
    $svg=$svg.'</defs>';
    //Рисунок капли
    $svg=$svg.'   <path class="blob_fill" d="m199.10001,101.02451c0,90.53423 -99.52251,161.55548 -99.52251,161.55548s-99.5775,-76.21059 -99.5775,-161.55548a99.55,101.0245 0 0 1 199.10001,0z" id="svg_1"/>';
    //Буква й
    $svg=$svg.'   <text transform="matrix(7.0814, 0, 0, 6.46509, -382.002, -470.036)" xml:space="preserve" text-anchor="start" font-family="Helvetica, Arial, sans-serif" font-size="24" id="svg_3" y="94.56099" x="61.67799" stroke-opacity="null" stroke-width="0" stroke="null" fill="#EDFFFF">й</text>';

    $svg=$svg.'<g style="stroke:black;stroke-width:1">';

    function pt($x,$y,$rad,$gap,$r,$ang,$mns=-1){ 
      //global $x,$y,$rad,$gap;      
      $a=($ang-90)*$rad-$mns*asin($gap/$r); 
      return sprintf('%0.2f,%0.2f',$x+$r*cos($a),$y+$r*sin($a));
    }

    $x=100;
    $y=100;
    $r=60;  // внутренний радиус
    $rc=90; // внешний радиус
    $gap=20; // отступ между кусками
    $a360=360/count($pies); 
    $M_PI=3.14159265358; 
    $rad=$M_PI/180.;
    $out='';
    $ang1=0;      


    foreach ($pies as $connector) {  
      $dang = 1 * $a360;       
      $laf  = $dang > 180? 1 : 0; 
      $ang2 = $ang1 + $dang;      
      $out.= '<path d="M'.pt($x,$y,$rad,$gap,$rc,$ang1).'L'.pt($x,$y,$rad,$gap,$r, $ang1)."A $r,$r, 0,$laf,1 "  .pt($x,$y,$rad,$gap,$r,$ang2,1).
                      'L'.pt($x,$y,$rad,$gap,$rc,$ang2,1)."A $rc,$rc, 0,$laf,0, ".pt($x,$y,$rad,$gap,$rc,$ang1).'" style="fill:'.GetColorPieByState($connector).'" />'."\n";
      $ang1=$ang2;
    }
    $svg=$svg.$out;
    $svg=$svg.'</g></svg>';
    echo $svg;
};
?>

Перебор комбинаций 0 и 1 в битах

Задача: вычислить все возможные комбинации 0 и 1 в битовом числе.

Решение: применим комбинаторику. Реализовано аж в двух языках 😉

Pyhon:

n=int(input("n="))
res=[]
for i in range(2**n):
    s=""
    for j in range(n):
        s=str(i%2)+s
        i=i//2
    res.append(s)
print(res)

PHP:

$n=5;
$res=[];
for ($i = 1; $i <= 2**$n; $i++) {
    $s="";    
    $z=$i;
    for ($j = 1; $j <= $n; $j++) {
      $s=(string)($z%2).$s;      
      $z=intdiv($z,2);      
    };  
    $res[]=$s;
}
var_dump($res);

PHP: отправка почты через сервер Microsoft Exchange

Минут 20 пришлось подбирать параметры, чтобы письма пошли. Получился примерно такой класс (с использованием PHPMailer).

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

class TMail {
   public static function SendMail($to,$title,$body){
    global $db;
    $answer=AnswerStruc(true,"Не удалось отправить почту");
    $mail = new PHPMailer(true);
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      
    $mail->isSMTP();                                                
    $mail->Host       = TConfig::GetConfigKeyValue("mail_server");
    $mail->SMTPAuth   = true;                                  
    $mail->Username   = TConfig::GetConfigKeyValue("mail_server_login");
    $mail->Password   = TConfig::GetConfigKeyValue("mail_server_password");
    //$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;           
    $mail->CharSet = 'UTF-8';
    $mail->Encoding = 'base64';
    $mail->Port       = TConfig::GetConfigKeyValue("smtp_port");                                   
    $mail->SMTPAuth = true;
    
    $mail->SMTPOptions = array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        )
    );    
    
    $mail->setFrom(TConfig::GetConfigKeyValue("mail_server_sender"));
    $mail->addAddress($to);

    $mail->isHTML(true);                                
    $mail->Subject = $title;
    $mail->Body    = $body;    
    
    if (!$mail->send()) {
        $answer=AnswerStruc(true,$mail->ErrorInfo);
    } else {
        $answer=AnswerStruc(false,"Ok");
    }
    return $answer;
   }   
}

PHP: Особенности работы с PostrgeeSQL через PDO

Работа с типом boolean. А именно типы bollean нужно явно переводить в 1 или 0 при вставке в таблицу. Например:

$sql="INSERT INTO t1(p1) VALUES (:p1)";
$query2 = $db->connection->prepare($sql);  
$param=[
  "p1"=> $bool_perem?1:0
];
$res=$query2->execute($param);

Работа с null в запросе. Если вдруг какаято переменная может быть null, то запрос нужно преобразовывать:

    $sql="select tarif from tarifs where chpe=:chpe";      
      if ($charge_type==null){
          $sql= str_replace("chpe=:chpe", "chpe is null", $sql);          
      } else {
          $param["chpe"]=$charge_type;
      };
      $query2 = $db->connection->prepare($sql);  

PHP: получить публичный ключ удаленного сервера

Задача: получить публичный ключ https ресурса

Решение:

<?php
$opt = [
  "capture_peer_cert" => true,
    "capture_peer_cert_chain" => true
    ];
    $a = stream_context_create(["ssl"=>$opt]);
    $b = stream_socket_client("tls://xn--90acbu5aj5f.xn--p1ai:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $a);
    $cont = stream_context_get_params($b);
    $key = openssl_pkey_get_public($cont["options"]["ssl"]["peer_certificate"]);
    $c = openssl_pkey_get_details($key);
    var_dump($c["key"]);
1 6 7 8 9 10 24