SlideShare une entreprise Scribd logo
1  sur  112
Télécharger pour lire hors ligne
Реализация клиентов
для бинарных
протоколов на PHP
Anton Shabouta
ONLINER
Зачем? Асинхронный PHP
$pdo = new PDO('mysql:host=...');
$rows = $pdo->query('SELECT ...');
foreach ($rows as $row) {
print_r($row);
}
PHP. Блокирующие операции
$pdo = new PDO('mysql:host=...');
$rows = $pdo->query('SELECT ...');
foreach ($rows as $row) {
print_r($row);
}
PHP. Блокирующие операции
Block
EventLoop
AMPHP. Неблокирующие драйверы
Beanstalkd
Зачем? Специализированное ПО
POST /index.php HTTP/1.1
Host: www.fwdays.com
Content-Type: application/json;
Content-Length: 34
{
"hello": "PHP FWDays 2019"
}
HTTP
POST /index.php HTTP/1.1
Host: www.fwdays.com
Content-Type: application/json;
Content-Length: 34
{
"hello": "PHP FWDays 2019"
}
HTTP
POST /index.php HTTP/1.1
Host: www.fwdays.com
Content-Type: application/json;
Content-Length: 34
{
"hello": "PHP FWDays 2019"
}
HTTP
POST /index.php HTTP/1.1
Host: www.fwdays.com
Content-Type: application/json;
Content-Length: 34
{
"hello": "PHP FWDays 2019"
}
HTTP
POST /index.php HTTP/1.1
Host: www.fwdays.com
Content-Type: application/json;
Content-Length: 34
{
"hello": "PHP FWDays 2019"
}
HTTP
Пакет данных. AMQP 0-9-1
01000100000014003c00280000000b62
617369635f717565756500ce02000100
00000e003c0000000000000000001600
00ce0300010000001648656c6c6f2050
504820465744617973203230313921ce
Пакет данных. AMQP 0-9-1
01000100000014003c00280000000b62
617369635f717565756500ce02000100
00000e003c0000000000000000001600
00ce0300010000001648656c6c6f2050
504820465744617973203230313921ce
Hello PHP
FWDays 2019!
Структура пакета
type channel
1 2 4
body size
Структура пакета
type channel
1 2 4
body size
body
Структура пакета
1
type channel
1 2 4
body size
CE
body
Порядок байт
3 2 1 0 От младшего к старшему
(Little Endian, LE)
123
Порядок байт
0 1 2 3От старшего к младшему
(Big Endian, BE)
123
Пакет данных. AMQP 0-9-1
01000100000014003c00280000000b62
617369635f717565756500ce
--------------------------------
0200010000000e003c00000000000000
0000160000ce
--------------------------------
0300010000001648656c6c6f20505048
20465744617973203230313921ce
Type
Channel
Size
Body
End Byte
Протокол передачи данных
Набор соглашений определяющий обмен данными
между различными программами.
Теория
Протокол передачи данных
Набор соглашений определяющий обмен данными
между различными программами.
Бинарный протокол
Протокол, который предназначен для чтения машиной, а
не человеком.
Теория
Протокол передачи данных
Набор соглашений определяющий обмен данными
между различными программами.
Бинарный протокол
Протокол, который предназначен для чтения машиной, а
не человеком.
Пакет данных
Блок информации определенной структуры.
Теория
function packFrame(string $body): string
{
return pack(
'CCnCN',
$this->version,
$this->flags,
$this->stream,
$this->opcode,
strlen($body)
) . $body;
}
Работа с бинарными данными в PHP
function packFrame(string $body): string
{
return pack(
'CCnCN',
$this->version,
$this->flags,
$this->stream,
$this->opcode,
strlen($body)
) . $body;
}
Работа с бинарными данными в PHP
function packFrame(string $body): string
{
return pack(
'CCnCN',
$this->version,
$this->flags,
$this->stream,
$this->opcode,
strlen($body)
) . $body;
}
Работа с бинарными данными в PHP
function packFrame(string $body): string
{
return pack(
'CCnCN',
$this->version,
$this->flags,
$this->stream,
$this->opcode,
strlen($body)
) . $body;
}
Работа с бинарными данными в PHP
c - знаковый char
C - беззнаковый char
Работа с бинарными данными в PHP
c - знаковый char
C - беззнаковый char
s - знаковый short (ME)
S - беззнаковый short (ME)
n - беззнаковый short (BE)
v - беззнаковый short (LE)
Работа с бинарными данными в PHP
c - знаковый char
C - беззнаковый char
s - знаковый short (ME)
S - беззнаковый short (ME)
n - беззнаковый short (BE)
v - беззнаковый short (LE)
i - знаковый int (ME)
I - беззнаковый int (ME)
N - беззнаковый int (BE)
V - беззнаковый int (LE)
Работа с бинарными данными в PHP
c - знаковый char
C - беззнаковый char
s - знаковый short (ME)
S - беззнаковый short (ME)
n - беззнаковый short (BE)
v - беззнаковый short (LE)
i - знаковый int (ME)
I - беззнаковый int (ME)
N - беззнаковый int (BE)
V - беззнаковый int (LE)
l - знаковый long (ME)
L - беззнаковый long (ME)
N - беззнаковый long (BE)
V - беззнаковый long (LE)
Работа с бинарными данными в PHP
f - float (ME)
G - float (BE)
g - float (LE)
d - double (ME)
E - double (BE)
e - double (LE)
...
30+
кодов
function packFrame(string $body): string
{
return (string) Binary::bigEndian()
->appendUint8($this->version)
->appendUint8($this->flags)
->appendUint16($this->stream)
->appendUint8($this->opcode)
->appendUint32(strlen($body))
->append($body)
;
}
Работа с бинарными данными в PHP
https://github.com/phpinnacle/buffer
class Binary
{
public function append(string $value): self
{
$this->data .= $value;
$this->size += strlen($value);
return $this;
}
public function appendInt8(int $value): self
{
return $this->append(pack("c", $value));
}
}
Работа с бинарными данными в PHP
class Binary
{
public function read(int $n, int $offset = 0): string
{
return substr($this->data, $offset, $n);
}
public function readInt8(int $offset = 0): int
{
return unpack("c", $this->read(1, $offset))[1];
}
}
Работа с бинарными данными в PHP
public function parse(Binary $data): ?Frame
{
if ($data->size() < HEADER_SIZE) {
return null;
}
$type = $data->readUint8(0);
$channel = $data->readUint16(1);
$size = $data->readUint32(3);
if ($data->size() < $size + HEADER_SIZE) {
return null;
}
$body = $data->read($size);
return new Frame($type, $channel, $body);
}
Клиент. Парсер
public function parse(Binary $data): ?Frame
{
if ($data->size() < HEADER_SIZE) {
return null;
}
$type = $data->readUint8(0);
$channel = $data->readUint16(1);
$size = $data->readUint32(3);
if ($data->size() < $size + HEADER_SIZE) {
return null;
}
$body = $data->read($size);
return new Frame($type, $channel, $body);
}
Клиент. Парсер
public function parse(Binary $data): ?Frame
{
if ($data->size() < HEADER_SIZE) {
return null;
}
$type = $data->readUint8(0);
$channel = $data->readUint16(1);
$size = $data->readUint32(3);
if ($data->size() < $size + HEADER_SIZE) {
return null;
}
$body = $data->read($size);
return new Frame($type, $channel, $body);
}
Клиент. Парсер
public function parse(Binary $data): ?Frame
{
if ($data->size() < HEADER_SIZE) {
return null;
}
$type = $data->readUint8(0);
$channel = $data->readUint16(1);
$size = $data->readUint32(3);
if ($data->size() < $size + HEADER_SIZE) {
return null;
}
$body = $data->read($size);
return new Frame($type, $channel, $body);
}
Клиент. Парсер
public function parse(Binary $data): ?Frame
{
if ($data->size() < HEADER_SIZE) {
return null;
}
$type = $data->readUint8(0);
$channel = $data->readUint16(1);
$size = $data->readUint32(3);
if ($data->size() < $size + HEADER_SIZE) {
return null;
}
$body = $data->read($size);
return new Frame($type, $channel, $body);
}
Клиент. Парсер
Клиент. Схема работы
stream_socket_client()
Client Server
Клиент. Схема работы
stream_socket_client()
pack()
Client Server
Клиент. Схема работы
stream_socket_client()
pack()
stream_write()
Client Server
Клиент. Схема работы
stream_socket_client()
pack()
stream_write()
stream_read()
Client Server
Клиент. Схема работы
stream_socket_client()
pack()
stream_write()
stream_read()
unpack()
Client Server
Клиент. Схема работы
Client Server
stream_socket_client()
pack()
stream_write()
pack()
stream_write()
Пакет данных. Cassandra DB
version stream
1 1 2
body sizeflags opcode
1
body
4
Пакет данных. Cassandra DB
version stream
1 1 2
body sizeflags opcode
1
body
4
function writeAsync(Frame $frame)
{
$deferred = new Deferred;
yield $this->socket->write($frame->pack());
$this->defers[$frame->stream] = $deferred;
return $deferred->promise();
}
Клиент. Асинхронная запись
function writeAsync(Frame $frame)
{
$deferred = new Deferred;
yield $this->socket->write($frame->pack());
$this->defers[$frame->stream] = $deferred;
return $deferred->promise();
}
Клиент. Асинхронная запись
function writeAsync(Frame $frame)
{
$deferred = new Deferred;
yield $this->socket->write($frame->pack());
$this->defers[$frame->stream] = $deferred;
return $deferred->promise();
}
Клиент. Асинхронная запись
function writeAsync(Frame $frame)
{
$deferred = new Deferred;
yield $this->socket->write($frame->pack());
$this->defers[$frame->stream] = $deferred;
return $deferred->promise();
}
Клиент. Асинхронная запись
function writeAsync(Frame $frame)
{
$deferred = new Deferred;
yield $this->socket->write($frame->pack());
$this->defers[$frame->stream] = $deferred;
return $deferred->promise();
}
Клиент. Асинхронная запись
function readAsync(): void
{
while ($data = yield $this->socket->read()) {
$buffer = new Binary($data);
$frame = $this->parse($buffer);
$deferred = $this->defers[$frame->stream];
$deferred->resolve($frame);
}
}
Клиент. Асинхронное чтение
function readAsync(): void
{
while ($data = yield $this->socket->read()) {
$buffer = new Binary($data);
$frame = $this->parse($buffer);
$deferred = $this->defers[$frame->stream];
$deferred->resolve($frame);
}
}
Клиент. Асинхронное чтение
function readAsync(): void
{
while ($data = yield $this->socket->read()) {
$buffer = new Binary($data);
$frame = $this->parse($buffer);
$deferred = $this->defers[$frame->stream];
$deferred->resolve($frame);
}
}
Клиент. Асинхронное чтение
function readAsync(): void
{
while ($data = yield $this->socket->read()) {
$buffer = new Binary($data);
$frame = $this->parse($buffer);
$deferred = $this->defers[$frame->stream];
$deferred->resolve($frame);
}
}
Клиент. Асинхронное чтение
function readAsync(): void
{
while ($data = yield $this->socket->read()) {
$buffer = new Binary($data);
$frame = $this->parse($buffer);
$deferred = $this->defers[$frame->stream];
$deferred->resolve($frame);
}
}
Клиент. Асинхронное чтение
PHPBench
https://github.com/phpbench/phpbench
PHPBench
● Тесты запускаются в отдельных процессах, что
нивелирует накладные расходы.
PHPBench
● Тесты запускаются в отдельных процессах, что
нивелирует накладные расходы.
● Поддержка ограничений (Asserters)
PHPBench
● Тесты запускаются в отдельных процессах, что
нивелирует накладные расходы.
● Поддержка ограничений (Asserters)
● Различные метрики: best, avg, mean, mode, worst
PHPBench
● Тесты запускаются в отдельных процессах, что
нивелирует накладные расходы.
● Поддержка ограничений (Asserters)
● Различные метрики: best, avg, mean, mode, worst
● Отложенные отчеты
PHPBench
● Тесты запускаются в отдельных процессах, что
нивелирует накладные расходы.
● Поддержка ограничений (Asserters)
● Различные метрики: best, avg, mean, mode, worst
● Отложенные отчеты
● Форматирование отчетов: html, xml, markdown
PHPBench
● Тесты запускаются в отдельных процессах, что
нивелирует накладные расходы.
● Поддержка ограничений (Asserters)
● Различные метрики: best, avg, mean, mode, worst
● Отложенные отчеты
● Форматирование отчетов: html, xml, markdown
● Расширения
PHPBench
/**
* @Warmup(2)
* @Iterations(10)
* @Revs(100)
*/
public function benchPublish($count = 1000)
{
$promises = [];
for ($i = 0; $i < $count; ++$i)
$promises[] = $this->channel->publish($i, 'bench');
wait($promises);
}
PHPBench
/**
* @Warmup(2)
* @Iterations(10)
* @Revs(100)
*/
public function benchPublish($count = 1000)
{
$promises = [];
for ($i = 0; $i < $count; ++$i)
$promises[] = $this->channel->publish($i, 'bench');
wait($promises);
}
PHPBench
/**
* @Warmup(2)
* @Iterations(10)
* @Revs(100)
*/
public function benchPublish($count = 1000)
{
$promises = [];
for ($i = 0; $i < $count; ++$i)
$promises[] = $this->channel->publish($i, 'bench');
wait($promises);
}
PHPBench
/**
* @Warmup(2)
* @Iterations(10)
* @Revs(100)
*/
public function benchPublish($count = 1000)
{
$promises = [];
for ($i = 0; $i < $count; ++$i)
$promises[] = $this->channel->publish($i, 'bench');
wait($promises);
}
PHPBench
/**
* @Warmup(2)
* @Iterations(10)
* @Revs(100)
*/
public function benchPublish($count = 1000)
{
$promises = [];
for ($i = 0; $i < $count; ++$i)
$promises[] = $this->channel->publish($i, 'bench');
wait($promises);
}
1000
итераций
Клиент на С vs PHP
* Меньше - лучше (μs)
Профилирование
Tideways
XHProf
Профилирование. Blackfire
Клиент. Оптимизация записи
Client Server
stream_socket_client()
pack()
stream_write()
pack()
stream_write()
Клиент. Оптимизация записи
Client Server
stream_socket_client()
pack()
pack()
stream_write()
pack()
function publish(string $body, array $headers = [])
{
$method = $this->methodFrame();
$headers = $this->headersFrame($headers);
$body = $this->bodyFrame($body);
$request = $method->append($headers)->append($body);
yield $this->socket->write((string) $request);
}
Клиент. Оптимизация записи
function publish(string $body, array $headers = [])
{
$method = $this->methodFrame();
$headers = $this->headersFrame($headers);
$body = $this->bodyFrame($body);
$request = $method->append($headers)->append($body);
yield $this->socket->write($request);
}
Клиент. Оптимизация записи
function publish(string $body, array $headers = [])
{
$method = $this->methodFrame();
$headers = $this->headersFrame($headers);
$body = $this->bodyFrame($body);
$request = $method->append($headers)->append($body);
yield $this->socket->write($request);
}
Клиент. Оптимизация записи
function publish(string $body, array $headers = [])
{
$method = $this->methodFrame();
$headers = $this->headersFrame($headers);
$body = $this->bodyFrame($body);
$request = $method->append($headers)->append($body);
yield $this->socket->write($request);
}
Клиент. Оптимизация записи
Клиент. Оптимизация чтения
Client Server
stream_socket_client()
stream_read()new Binary(...);parse()
Client Server
stream_socket_client()
stream_read()
stream_read()new Binary(...);
new Binary(...);parse()
parse()
Клиент. Оптимизация чтения
Client Server
stream_socket_client()
stream_read()
stream_read()
stream_read()
new Binary(...);
new Binary(...);
new Binary(...);parse()
parse()
parse()
Клиент. Оптимизация чтения
Бинарный буфер
App Socket
BinaryBuffer
Бинарный буфер
App Socket
BinaryBuffer
Бинарный буфер
App Socket
BinaryBuffer
Бинарный буфер
App Socket
Frame
BinaryBuffer
Бинарный буфер
App Socket
Frame
BinaryBuffer
Бинарный буфер
App Socket
BinaryBuffer
Бинарный буфер
App Socket
BinaryBuffer
Бинарный буфер
App Socket
Frame
BinaryBuffer
Client Server
stream_socket_client()
Клиент. Оптимизация чтения
new BinaryBuffer;
Client Server
stream_socket_client()
stream_read()BinaryBuffer::append();parse()
Клиент. Оптимизация чтения
new BinaryBuffer;
Client Server
stream_socket_client()
stream_read()
stream_read()
BinaryBuffer::append();
BinaryBuffer::append();parse()
parse()
Клиент. Оптимизация чтения
new BinaryBuffer;
Клиент на С vs PHP
* Меньше - лучше (μs)
Профилирование. Blackfire
Buffer::append
Buffer::discard
Buffer::appendUint8
Buffer::appendUint16
Buffer::read
Buffer::consume
Buffer::consumeUint8
34130
15094
12040
11027
9030
8042
7055
class Binary
{
public function append(string value) -> <Binary>
{
let this->data = this->data . value;
let this->size = this->size + strlen(value);
return this;
}
public function appendUint8(int value) -> <Binary>
{
return this->append(pack("C", value));
}
}
Zephir
Zephir vs PHP
* Меньше - лучше (μs)
PHP_METHOD(Binary, appendUint8)
{
zval *value_param = NULL, _0, _1, _2;
zephir_fetch_params(1, 1, 0, &value_param);
zend_long value = zephir_get_intval(value_param);
ZVAL_STRING(&_0, "C");
ZVAL_LONG(&_1, value);
ZEPHIR_CALL_FUNCTION(&_2, "pack", NULL, 2, &_0, &_1);
ZEPHIR_RETURN_CALL_METHOD(getThis(), "append", NULL, 0, &_2);
}
Zephir. Скомпилированный код
PHP_METHOD(Binary, appendUint8)
{
zval *value_param = NULL, _0, _1, _2;
zephir_fetch_params(1, 1, 0, &value_param);
zend_long value = zephir_get_intval(value_param);
ZVAL_STRING(&_0, "C");
ZVAL_LONG(&_1, value);
ZEPHIR_CALL_FUNCTION(&_2, "pack", NULL, 2, &_0, &_1);
ZEPHIR_RETURN_CALL_METHOD(getThis(), "append", NULL, 0, &_2);
}
Zephir. Скомпилированный код
std::vector<u_char>
Расширение C
std::deque<u_char>
std::vector<u_char>
vector::insert - O(1)*
vector::erase - O(n)
vector::begin - O(1)
vector::end - O(1)
vector::empty - O(1)
vector::size - O(1)
Расширение C
std::deque<u_char>
deque::insert - O(1)
deque::erase - O(1)
deque::begin - O(1)
deque::end - O(1)
deque::empty - O(1)
deque::size - O(1)
std::vector<u_char>
vector::insert - O(1)*
vector::erase - O(n)
vector::begin - O(1)
vector::end - O(1)
vector::empty - O(1)
vector::size - O(1)
Расширение C
std::deque<u_char>
deque::insert - O(1)
deque::erase - O(1)
deque::begin - O(1)
deque::end - O(1)
deque::empty - O(1)
deque::size - O(1)
PHP_METHOD(Binary, appendUInt8)
{
buffer *buf = buffer_from_zend(Z_OBJ_P(getThis()));
zend_long value;
if (!ZEND_PARSE_THROW(ZEND_NUM_ARGS(), "l", &value)) {
return;
}
buf->data->append<unsigned char>(value);
RETURN_ZVAL(getThis(), 1, 0);
}
Расширение C
https://github.com/phpinnacle/ext-buffer
PHP_METHOD(Binary, readUnsafe)
{
...
string res(buf.begin() + offset, buf.begin() + offset + size);
char * data = res.c_str();
RETURN_NEW_STR(zend_string_init(data, strlen(data), 0));
}
Расширение C
PHP_METHOD(Binary, readUnsafe)
{
...
string res(buf.begin() + offset, buf.begin() + offset + size);
// WRONG WAY! You lose your binary data
char * data = res.c_str();
RETURN_NEW_STR(zend_string_init(data, strlen(data), 0));
}
Расширение C
PHP_METHOD(Binary, readSafe)
{
...
string res(buf.begin() + offset, buf.begin() + offset + size);
RETURN_NEW_STR(zend_string_init(res.data(), res.size(), 0));
}
Расширение C
Binary
Safe
Zephir vs PHP vs C/C++
* Меньше - лучше (μs)
Итого
● https://github.com/Ostico/PhpOrient
● https://github.com/tarantool-php/client
Итого
● https://github.com/Ostico/PhpOrient
● https://github.com/tarantool-php/client
● https://github.com/markkimsal/amphp-mqtt
● https://github.com/prooph/event-store
Итого
● https://github.com/Ostico/PhpOrient
● https://github.com/tarantool-php/client
● https://github.com/markkimsal/amphp-mqtt
● https://github.com/prooph/event-store
● https://github.com/phpinnacle/cassis
● https://github.com/phpinnacle/ridge
Итого
● https://github.com/Ostico/PhpOrient
● https://github.com/tarantool-php/client
● https://github.com/markkimsal/amphp-mqtt
● https://github.com/prooph/event-store
● https://github.com/phpinnacle/cassis
● https://github.com/phpinnacle/ridge
СПАСИБО!
Вопросы?
zloyusr@gmail.com
https://github.com/phpinnacle

