01 сентября 2021 07 сентября 2021 JavaScript


Когда необходимо обработать query_string из урла с помощью JS то самый простой и экономный вариант использовать URLSearchParams и reduce следующим образом

// распасить урл
const searchParams = new URLSearchParams(window.location.search.substring(1)); 

// преобразовать в обычный Объект
const params = [...searchParams.entries()].reduce((acm, x) => {return {...acm, [x[0]]: x[1] }}, {}); 

константа params будет содержать словарь с данными из запроса (исключая дубли)

Может статься так, что потребуется передать строку больше чем 2048 байт, в таком случае использовать  window.location.search не получится из-за ограничений GET запроса протокола HTTP.

Но можно воспользоваться дополнение window.location.hash это строка Хеш идущая после символа #

в таком случае чуть в код добавляет маленькая вставка

const searchParams1 = new URLSearchParams(
    window.location.search.substring(1) + '&' + window.location.hash.substring(1)
);

const args = [...searchParams1.entries()].reduce(
    (akm, x) => ({ ...akm, ...Object.fromEntries([x]) }), {},
);

 


30 августа 2021 СуБД select psql concat



Иногда появляется необходимость скопировать некоторые поля из одной базы данных в другую. Как мне кажется, самым простым способом копирования отдельных полей у некоторых строк является генерация SQL скрипта в одной базе и исполнение этого запроса на другой. Например,

select order_num, slug  from catalog_humanmenu where tree_id = 6 and is_public= true  and order_num > 0 order by order_num

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

