08 августа 2023 Python Django Form Validator custom


Если необходимо выделить поле формы содержащее ошибку то необходимо переопредить форму так

class FeedbackForm(forms.Form):
    name = forms.CharField(label="Имя", max_length=50)
    email = forms.EmailField(label="E-mail", max_length=50)
    phone = forms.CharField(label="Телефон", max_length=20)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for visible in self.visible_fields():            
            if visible.errors:  # при наличии ошибки поля, добавляем css-класс и меняем title
                visible.field.widget.attrs["class"] = "form__input has-error"
                visible.field.widget.attrs["title"] = "".join(visible.errors)
            else:
                visible.field.widget.attrs["class"] = "form__input"

            visible.field.widget.attrs["required"] = True

    def clean_email(self):
        return check_email(self.cleaned_data["email"]).lower()

    def clean_name(self):
        return self.cleaned_data["name"].title()

    def clean_phone(self):
        _phone = self.cleaned_data["phone"]
        _phone = "".join(re.findall("([\\d]+)", _phone))
        if re.match( "^\\+?[1-9][0-9]{7,14}$", _phone):
            return f"+{_phone}"
        raise ValidationError("Телефон не соответствует формату")

Конструктор формы позволяет переопредить настройки виджета поля формы, а так же предоставляет список ошибок обрануженных при валидации формы


07 июля 2023 Python


У Django есть возможность расширить функционал списка объектов дополнительными функциюми через управление списком функций actions

Например вот так выглядит расширение для чистки кеша

def update_cdn_cache(modeladmin, request, queryset):
    for obj in queryset:
        obj.file.clean_cache()

А затем эта функция добавляется в класс админки

class ImageAdmin(admin.ModelAdmin):

    actions = (update_cdn_cache, show_cdn_url)

По умолчанию эти функции отображаются над списком объектов в выпадающем списке и имена формируются из названий

Пример отображения Django admin actions без описаний

Видно, что выглядит для наглядности необходимо добавить описание и делается это путём добавления свойства short_description для каждой функции actions, но выглядит этот вариант не красиво, особенно когда расширений админки много

def update_cdn_cache(modeladmin, request, queryset):
    for obj in queryset:
        obj.file.clean_cache()

update_cdn_cache.short_description = _("Remove CDN file")

Чтобы избежать такого способа можно применить параметризованный декоратор

def add_short_description(short_description: str):
    def decorator(admin_action):
        def wrapper(*args, **kwargs):
            return admin_action(*args, **kwargs)
        wrapper.__name__ = admin_action.__name__  # принудительная смена названия функции
        wrapper.short_description = _(short_description)  # перевод описания
        return wrapper
    return decorator

с таким декоратором код выглядит более читаемым

@add_short_description("Remove CDN file")
def update_cdn_cache(modeladmin, request, queryset):
    for obj in queryset:
        obj.file.clean_cache()


@add_short_description("Show CDN file")
def show_cdn_url(modeladmin, request, queryset):
    for obj in queryset:
        print(obj.file.image())

Результат будет явно приятнее

Пример отображения Django admin actions с описаний функции

Есть ещё один способ, встроенный в Django

@admin.action(description=_("Enable user"))
def make_published(modeladmin, request, queryset):
    queryset.update(is_active=True)

 


06 июля 2023 Python


Имеются две модели: UploadFile и Image

Модель UploadFile содержит данные о загруженных файла FileField, md5hash

class UploadFile(models.Model):

    file = models.FileField(max_length=255)
    md5hash = models.CharField(max_length=32, editable=False, unique=True)

Модель Image содержит ссылку на UploadFile, а так же дополнительные поля Alt, Name и Tags

class Image(TranslatableModel):

    translations = TranslatedFields(
        alt=models.CharField(max_length=50)
    )

    name = models.CharField(_("Name"), max_length=50)

    file = models.ForeignKey(
        UploadFile,
        related_name="images",
        on_delete=models.DO_NOTHING,
    )