Contenu connexe

Tendances

Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Moscow.pm
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Moscow.pm
 
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Anatoly Sharifulin
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовAndrew Shitov
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 
Python
PythonPython
Pythonpelid
 
Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"Yandex
 
Hf labs education day. rocket science
Hf labs education day. rocket scienceHf labs education day. rocket science
Hf labs education day. rocket scienceOlga Kiseleva
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Andrew Shitov
 
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеровMedia Gorod
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?Ivan Tsyganov
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersPositive Hack Days
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIIlya Chesnokov
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)Mikhail Davydov
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 

Tendances (20)

Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
 
PHP basic
PHP basicPHP basic
PHP basic
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16Что нового в Perl? 5.10 — 5.16
Что нового в Perl? 5.10 — 5.16
 
Rose::DB
Rose::DBRose::DB
Rose::DB
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
Python
PythonPython
Python
 
Collider
ColliderCollider
Collider
 
Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"
 
Hf labs education day. rocket science
Hf labs education day. rocket scienceHf labs education day. rocket science
Hf labs education day. rocket science
 
Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6Параллельные вычисления в Perl 6
Параллельные вычисления в Perl 6
 
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеров
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappers
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PI
 
Приручаем linux-консоль
Приручаем linux-консольПриручаем linux-консоль
Приручаем linux-консоль
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 

