PHP AMP Websocket: указание произвольных заголовков при рукопожатии

Задача: добавить произвольный заголовок клиенту при рукопожатии с сервером. Например Sec-WebSocket-Protocol

Решение:

use Amp\Delayed;
use Amp\Websocket\Client\Connection;
use Amp\Websocket\Client\Handshake;
use Amp\Websocket\Message;
use function Amp\Websocket\Client\connect;
use Amp\Socket\ClientTlsContext;
use Amp\Socket\ConnectContext;

            Amp\Loop::run(function () use ($wss_url,$ip,$port,$pascket,&$answer,$wait_reseive) {                            
                $tlsc=new ClientTlsContext("");
                $tlw=$tlsc->withoutPeerVerification();
                $connectContext = (new ConnectContext)->withTlsContext($tlw);
                $handshake = (new Handshake("ws://1.18.24.70:$port/virtual_api_1c"))->withHeader('Sec-WebSocket-Protocol', 'virtual');  
                $connection = yield connect($handshake,$connectContext);   
                yield $connection->send($pascket);
                yield $connection->close();
            });  

NetBeans 14 и поддержка Python

Начиная с версии 8.1, python плагины не поддерживаются официально и установить из самой IDE их нельзя, однако неофициальные плагины таки существуют.

Скачать пакет с плагинами можно здесь

Установка: Tools -> Plugins -> Downloaded -> Add Plugins

PostgreSQL: вывод числа в виде значения часы:минуты:секунды

Задача: в одной из колонок хранятся секунды в виде значения int, необходимо при выводе преобразовать их по маске hh:mm:ss

Решение:

TO_CHAR((docs_charge.duration || ' second')::interval, 'HH24:MI:SS') as duration

Selenium: дождаться окончания всех закачек в браузере

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


save_path="X:\\new\\";

async function sys_sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
};

(async () => {
    const fs = require('fs');
    yet=true;
    while (yet==true) {
        console.log("--ждём пока не закончатся все закачки...");
        fs.readdir(save_path, (err, files) => {
          cnt=0;  
          files.forEach(file => {
            console.log(file);
            if (file.indexOf('down')>0){cnt++;};
          });
          if (cnt==0){
            console.log("Дождались..");  
            yet=false; 
          };
        });
         await sys_sleep(1000);
    };
})();

Flutter: реализация «смахивания» в приложении.

Задача: реализовать удаление позиции из списка «смахиванием».

Решение: используем для этого виджет Dismissible. Обернем в него каждый пункт в ListView. Ну собственно в него можно оборачивать любой виджет.

  child: ListView.builder(
....
...
                                child:
                                Dismissible(
                                    key: UniqueKey(),
                                    direction:DismissDirection.startToEnd,
                                    onDismissed: (DismissDirection direction){
                                        TDialogs dia = TDialogs();
                                        dia.SureDialog(context, "Подтверждение", "Вы действительно удалить ТМЦ  "+globals.TMCList[index]["inv_num"]+" ?",
                                          (){
                                            setState(() {
                                                                                            globals.TMCList.removeAt(index);
                                            });
                                          },
                                          (){
                                            setState(() {});
                                          }
                                        );
                                    },
                                    child: Container(
                                        padding: EdgeInsets.symmetric(vertical: 10),
                                        color: globals.TMCList[index]["count"]==0?Colors.red:null,
                                        child: Column(
                                          children: [
                                            Text(
                                              globals.TMCList[index]["name"],
                                              textAlign: TextAlign.start,
                                            ),
                                            Align(

....

Из интересного: метод direction отвечает за то, как именно разрешено «смахивать». В примере это «от старта до конца». Т.е. слева на право. Доступные варианты:

enum DismissDirection {
  vertical,
  horizontal,
  endToStart,
  startToEnd,
  up,
  down,
  none
}
1 66 67 68 69 70 309