select concat('update catalog_humanmenu set order_num=',order_num,' where slug=''',slug,''';')  from catalog_humanmenu where tree_id = 6 and is_public= true  and order_num > 0 order by order_num;

теперь переключаем вывод результатов запроса не в терминал, а файл на локальном или удалённом диске

\o ordering-guid.txt

-- затем повторяем генератор SQL скрипта и вывод этой команды сохранится в файле ordering-guid.txt

select concat('update catalog_humanmenu set order_num=',order_num,' where slug=''',slug,''';')  from catalog_humanmenu where tree_id = 6 and is_public= true  and order_num > 0 order by order_num;

-- закрываем SQL сессию

\q

в новообразованном файле ordering-guid.txt необходимо удалить первые и последние строки, а затем выполнить его в базе назначения

psql < ordering-guid.txt

Всё, необходимые поля из отобранных строк перенесены в соответствующие поля и строки базы назначения


12 июля 2021 14 июля 2021 JavaScript reduce рекурсия children


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

function object_list_2_flat_array (obj_list) {

    var conv = function(xxx, x) {
        return [x, ...x["children"].reduce(conv, xxx)];
    };
    return obj_list.reduce(conv, new Array());

};

Тут накапливающий метод reduce вызывает рекурсию для каждого узла иерархии и результаты складывает в аккумулятор.


20 мая 2021 Linux


выключить звуковой сервер

killall -9 pulseaudio

запустить звуковой сервер

pulseaudio -D

 


03 мая 2021 28 декабря 2022 Hardware | решать тесты

  • У вас комп лучше?


Основной компьютер

  • Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz
  • Dell Inc.  0RYP79 A00
  • DDR4 (4096 MB/8192 MB) 2400 MT/s # sudo dmidecode --type 17
  • Intel Corporation HD Graphics 530

бенчмарк от 7z на Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz

p7zip Version 16.02 (locale=ru_RU.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz (506E3),ASM,AES-NI)

Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz (506E3)
CPU Freq: - - - - - - - - -

RAM size:   11890 MB,  # CPU hardware threads:   4
RAM usage:    882 MB,  # Benchmark threads:      4

                       Compressing  |                  Decompressing
Dict     Speed Usage    R/U Rating  |      Speed Usage    R/U Rating
         KiB/s     %   MIPS   MIPS  |      KiB/s     %   MIPS   MIPS

22:       9252   261   3451   9000  |     117231   321   3117  10002
23:      10885   289   3837  11091  |     111271   310   3107   9628
24:      10924   297   3955  11746  |     110634   313   3103   9712
25:      11265   311   4137  12862  |     100321   289   3093   8928
----------------------------------  | ------------------------------
Avr:             289   3845  11175  |              308   3105   9567
Tot:             299   3475  10371

Резервный компьютер

  • AMD Phenom II x6 1075t (AMD Athlon(tm) II X3 435 Processor) на радиаторе GAMMAXX 400 v2
  • ASUSTeK Computer INC. M4A78LT-M LX Rev X.0x
  • DDR3 DIMM, 1066-1866 МГц (8Gb)
  • GeForce GTX 650 Ti

бенчмарк от 7z на AMD Phenom II x6 1075t

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=ru_RU.UTF-8,Utf16=on,HugeFiles=on,6 CPUs)

RAM size:    7975 MB,  # CPU hardware threads:   6
RAM usage:   1275 MB,  # Benchmark threads:      6

Dict        Compressing          |        Decompressing
      Speed Usage    R/U Rating  |    Speed Usage    R/U Rating
       KB/s     %   MIPS   MIPS  |     KB/s     %   MIPS   MIPS

22:   13256   519   2486  12895  |   182836   585   2821  16492
23:   13247   533   2533  13497  |   179127   581   2821  16390
24:   12986   542   2573  13963  |   177860   587   2809  16498
25:   12686   551   2627  14484  |   172736   581   2795  16244
----------------------------------------------------------------
Avr:          536   2555  13710               583   2811  16406
Tot:          560   2683  15058

Рабочий компьютер

  • Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
  • Gigabyte B75M-D3H (LGA1155)
  • DDR3 1600 MT/s 32Gb
  • GeForce GTX 1650 (GPU 0)

бенчмарк от 7z на Core(TM) i5-3470 CPU

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,4 CPUs Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz (306A9),ASM,AES-NI)

        Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz (306A9)
CPU Freq:  3271  3314  3372  3305  3346  3342  3349  3334  3339

RAM size:   32064 MB,  # CPU hardware threads:   4
RAM usage:    882 MB,  # Benchmark threads:      4

                       Compressing  |                  Decompressing
Dict     Speed Usage    R/U Rating  |      Speed Usage    R/U Rating
         KiB/s     %   MIPS   MIPS  |      KiB/s     %   MIPS   MIPS

22:      13665   319   4166  13294  |     146238   362   3444  12476
23:      13197   324   4156  13447  |     132546   333   3442  11469
24:      13252   330   4312  14249  |     140723   359   3444  12353
25:      12177   318   4369  13904  |     138048   359   3423  12286
----------------------------------  | ------------------------------
Avr:             323   4251  13724  |              353   3438  12146
Tot:             338   3844  12935  

второй резервный

Архитектура:                     x86_64
CPU op-mode(s):                  32-bit, 64-bit
Порядок байт:                    Little Endian
Address sizes:                   36 bits physical, 48 bits virtual
CPU(s):                          4
On-line CPU(s) list:             0-3
Потоков на ядро:                 1
Ядер на сокет:                   2
Сокетов:                         2
NUMA node(s):                    1
ID прроизводителя:               GenuineIntel
Семейство ЦПУ:                   6
Модель:                          15
Имя модели:                      Intel(R) Xeon(R) CPU            5160  @ 3.00GHz
Степпинг:                        6
CPU МГц:                         2938.028
BogoMIPS:                        5984.54
Виртуализация:                   VT-x
L1d cache:                       128 KiB
L1i cache:                       128 KiB
L2 cache:                        8 MiB
NUMA node0 CPU(s):               0-3
Vulnerability Itlb multihit:     KVM: Mitigation: VMX disabled
Vulnerability L1tf:              Vulnerable
Vulnerability Mds:               Vulnerable: Clear CPU buffers attempted, no mic
                                 rocode; SMT disabled
Vulnerability Meltdown:          Mitigation; PTI
Vulnerability Spec store bypass: Vulnerable
Vulnerability Spectre v1:        Mitigation; usercopy/swapgs barriers and __user
                                  pointer sanitization
Vulnerability Spectre v2:        Mitigation; Full generic retpoline, STIBP disab
                                 led, RSB filling
Vulnerability Srbds:             Not affected
Vulnerability Tsx async abort:   Not affected
Флаги:                           fpu vme de pse tsc msr pae mce cx8 apic sep mtr
                                 r pge mca cmov pat pse36 clflush dts acpi mmx f
                                 xsr sse sse2 ht tm pbe syscall nx lm constant_t
                                 sc arch_perfmon pebs bts rep_good nopl cpuid ap
                                 erfmperf pni dtes64 monitor ds_cpl vmx est tm2
                                 ssse3 cx16 xtpr pdcm dca lahf_lm pti tpr_shadow
                                  dtherm

MATHERBORAD

SMBIOS 2.4 present.

Handle 0x0022, DMI type 2, 16 bytes
Base Board Information
    Manufacturer: Apple Computer, Inc.
    Product Name: Mac-F4208DC8
    Version: PVT
    Serial Number: Base Board Serial#
    Asset Tag: Base Board Asset Tag#
    Features:
        Board is a hosting board
        Board is replaceable
    Location In Chassis: Part Component
    Chassis Handle: 0x0023
    Type: Motherboard
    Contained Object Handles: 0

p7zip Version 16.02 (locale=ru_RU.UTF-8,Utf16=on,HugeFiles=on,64 bits,8 CPUs Intel(R) Xeon(R) CPU           X5355  @ 2.66GHz (6F7),ASM)

Intel(R) Xeon(R) CPU           X5355  @ 2.66GHz (6F7)
CPU Freq: - - - - - - - - -

RAM size:   32110 MB,  # CPU hardware threads:   8
RAM usage:   1765 MB,  # Benchmark threads:      8

Compressing  |                  Decompressing
Dict     Speed Usage    R/U Rating  |      Speed Usage    R/U Rating
         KiB/s     %   MIPS   MIPS  |      KiB/s     %   MIPS   MIPS

22:      16176   741   2124  15736  |     246332   786   2674  21011
23:      14728   755   1988  15006  |     240288   783   2654  20794
24:      12957   706   1973  13931  |     234731   784   2629  20602
25:      12399   722   1960  14158  |     225780   778   2583  20094
----------------------------------  | ------------------------------
Avr:             731   2011  14708  |              783   2635  20625
Tot:             757   2323  17666

Резервная материнская плата

GIGABYTE GA-880GA-UD3H


22 апреля 2021 26 августа 2022 СуБД Postgresql psql bash awk for drop table cascade | решать тесты

  • Знаете ли вы другой способ удаления группы таблиц в Postgres


Скрипт каскадного удаления таблиц в psql
 

for t in $(echo '\dt' | psql $data_base |awk -F\| '{print $2}'); do 
    echo "drop table $t cascade;" ; 
done | psql $data_base

Суть скрипта проста:

  • echo '\dt' | psql $database # выводит список таблиц базы данных из переменной $database
  • awk -F\| '{print $2}' # вывести второй столбец из списка
  • do echo "drop table $t cascade;" ; done # тело цикла формирующее набор SQL команд
  • | psql $database # выполнить SQL код

13 апреля 2021 22 апреля 2021 Bash bash curl check 404 | решать тесты

  • Зачем нужна опция -q при использования утилиты curl


Список ссылок размещён в файле /tmp/pdf.csv
 

for u in $(cat /tmp/pdf.csv); do 
curl -I $u 2> /dev/null | grep 'HTTP/1.1 404' -q && echo 404 `basename $u` || echo ok `basename $u`  
done

 


12 января 2021 Nginx


certbot --dry-run --manual --agree-tos --preferred-challenges dns certonly --server https://acme-v02.api.letsencrypt.org/directory  -d *.sitename.ru -d sitename.ru -m webmaster@sitename.ru

в два захода добавляем TXT записи с именем _acme-challenge и выводимыми утилитой значениями

certbot --manual --agree-tos --preferred-challenges dns certonly --server https://acme-v02.api.letsencrypt.org/directory  -d *.sitename.ru -d sitename.ru -m webmaster@sitename.ru

добавляем ещё одно значение _acme-challenge

cat  /etc/letsencrypt/live/sitename.ru/fullchain.pem /etc/letsencrypt/live/sitename.ru/privkey.pem >  /etc/haproxy/certs/www.sitename.ru.pem

генерируем контейнер и перезапускаем балансировщик

haproxy -c -V -f /etc/haproxy/haproxy.cfg && service haproxy reload

 


02 декабря 2020 27 апреля 2022 Всякое


DALI COMMANDS

Type of addresses:

address byte:

Short or group address

YAAAAAAS

Short addresses (64)

0AAAAAAS

Group addresses (16)

100AAAAS

Broadcast

100AAAAS

Special command

101CCCC1

Special command

110CCCC1

 

 

S: selector bit:

S = ‘0’ direct arc power level following

 

S = ‘1’ command following

 

Y = ‘0’ short address

 

Y = ‘1’ group address or broadcast

A: significant address bit

 

C: significant command bit

 

 

 

Table 1 contains a complete summary of the DALI command set. Basically there are four types of commands (forward frames):

1. Direct / Indirect arc power control commands – used to set ballast power level.

2. Configuration commands – configures the ballast (for example: add to a group or store level). Command must be repeated within 100 ms, otherwise it’s ignored.

3. Query commands – ask slave (ballast) for status information (for example: power level or version number). The slave can send a backward frame.

4. Special commands – used to initialize and setup the ballast, some must be repeated within 100 ms, and some require an answer from the slave. Most commands are only processed within 15 minutes after an “INITIALIZE” command is received.

Table 1. DALI Command Set Summary

Number

Command Code

Repeat < 100 ms

Answer Slave

Command Name

-

YAAA AAA0 XXXX XXXX

no

no

DIRECT ARC POWER CONTROL

0

YAAA AAA1 0000 0000

no

no

OFF

1

YAAA AAA1 0000 0001

no

no

UP

2

YAAA AAA1 0000 0010

no

no

DOWN

3

YAAA AAA1 0000 0011

no

no

STEP UP

4

YAAA AAA1 0000 0100

no

no

STEP DOWN

5

YAAA AAA1 0000 0101

no

no

RECALL MAX LEVEL

6

YAAA AAA1 0000 0110

no

no

RECALL MIN LEVEL

7

YAAA AAA1 0000 0111

no

no

STEP DOWN AND OFF

8

YAAA AAA1 0000 1000

no

no

ON AND STEP UP

9-15

YAAA AAA1 0000 1XXX

 

 

RESERVED

16 - 31

YAAA AAA1 0001 XXXX

no

no

GO TO SCENE

32

YAAA AAA1 0010 0000

yes

no

RESET

33

YAAA AAA1 0010 0001

yes

no

STORE ACTUAL LEVEL IN THE DTR

34 - 41

YAAA AAA1 0010 XXXX

 

 

RESERVED

42

YAAA AAA1 0010 1010

yes

no

STORE THE DTR AS MAX LEVEL

43

YAAA AAA1 0010 1011

yes

no

STORE THE DTR AS MIN LEVEL

44

YAAA AAA1 0010 1100

yes

no

STORE THE DTR AS SYSTEM FAILURE LEVEL

45

YAAA AAA1 0010 1101

yes

no

STORE THE DTR AS POWER ON LEVEL

46

YAAA AAA1 0010 1110

yes

no

STORE THE DTR AS FADE TIME

47

YAAA AAA1 0010 1111

yes

no

STORE THE DTR AS FADE RATE

48 - 63

YAAA AAA1 0011 XXXX

 

 

RESERVED

64 - 79

YAAA AAA1 0100 XXXX

yes

no

STORE THE DTR AS SCENE

80 - 95

YAAA AAA1 0101 XXXX

yes

no

REMOVE FROM SCENE

96 - 111

YAAA AAA1 0110 XXXX

yes

no

ADD TO GROUP

112 -127

YAAA AAA1 0111 XXXX

yes

no

REMOVE FROM GROUP

128

YAAA AAA1 1000 0000

yes

no

STORE DTR AS SHORT ADDRESS

129 -143

YAAA AAA1 1000 XXXX

 

 

STORE DTR AS SHORT ADDRESS

144

YAAA AAA1 1001 0000

no

yes

QUERY STATUS

145

YAAA AAA1 1001 0001

no

yes

QUERY BALLAST

146

YAAA AAA1 1001 0010

no

yes

QUERY LAMP FAILURE

147

YAAA AAA1 1001 0011

no

yes

QUERY LAMP POWER ON

148

YAAA AAA1 1001 0100

no

yes

QUERY LIMIT ERROR

149

YAAA AAA1 1001 0101

no

yes

QUERY RESET STATE

150

YAAA AAA1 1001 0110

no

yes

QUERY MISSING SHORT ADDRESS

151

YAAA AAA1 1001 0111

no

yes

QUERY VERSION NUMBER

152

YAAA AAA1 1001 1000

no

yes

QUERY CONTENT DT


28 сентября 2018 11 октября 2023 Python git


#!/usr/bin/env python
# $ID$ #
import sys
import subprocess


try:

    IIDD = "$I"+"D: {}  $".format(
        subprocess.check_output(['git', 'log', '-1', '--format=%ae / %an / %cd']).decode("utf-8")[:-1]
    )

    if IIDD:
        for line in sys.stdin:
            sys.stdout.write( line.replace("$I"+"D$", IIDD ) )

except:
    pass

А вот настройки git для работы с этим скриптом

файл .git/config


[filter "idder"]
    smudge = python iidd.py
    clean = perl -pe \"s/\\\\\\$ID[^\\\\\\$]*\\\\\\$/\\\\\\$ID\\\\\\$/\"

файл .gitattributes


*.js filter=idder
*.py filter=idder
*.css filter=idder
*.html filter=idder


28 сентября 2018 17 марта 2022 Nginx CNAME тип A wildcard dns-алиасы


Не все знают зачем к имени сайта добавляют префикс www., по мимо субъективных причин, про world wide web и удобство парсинга урлов есть совершенно объективная причина использовать алиас WWW.

Всё дело в структуре протокола DNS, когда происходит преобразование доменного имени обычного домена первого уровня, то происходит запрос к корневому серверу зоны, а корневые сервера зон обновляются достаточно редко, например в зоне .RU обновление происходит 4 раза в день, а при преобразовании домена третьего уровня, про выполняется запрос к DNS серверу контролирующему домен, а он обновляется быстрее чем корневые сервера зоны.

Таким образом, если у вас отключили сервер сайта, и вы меняете IP адрес парковки домена на IP адрес резервного, то вашим клиентам придётся ждать обновления корневого DNS, а если меняется IP адрес у алиаса WWW.yourdomain то обновление произойдёт гораздо быстрее, в некоторых случаях сразу

UDP: типа записи для алиаса www лучше указывать как A, потому что тип CNAME требует дополнительного DNS запроса для получения IP адреса


28 июня 2018 04 марта 2022 СуБД


Есть таблица dispatch_dispatch_form в дублирующимися строками

чтобы быстро почистить таблицу от дублей необходимо:

delete from dispatch_dispatch_form  a using dispatch_dispatch_form b WHERE a.id < b.id AND a.email = b.email ;

вот так всё просто


28 мая 2018 Nginx



Есть стереотип, что жители китая любят копировать готовое, а значит необходимо защищать от них контент, особенно медиа контент. Обычно это делается так:

  • CMS во время создания сессии новоми клиенту сайта проверяет IP клиента на принадлежность стране запрета
  • во время этой проверки делается либо запрос в базу данных, либо API запрос на внешний сервер (но в любом случае получаются временные издержки на запрос)
  • если IP входит в запрещённую сеть, то пользователь перенаправляется на страницу заглушку либо генерируется ошибка 403 или 404
  • иначе пользователь продолжает просматривать страницы сайта вместе с включёнными в них картинками

Но в случае применения такого метода остаётся возможность получить доступ через Proxy/VPN либо воспользовать кешем любого поисковика, а они подтянут с сайта все защищаемые картинки

При  этом необходимо так же следить за актуальностью базы данных IP адресов или за состояние API сервиса

Если такие условия и ограничения не являются приелимыми, то можно воспользоваться возможностью веб-сервера Nginx фильтровать входящие запросы по HTTP-заголовкам. Суть этого метода в том, что у любого человека его родной язык включён в список языков его веб-браузера, таким образом у китайца среди всех языков, которые он использует есть китайский, а значит в его запросе на сайт будет присутвовать вот такой HTTP-заголовок

Accept-language: zh,ru;q=0.8,en-US;q=0.5,en;q=0.3

Значит нужно научить веб-сервер выделять таких клиентов и направлять их туда куда нужно, я сделал это вот так

map $http_accept_language $lang {
    default ru;
    ~by by;
    ~ru ru;
    ~zh zh;
}

location /media/ {
        # если китаец
        set $redir  0;
        if ( $lang ~* 'zh' ){
            set $redir  1;
        }
        # если запрос фотографии
        if ( $request_uri ~* \.(jpeg|jpg|png)$ ){
            set $redir  2$redir;
        }
        if ( $redir = 21 ){
            rewrite /media/(.*) /media_v/$1?lang=$lang&redir=$redir&$http_referer;
        }

        alias /webapps/centrsvet/media/;
    }

location /media_v/ {
            image_filter_jpeg_quality 10;
            image_filter resize 700 600;
            alias /webapps/centrsvet/media/;
    }

  • Здесь в первая конструкция определяет переменную $lang
  • вторая конструкция определяет поведение веб-сервера при обращении к директирии с фотографиями, тут "накапливаются" тесты в переменной $redir и если среди языков присутвует китайский и он запрашивает какое либо изображение, то происходит редирект в директорию media_v
  • в правило директории media_v уменьшает качество и размер изображения с помощью встроенного в nginx модуля обработки изображений

защита фотографий от китайцев

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


24 мая 2018 27 ноября 2022 Всякое


  • Сайт итальянского правительства https://www.esteri.it/
  • Сайт правительства эфиопии http://www.ethiopia.gov.et/
  • Сайт сената США https://soprweb.senate.gov/

ps: собираю ссылки на популярные сайты с использование Bootstrap


04 мая 2018 25 августа 2022 JavaScript


Архитектура современного веб-приложения выглядит как показано на картинке

Архитектура современного веб-приложения


01 апреля 2018 Python


После миграции на более новую версию Django при изменении любой модели может вылезать вот такая ошибка

django.db.utils.IntegrityError: null value in column "name" violates not-null constraint
DETAIL:  Failing row contains (101, null, history, historymodel).

Это связано с тем что в старой версии для хранения имени модуля использовалось поле name а в новой app_label, при этом поле name является обязательным к заполнению и не учавствует в работе миграции, отсюда и происходит ошибка

Для решения проблемы достаточно удалить поле name из таблицы django_content_type