Similaire à Anton Shabouta "Implementing async binary clients in pure PHP"

Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Ontico
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоFuenteovejuna
 
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitВёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitAndrey Sitnik
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint Kyiv
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Open-IT
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 

Similaire à Anton Shabouta "Implementing async binary clients in pure PHP" (20)

Perl – жив?!
Perl – жив?!Perl – жив?!
Perl – жив?!
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кодаSECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitВёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
Algo 00
Algo 00Algo 00
Algo 00
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
DevPoint 2016: Признаки плохого кода и как с ним бороться в PHP проектах - Па...
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”Командная разработка “толстых клиентов”
Командная разработка “толстых клиентов”
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 

Plus de Fwdays

"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y..."How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...Fwdays
 
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil TopchiiFwdays
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro SpodaretsFwdays
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym KindritskyiFwdays
 
"Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl..."Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl...Fwdays
 
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T..."How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...Fwdays
 
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ..."The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...Fwdays
 
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu..."[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...Fwdays
 
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care..."[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...Fwdays
 
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"..."4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...Fwdays
 
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast..."Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...Fwdays
 
"Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others..."Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others...Fwdays
 
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?", Oleksandra MyronovaFwdays
 
"Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv..."Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv...Fwdays
 
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin..."How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...Fwdays
 

Plus de Fwdays (20)

"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y..."How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
 
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
 
"Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl..."Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl...
 
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T..."How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
 
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ..."The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
 
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu..."[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
 
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care..."[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
 
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"..."4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
 
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast..."Reconnecting with Purpose: Rediscovering Job Interest after Burnout",  Anast...
"Reconnecting with Purpose: Rediscovering Job Interest after Burnout", Anast...
 
"Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others..."Mentoring 101: How to effectively invest experience in the success of others...
"Mentoring 101: How to effectively invest experience in the success of others...
 
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova"Mission (im) possible: How to get an offer in 2024?",  Oleksandra Myronova
"Mission (im) possible: How to get an offer in 2024?", Oleksandra Myronova
 
"Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv..."Why have we learned how to package products, but not how to 'package ourselv...
"Why have we learned how to package products, but not how to 'package ourselv...
 
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin..."How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
"How to tame the dragon, or leadership with imposter syndrome", Oleksandr Zin...
 

Dernier (9)

Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 

Anton Shabouta "Implementing async binary clients in pure PHP"