То-есть, объект Image может быть связан только с одним UploadFile, а объект UploadFile может быть связан с несколькими Image, а так же File, это необходимо для того чтобы получить централизованое хранилище всех загружаемых файлов, исключить дублирование файлов, а так же позвонить создавать наборы различных описаний файлов.

Необходимо в админ панели объекта Image встроить форму добавления объекта UploadFile, стандартными методами можно получит переопределив классы admin.ModelAdmin, но проще воспользовать готовыми переопределениями в пакете django-reverse-admin

Для создания такой вывернутой наизнанку админки необходимо определить такой класс

class ImageAdmin(TranslatableAdmin, ReverseModelAdmin):
    inline_type = "tabular"
    inline_reverse = ("file", )
    form = ImageForm

    list_display = ("alt", "thumb", "name", "tags_str", "created_at")
    list_filter = (MultiSelectFilter, )
    search_fields = ("translations__alt", "name", "tags")

 


21 апреля 2023 22 августа 2023 Linux bind dnssec


export DOMAINNAME=breys.ru

cd /var/cache/bind

dnssec-keygen -L 3600 -a RSASHA256 -b 2048  $DOMAINNAME
dnssec-keygen -L 3600 -f KSK -a RSASHA256 -b 4096 $DOMAINNAME

for key in `ls K$DOMAINNAME*.key`; do 
    echo "\$INCLUDE $key"  /etc/bind/zones/$DOMAINNAME.conf ; 
done

salt=$(head -c 1000 /dev/urandom | sha1sum | cut -b 1-16)

dnssec-signzone -A -3 $salt -N INCREMENT -o $DOMAINNAME -t /etc/bind/zones/$DOMAINNAME.conf

В результате подписанный файл зоны будет в файле /etc/bind/zones/$DOMAINNAME.conf

этот файл необходимо указать в настройках зоны и перезапустить bind9

zone "breys.ru" {
    type master;
//    file "/etc/bind/zones/breys.ru.conf";
    file "/etc/bind/zones/breys.ru.conf.signed";
};

При этом утилита dnssec-signzone подписывает каждую запись зоны /etc/bind/zones/$DOMAINNAME.conf

в который мы добавили созданные ключи через $INCLUDE

Ключи должны находиться в /var/cache/bind

В дальнейшем с зоной необходимо работать по такой схеме

  • изменения вносят в оригинальный файл зоны /etc/bind/zones/breys.ru.conf
  • подписывают изменённый файл зоны ключами:
    dnssec-signzone -A -3 $salt -N INCREMENT -o $DOMAINNAME -t /etc/bind/zones/$DOMAINNAME.conf
  • перезапускают bind9

 


21 апреля 2023 Nginx


После покупки коммерческого SSL сертификата должны появится следующие файлы

  • domanname.ru.ca-bundle - цепочка корневых сертификатов
  • domanname.ru.crt - публичный ключ
  • domanname.ru.csr - запрос сертификата
  • domanname.ru.nokey - закрытый ключ

Для установки полученного сертификата необходимо публичный ключ сертификата с цепочкой корневых сертификатов в pem контейнер. Важно не перепутать последовательность: сначала сертификат домена, а затем цепочка корневых сертификатов

cat domanname.ru.crt domanname.ru.ca-bundle > domanname.ru.pem

Затем добавить в файл настройки домена NGINX необходимо добавить (можно сразу после директивы listen 80;)

    listen 443 ssl; 
    ssl_certificate /home/domainname/ssl/domainname.ru.pem;
    ssl_certificate_key /home/domainname/ssl/domainname.ru.nokey;

Затем перезапустить NGINX


03 апреля 2023 12 октября 2023 Всякое vim


Чтобы включить отбражение warning сообщений достаточно добавить в ~/.vimrc

let g:lsp_diagnostics_echo_cursor = 1

Узнать состояние переменной vim можно с помощью команды echo

