06 марта 2023 Linux
Проверить mail._domainkey
dig TXT mail._domainkey.centersvet.com
Получить заголовок зоны
dig +nocmd centrsvet.com any +multiline +noall +answer
06 марта 2023 Linux
dig TXT mail._domainkey.centersvet.com
dig +nocmd centrsvet.com any +multiline +noall +answer
14 февраля 2023 Всякое Python JavaScript 1C Rust PHP C++
Python |
JavaScript |
1C |
Rust |
PHP |
C++ |
32 |
34 |
35 |
39 |
67 |
84 |
False |
break |
и |
as |
__halt_compiler |
alignas |
True |
case |
из |
async |
abstract |
alignof |
None |
class |
или |
await |
and |
and |
and |
catch |
не |
break |
array |
and_eq |
with |
const |
для |
const |
as |
asm |
assert |
continue |
если |
continue |
break |
auto |
break |
debugger |
иначе |
crate |
callable |
Bооl |
class |
default |
как |
dyn |
case |
Bitand |
continue |
delete |
когда |
else |
catch |
bltor |
def |
do |
пока |
enum |
class |
break |
del |
else |
по |
extern |
clone |
case |
elif |
export |
вконце |
false |
const |
catch |
else |
extends |
возврат |
fn |
continue |
char |
except |
finally |
попытка |
for |
declare |
char16_t |
finally |
for |
поймать |
if |
default |
char32_t |
for |
function |
исключение |
impl |
die |
compl |
from |
if |
прервать |
in |
do |
const |
global |
import |
продолжить |
let |
echo |
const_cast |
if |
in |
импорт |
loop |
else |
constexpr |
import |
instanceof |
экспорт |
match |
elseif |
continue |
in |
let |
выбросить |
mod |
empty |
dass |
is |
new |
выбор |
move |
enddeclare |
decltype |
lambda |
return |
новый |
mut |
endfor |
default |
nonlocal |
super |
метод |
pub |
endforeach |
delete |
not |
switch |
это |
ref |
endif |
do |
or |
this |
исп |
return |
endswitch |
double |
pass |
throw |
конст |
Self |
endwhile |
dynamic_cast |
raise |
try |
конструктор |
self |
eval |
else |
return |
typeof |
любой |
static |
exit |
enum |
try |
var |
область |
struct |
extends |
explicit |
while |
void |
знч |
super |
final |
export |
yield |
while |
пер |
trait |
finally |
extern |
|
with |
перечисление |
true |
for |
false |
|
yield |
структура |
type |
foreach |
float |
|
|
умолчание |
union |
function |
for |
|
|
|
unsafe |
global |
friend |
|
|
|
use |
goto |
goto |
|
|
|
where |
if |
if |
|
|
|
while |
implements |
inline |
|
|
|
|
include |
int |
|
|
|
|
include_once |
long |
|
|
|
|
instanceof |
mutable |
|
|
|
|
insteadof |
namespace |
|
|
|
|
interface |
new |
|
|
|
|
isset |
noexcept |
|
|
|
|
list |
not |
|
|
|
|
namespace |
not_eq |
|
|
|
|
new |
nullptr |
|
|
|
|
or |
operator |
|
|
|
|
|
ОR |
|
|
|
|
private |
or_eq |
|
|
|
|
protected |
private |
|
|
|
|
public |
protected |
|
|
|
|
require |
public |
|
|
|
|
require_once |
register |
|
|
|
|
return |
reinterpret_cast |
|
|
|
|
static |
return |
|
|
|
|
switch |
short |
|
|
|
|
throw |
signed |
|
|
|
|
trait |
sizeof |
|
|
|
|
try |
static |
|
|
|
|
unset |
static_assert |
|
|
|
|
use |
static_cast |
|
|
|
|
var |
struct |
|
|
|
|
while |
switch |
|
|
|
|
xor |
template |
|
|
|
|
yield |
this |
|
|
|
|
|
thread_local |
|
|
|
|
|
throw |
|
|
|
|
|
true |
|
|
|
|
|
try |
|
|
|
|
|
typedef |
|
|
|
|
|
typeid |
|
|
|
|
|
typename |
|
|
|
|
|
union |
|
|
|
|
|
unsigned |
|
|
|
|
|
using |
|
|
|
|
|
virtual |
|
|
|
|
|
void |
|
|
|
|
|
volatile |
|
|
|
|
|
wchar_t |
|
|
|
|
|
while |
|
|
|
|
|
xor |
|
|
|
|
|
xor_eq |
10 февраля 2023 Hardware
=======================================================
glmark2 2021.02
=======================================================
OpenGL Information
GL_VENDOR: NVIDIA Corporation
GL_RENDERER: NVIDIA GeForce GTX 1650/PCIe/SSE2
GL_VERSION: 4.6.0 NVIDIA 510.108.03
=======================================================
[build] use-vbo=false: FPS: 5672 FrameTime: 0.176 ms
[build] use-vbo=true: FPS: 10902 FrameTime: 0.092 ms
[texture] texture-filter=nearest: FPS: 10231 FrameTime: 0.098 ms
[texture] texture-filter=linear: FPS: 10310 FrameTime: 0.097 ms
[texture] texture-filter=mipmap: FPS: 10340 FrameTime: 0.097 ms
[shading] shading=gouraud: FPS: 9532 FrameTime: 0.105 ms
[shading] shading=blinn-phong-inf: FPS: 9510 FrameTime: 0.105 ms
[shading] shading=phong: FPS: 9201 FrameTime: 0.109 ms
[shading] shading=cel: FPS: 9341 FrameTime: 0.107 ms
[bump] bump-render=high-poly: FPS: 7611 FrameTime: 0.131 ms
[bump] bump-render=normals: FPS: 11116 FrameTime: 0.090 ms
[bump] bump-render=height: FPS: 11131 FrameTime: 0.090 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 8704 FrameTime: 0.115 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 6138 FrameTime: 0.163 ms
[pulsar] light=false:quads=5:texture=false: FPS: 10589 FrameTime: 0.094 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 4466 FrameTime: 0.224 ms
[desktop] effect=shadow:windows=4: FPS: 6935 FrameTime: 0.144 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 1132 FrameTime: 0.883 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 1434 FrameTime: 0.697 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 1271 FrameTime: 0.787 ms
[ideas] speed=duration: FPS: 9101 FrameTime: 0.110 ms
[jellyfish] <default>: FPS: 7761 FrameTime: 0.129 ms
[terrain] <default>: FPS: 867 FrameTime: 1.153 ms
[shadow] <default>: FPS: 7386 FrameTime: 0.135 ms
[refract] <default>: FPS: 2092 FrameTime: 0.478 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 10451 FrameTime: 0.096 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 10317 FrameTime: 0.097 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 10543 FrameTime: 0.095 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 10319 FrameTime: 0.097 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 10363 FrameTime: 0.096 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 10332 FrameTime: 0.097 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 10235 FrameTime: 0.098 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 10280 FrameTime: 0.097 ms
=======================================================
glmark2 Score: 8048
=======================================================
20 января 2023 25 января 2023 Linux dd losetup pvcreate vgcreate lvcreate vgchange
Задача: выжать максимум производительность из шины материнской платы.
Цель: raid массив построенный на программной технологии LVM
RAID массив 0 уровня состоит из 4 виртуальных устройств Linux созданных на основе пустых файлов размером по 512 мегабайт
Процедура создания программного LVM/RAID0
# создание пустых файлов
dd if=/dev//zero of=sda1.dd bs=1M count=512
dd if=/dev//zero of=sda2.dd bs=1M count=512
dd if=/dev//zero of=sda3.dd bs=1M count=512
dd if=/dev//zero of=sda4.dd bs=1M count=512
# создание виртуальных устройств
losetup --partscan --find --show sda1.dd
losetup --partscan --find --show sda2.dd
losetup --partscan --find --show sda3.dd
losetup --partscan --find --show sda4.dd
# создание PV
pvcreate /dev/loop15
pvcreate /dev/loop16
pvcreate /dev/loop17
pvcreate /dev/loop18
# создание VG
vgcreate vgdata /dev/loop15 /dev/loop16 /dev/loop17 /dev/loop18
# создание LVM/RAID0
lvcreate -i4 -I64 -l 100%VG -n lvmirror vgdata
Файлы блоков LVM/RAID0 будут размещать на 3 типах физических устройств
Для перемещения блоков LVM/RAID0 необходимо остановить VG, удалить виртуальные устройства, перенести файлы, создать устройства, запустить VG по следующему сценарию
# остановка VG
vgchange -a n vgdata
# деактивация виртуальных устройств
losetup -d /dev/loop15
losetup -d /dev/loop16
losetup -d /dev/loop17
losetup -d /dev/loop18
# перемещение файлов-блоков LVM/RAID0
mv sda* /путь/
cd /путь/
# создание виртуальных устройств
losetup --partscan --find --show sda1.dd
losetup --partscan --find --show sda2.dd
losetup --partscan --find --show sda3.dd
losetup --partscan --find --show sda4.dd
# запуск VG
vgchange -a y vgdata
Ниже будут показаны три комбинации конфигураций, в каждой конфигурации по два скриншота замеров производительности диска на котором размещёны блоки LVM/RAID0 и замер производительности LVM/RAID0
средняя скорость чтения с SSD/SATA диска 540Мб/с
Средняя скорость чтения SATA 144Мб/с
Средняя скорость чтения NVME 2,7Гб/м
Вывод: с помощью LVM/Raid можно получить повышение производительности цифрового хранилища.
Получается, можно взять обычный шпиндельный SATA диск, разделить его на 4 раздел, на их основе создать LVM/RAID0 и получить увеличение скорости чтения в несколько раз
даже звучит дико
SATA (WDC WD3000FYYZ-01UL1B0) | 143,3 Мб/с | |
LVM/RAID0(1) SATA | 3,0 Гб/с | 117,1 Мб/с |
LVM/RAID0(2) SATA | 3,1 Гб/с | 64,9 Мб/с |
LVM/RAID0(3) SATA | 3,9 Гб/с | 85,9 Мб/с |
LVM/RAID0(4) SATA | 5.2 Гб/с | 92.8 Мб/с |
LVM/RAID0(6) SATA | 5,5 Гб/с | 73,3 Мб/с |
SSD/SATA (Samsung SSD 870 QVO) | 540.9 Мб/с | |
LVM/RAID0(1) SSD/SATA | 2,2 Гб/с | 74,5 Мб/с |
LVM/RAID0(2) SSD/SATA | 3,7 Гб/с | 66,7 Мб/с |
LVM/RAID0(3) SSD/SATA | 5,7 Гб/с | 72,4 Мб/с |
LVM/RAID0(4) SSD/SATA | 5.1 Гб/с | 71.7 Мб/с |
LVM/RAID0(6) SSD/SATA | 7,4 Гб/с | 70,9 Мб/с |
NVME/M2 (Samsung SSD 970 EVO Plus) | 2.7 Гб/с | |
LVM/RAID0(1) NVME/M2 | 2,4 Гб/с | 457,3 Мб/с |
LVM/RAID0(2) NVME/M2 | 3.7 Гб/с | 351,9 Мб/с |
LVM/RAID0(3) NVME/M2 | 4,2 Гб/с | 453,1 Мб/с |
LVM/RAID0(4) NVME/M2 | 5.5 Гб/с | 522.4 Мб/с |
LVM/RAID0(6) NVME/M2 | 7,9 Гб/с | 462,7 Мб/с |
19 января 2023 Linux
Наконец-то, спустя 10 лет, пришлось добавлять наши родные сертификаты, есть потенциально рабочий гайд установки корневого сертификата минцифры на RedHat/Сentos, а я представляю гайд для Debian/Ubuntu
# перейти в директорию с сертифкатами
cd /usr/local/share/ca-certificates
# скачать корневые сертификаты минцифры РФ
wget https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt
# обновить список доверенных сертификатов операционной системы
update-ca-certificates --verbose
Вот и всё
18 января 2023 Hardware
На плате MSI MAG Z690M MORTAR WIFI по умолчанию частота оперативной памяти равна 4 гигагерца
Но с помощью XMP профилей можно увеличить частоту обработки запросов процессора до 5,2 гигагерца, то-есть более чем на 1/4
А с помощью этой команды можно узнать частоту, вольтаж и значения rank оперативной памяти установленной в материнксую плату
dmidecode --type 17
27 декабря 2022 26 сентября 2024 Hardware
Intel Core i5-12400F OEM | 11630 | |
MSI MAG Z690M MORTAR WIFI | 18524 |
Delete - меню БИОС F11 - меню загрузки Ctrl+F5 меню прошивки БИОС |
MSI GTX 1050 Ti | 7000 | бу |
MSI RTX 2060 SUPER | 16000 | бу |
Kingston fury beast black 32gb ddr5 | 14799 | |
ADATA XPG Lancer 32Gb ddr5 (5200 PC5-41600) |
11700 | |
MSI SPATIUM M480 [S78-440L490-P83] 1Тб nvme PCI-E 4.0 x4 устанавливается в M2_1 | 11999 | устанавливается в M2_1 (процессорный) |
Apacer AST280 [AP120GAST280-1] 120 ГБ SATA 3 | 1398 за 2 штуки | |
Corsair rm650 | ||
AMI BIOS7D42vBA | 2022-11-11 | |
Ubuntu 22.04 |
Из особенностей:
7z тестирование
7z b -mmt=12
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=ru_RU.UTF-8,Utf16=on,HugeFiles=on,64 bits,12 CPUs 12th Gen Intel(R) Core(TM) i5-12400F (90675),ASM,AES-NI)
12th Gen Intel(R) Core(TM) i5-12400F (90675)
CPU Freq: - - - - - - - - -
RAM size: 64145 MB, # CPU hardware threads: 12
RAM usage: 2647 MB, # Benchmark threads: 12
Compressing | Decompressing
Dict Speed Usage R/U Rating | Speed Usage R/U Rating
KiB/s % MIPS MIPS | KiB/s % MIPS MIPS
22: 49910 1074 4519 48553 | 454758 1186 3270 38787
23: 48027 1099 4451 48934 | 449075 1186 3275 38854
24: 46954 1119 4511 50485 | 442272 1188 3269 38818
25: 44128 1083 4651 50384 | 428389 1173 3251 38125
---------------------------------- | ------------------------------
Avr: 1094 4533 49589 | 1183 3266 38646
Tot: 1139 3899 44118
26 декабря 2022 29 декабря 2022 Всякое
Для наглядности приведу три картики илюстрирующих процесс "оцифровки звука"
на частоте 44,1 килогерца, за одну секунде будет получено данных -- 44100 * ширину слова АЦП/ЦАП, например при ширине АЦП 32 бита, за одну секунду будет получено 172 килобайта данных
на частоте 88,2 килогерца, за одну секунде будет получено данных -- 88100 * ширину слова АЦП/ЦАП, например при ширине АЦП 32 бита, за одну секунду будет получено 344 килобайта данных
на частоте 384 килогерца, за одну секунде будет получено данных -- 384000 * ширину слова АЦП/ЦАП, например при ширине АЦП 32 бита, за одну секунду будет получено 1,5 мегабайта
Соответственно, чем выше частота дискретизации и длиннее шина офицровки, тем больше накапливается данных и тем большего качества записывается или воспроизводится звук, тем больше получаются размеры аудио-файлов и большая нагрузка необходима для обработка такого объёма данных
Последняя картинка наглядно поясняет чем отличается цифровой звук от настоящего
26 декабря 2022 29 декабря 2022 Всякое
Тест выполняется на разных материнских платах, с разной оперативной памятью и разными процессорами
22 декабря 2022 26 декабря 2022 Python
Два способа цеплять обработчики событий startup и shutdown
@application.on_event("startup")
def create_start_app_handler():
print("start_app")
@application.on_event("shutdown")
def create_stop_app_handler():
print("stop_app")
application.add_event_handler(
"startup",
create_start_app_handler,
)
application.add_event_handler(
"shutdown",
create_stop_app_handler,
)
В данном виде указанные события будут обработаны по 2 раза
22 декабря 2022 27 декабря 2022 Linux
Управление dd образами производится в 4 операции
sudo losetup --partscan --find --read-only --show file.dd
# создаёт виртуальный Диск и отображает имя файла виртуального диска, в моём случае /dev/loop15
# список разделов можно посмотреть вот так sudo fdisk -l /dev/loop15
sudo mount /dev/loop15p2 /mnt
# монтирует второй раздел виртуальный диска в директорую /mnt/
# тут какие то работы с данными образами
sudo umount /mnt
# отмонтировать
sudo losetup -d /dev/loop15
# удалить виртуальный диск
16 декабря 2022 Python
В инфраструктуре Flask есть фреймворк flask_restful для реализации Rest API и последние несколько лет там начались проблемы с развитием, в результате чего появилось несколько форков. В частности я решил попробовать построить один проект на flask_restx.
В этой заметке я буду описывать, что из этого вышло и насколько это решение хорошо для использования
С помощью RESTX я реализовал следующие API
Выглядит хорошо и лаконично, вот например API получения списка публикаций пользователя
Но если смотреть в целом, то приходится для каждой модели базы писать модель сериализации
А ещё больше напрягло то, что фреймворк просто не предлагает ни какого способа пагинации. То-есть, API легко отдаёт всю выборку, а для того чтобы отдать сред выборки в стиле Django, необходимо руками высчитать total и сломать весь красивый механизм marshal_with
Так же, нет интеграции со sqlalchemy, конечно можно найти способ
но как по мне конструкция ModelX.query.filter(**kwargs).all() выглядит так себе
24 ноября 2022 Всякое
Попал в руки это замечательный контроллер и ради профилактики решил заменить. Новую предлагают купить за 23 тысячи.
Но если разобраться то оказывается, там стоит обычный аккумулятор за 600 рублей от старенького Sony Ericson
https://aliexpress.ru/item/32738463692.html
https://ru.dhgate.com/product/4pcs-original-for-sony-us503759-a8h-battery/397887722.html
05 ноября 2022 25 января 2023 Linux Linux OpenVPN Docker
Если нужно быстро запустить VPN на каком то удалённом сервере то проще всего воспользоваться готовым решением https://github.com/kylemanna/docker-openvpn
Затем делаете сколько нужно VPN ключей с помощью этой команды
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full USERNAME nopass
выгружаете в хостовую машину
docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient USERNAME > USERNAME.ovpn
И всё, можно пользоваться
Чтобы в дальнейшем сохранилась возможность генерировать новые ключи необходимо восстанавливать значение export OVPN_DATA="ovpn-data-example" и использовать passkey использованный для генерации корневого сертификата
Посмотреть статус OpenVPN сервера можно вот так
docker exec -it funny_varahamihira ovpn_status
Если необходимо запустить VPN клиента на постоянной основе, например на ubuntu сервере, то необходимо сгенерировать ключ для этого сервера, скопировать его в директорию /etc/openvpn/client.conf
и разрешить автозапуск
stemctl enable openvpn@client
При сборке на свежей системе может возникнуть ошибка
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with Angie by using --with-pcre=<path> option.
Эта ошибка проявляется если сборщик не может найти библиотку перловых регулярных выражений, решается проблема легко
sudo apt install libpcre3-dev
for t in $(echo \\dt | psql $BASE |grep public |awk '{print $3}'); do
echo "SELECT setval('$t"_id_seq"', (select max(id)+1 from $t), true);";
done | psql $BASE
Суть проблемы в том, что при репиликации таблицы значение последовательности таблицы автоматически не меняется, по этому после отключения репликации значение last_insert_id будет отставать от реального количество записей в таблице