:echo g:lsp_diagnostics_echo_cursor

весь список можно посмотреть использую <C+D>, то-есть, начинаете писать :echo g:lsp<C+D> отбразит список переменных начинающихся на g:lsp

 


03 апреля 2023 12 октября 2023 Всякое vim


Для замены текст по всему файлу нужно использовать команду

:s/найти/заменить/g

опция g обязывает заменить всё, без неё будет проведена только 1 замена

Для замены текст в отдельном участке кода необходимо выделить участок в визуальном режиме, для выделения выходим в командный режим с помощью Esc, затем жмём v и перемещаем курсор до конца или начала блока текста

затем жмём :

в командной строке vim появится :'<,'>

дописываем s/найти/заменить/g так что получается

:'<,'>s/найти/заменить/g

и жмём enter

в результате текст будет заменён только в выделенном блоке


03 апреля 2023 12 октября 2023 vim


Для подключения протоколов языковых серверов в vim необходимо добавить два плагина, а чтобы это всё происходило автоматически добавить плагин установки плагинов

Установка плагина установки плагинов vim

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

затем в конфиг vim добавить конструкцию

call plug#begin()

Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'

call plug#end()

для этого необходимо отрыть vim и файл ~/.vimrc

после сохранения файла настроек, можно не выходя из vim применить новые настройки вот так

:source % или сокращённо :so %

после применения настроек необходимо установить плагины командой

:PlugInstall

vim PlugInstall

появится буфер отображающий установку плагинов, закрыть буфер :q

Затем можно запустить менеджер LSP с помощью команды

:LspManageServers

откроется буфер-диалог в котором можно выбрать необходимые LSP сервера для установки с помощью кнопки i, выйти из буфера-диалог как всегда :q

То-есть, теперь осталось лишь по одному инсталировать необходимые сервера, после чего vim начнёт использовать их для работы с исходниками

Затем, при открытии файла исходного текста vim может выдать сообщение, которое означает что для файла можно активировать поддержку LSP  командой :LspInstallServer

If you want to enable Language Server, please do :LspInstallServer

Но далее необходимо провести поднастройку связки vim+LSP под свои потребности, но это в следующей части

ссылки

https://github.com/mattn/vim-lsp-settings

https://github.com/prabirshrestha/vim-lsp

https://github.com/junegunn/vim-plug

ps: следует обратить внимание на размещённые выше ссылки на плагины vim, а так же на код в секции call plug#begin/end()


08 марта 2023 Hardware


=======================================================
    glmark2 2021.02
=======================================================
    OpenGL Information
    GL_VENDOR:     NVIDIA Corporation
    GL_RENDERER:   NVIDIA GeForce GTX 1080 Ti/PCIe/SSE2
    GL_VERSION:    4.6.0 NVIDIA 525.85.05
=======================================================
[build] use-vbo=false: FPS: 14976 FrameTime: 0.067 ms
[build] use-vbo=true: FPS: 45821 FrameTime: 0.022 ms
[texture] texture-filter=nearest: FPS: 38343 FrameTime: 0.026 ms
[texture] texture-filter=linear: FPS: 38579 FrameTime: 0.026 ms
[texture] texture-filter=mipmap: FPS: 38700 FrameTime: 0.026 ms
[shading] shading=gouraud: FPS: 37012 FrameTime: 0.027 ms
[shading] shading=blinn-phong-inf: FPS: 36705 FrameTime: 0.027 ms
[shading] shading=phong: FPS: 35755 FrameTime: 0.028 ms
[shading] shading=cel: FPS: 35650 FrameTime: 0.028 ms
[bump] bump-render=high-poly: FPS: 24752 FrameTime: 0.040 ms
[bump] bump-render=normals: FPS: 40782 FrameTime: 0.025 ms
[bump] bump-render=height: FPS: 39765 FrameTime: 0.025 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 33161 FrameTime: 0.030 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 24136 FrameTime: 0.041 ms
[pulsar] light=false:quads=5:texture=false: FPS: 39287 FrameTime: 0.025 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 10239 FrameTime: 0.098 ms
[desktop] effect=shadow:windows=4: FPS: 21362 FrameTime: 0.047 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 2841 FrameTime: 0.352 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 3714 FrameTime: 0.269 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 3181 FrameTime: 0.314 ms
[ideas] speed=duration: FPS: 26779 FrameTime: 0.037 ms
[jellyfish] <default>: FPS: 29440 FrameTime: 0.034 ms
[terrain] <default>: FPS: 1808 FrameTime: 0.553 ms
[shadow] <default>: FPS: 23509 FrameTime: 0.043 ms
[refract] <default>: FPS: 9068 FrameTime: 0.110 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 37475 FrameTime: 0.027 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 36949 FrameTime: 0.027 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 36338 FrameTime: 0.028 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 37287 FrameTime: 0.027 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 36778 FrameTime: 0.027 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 36874 FrameTime: 0.027 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 36889 FrameTime: 0.027 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 36393 FrameTime: 0.027 ms
=======================================================
                                  glmark2 Score: 28798 
=======================================================
 


06 марта 2023 Linux


Проверить mail._domainkey

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++

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

 

 

 

 

print

О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 типах физических устройств

  1. Шпиндельный диск HDD с интерфейсом SATA
  2. Твердотельное хранилище SSD с интерфейсом SATA
  3. NVME с интерфейсом M2

Для перемещения блоков 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

Первая, самая медленная, конфигурация: здесь блоки raid размещаются на SSD с интерфейсом SATA

средняя скорость чтения с SSD/SATA диска 540Мб/с

SSD/SATARAID0/LVM on SSD SATA

 

Вторая конфигурация: здесь блоки raid размещаются на обычном шпиндельном SATA диске

Средняя скорость чтения SATA 144Мб/с

SATARAID0/LVM on SATA

 

 

Последняя, самая быстрая конфигурация: здесь блоки raid размещаются на скоростном NVME установленнам через переходник в слот PCI-Express

Средняя скорость чтения NVME 2,7Гб/м

NVME/M2RAID0/LVM on NVME

Вывод: с помощью LVM/Raid можно получить повышение производительности цифрового хранилища.

Получается, можно взять обычный шпиндельный SATA диск, разделить его на 4 раздел, на их основе создать LVM/RAID0 и получить увеличение скорости чтения в несколько раз

даже звучит дико

сводная таблица, в кавычках количество разделов используемых в 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

настройка частоты оперативной памяти в BIOS

А с помощью этой команды можно узнать частоту, вольтаж и значения rank оперативной памяти установленной в материнксую плату

dmidecode --type 17

результат работы 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    

моя сборка

 

Из особенностей:

 

  • все порты и устройства запускаются из коробки, разумеется для Nvidia необходимо ставить фирменный драйвер
  • периодически подвисает Wifi, модуль успешно сканирует сети и пытается подключиться, но подключение не происходит. не помогает ни смена Wifi точки, ни смена дистрибутива, какая то авппратная проблема и проявляется периодически, в остальное время Wifi работает
  • первый слот m2 на материнской плате предназначен только для NVME дисков, обычный SATA3.m2 там работать не будет
  • система охлаждения сильно избыточная, так как ни каким тестами и стрестестами, а так же их комбинациями не удалось разогреть CPU выше 60 градусов
  • оперативная память переключается на частоты выше 5Ггц в биосе с помощью XMP профилей
  • при передачен звука через HDMI если вслушиваться то слышен высокочастотный "призвук"
  • для данного процессора можно использовать специальные, адаптированные linux-ядра (моложе 5.18), которые будут эффективно управлять распределением нагрузки между производительными ядрам и энергоэффективными, для Ubuntu есть репозитори и скрипт для установких новых ядре, но они отказываются загружаться по причине не соответствия каким то подписями и вообще новые ядра начинают весить более 700Мб

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