20 мая 2021 Linux
выключить звуковой сервер
killall -9 pulseaudio
запустить звуковой сервер
pulseaudio -D
20 мая 2021 Linux
выключить звуковой сервер
killall -9 pulseaudio
запустить звуковой сервер
pulseaudio -D
03 мая 2021 28 декабря 2022 Hardware | решать тесты
У вас комп лучше?
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: 4Compressing | Decompressing
Dict Speed Usage R/U Rating | Speed Usage R/U Rating
KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 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
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: 6Dict Compressing | Decompressing
Speed Usage R/U Rating | Speed Usage R/U Rating
KB/s % MIPS MIPS | KB/s % MIPS MIPS22: 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
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 3339RAM size: 32064 MB, # CPU hardware threads: 4
RAM usage: 882 MB, # Benchmark threads: 4Compressing | Decompressing
Dict Speed Usage R/U Rating | Speed Usage R/U Rating
KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 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: 8Compressing | Decompressing
Dict Speed Usage R/U Rating | Speed Usage R/U Rating
KiB/s % MIPS MIPS | KiB/s % MIPS MIPS22: 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
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
Суть скрипта проста:
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
Есть стереотип, что жители китая любят копировать готовое, а значит необходимо защищать от них контент, особенно медиа контент. Обычно это делается так:
Но в случае применения такого метода остаётся возможность получить доступ через 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/;
}

В результате, любой китаец сможет зайти на сайт но вместо качественных картинок он получит уменьшенные и обрезанные копии, не пригодные для коммерческого использования, а так же он получит такие же негодные картинки если откроет страницу сайта в кеше любого поисковика
24 мая 2018 27 ноября 2022 Всякое
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

28 января 2018 25 августа 2022 JavaScript | решать тесты
Какое расширение Angular можно использовать для создания "модных" виджетов checkbox?
Как сохранять список установленных bower пакетов?
Для начала нужно установить этот модуль
bower install --save angular-switcher
затем подключаем в список зависимостей приложения вот так:
// app.js
angular.module('app', ['ngResource', 'ngRoute', 'ui.bootstrap', 'ui.date', 'ckeditor', 'ngSanitize', 'switcher'])
используем вот так, заменяем
<input type="checkbox" ng-model="variant.correctly" />
на
<switcher ng-model="variant.correctly" true-label="верно" false-label="не верно"></switcher>
результат будет красив

23 января 2018 29 января 2018 Python Nginx Angular | решать тесты
Как сохранять список установленных bower пакетов?
Можно ли использовать декоратор для?
Чтобы сайт работал быстро, необходимо чтобы быстро загружалась статика сайта, для этого используется сжатие ccs и js файлов (Настройка расширения gulp-clean-css для сжати css), а так же кеширование на уровне веб-сервера nginx c помощью опции expires и gzip, например вот так:
location /static/ {
alias /home/python/static/;
expires 30d;
gzip on;
gzip_types text/css application/x-javascript application/javascript;
}
тут задаёт 30 дневный период хранения кеша статики и включается поточное сжатие статики в архив. Таким образом на продакшене образуется ситуация когда настроенный сайт очень быстро получает статику и при повторных запросах использует кеш на уровне веб-серера и веб-браузера. В случае когда присходит редкое обновление фронта требуется чтобы клиенты обновили кеши со статикой сайта. Принудить клиентов обновить кеш можно добавив номер коммита в урлы к статике. Я делаю это так: в моё конфиге я объявил переменную VERSION и инициализирую её при запуске Flask приложения следующим образом:
import os
import subprocess
import datetime
basedir = os.path.abspath(os.path.dirname(__file__))
class Config(object):
PROJECT_DIR = basedir
DEBUG = False
TESTING = False
CSRF_ENABLED = not True
ENABLED_PRODUCTMARKUP = True
VERSION = '{}.{}'.format(
str(subprocess.check_output(['git', 'describe', '--tags']),'utf-8').strip(),
int( subprocess.check_output(['git', 'rev-list', '--all', '--count']) )
)
И подключить это вот так:
{% extends "base.html" %}
{% block container %}
<span ng-include="'/static/js/vendor.min.js?v={ { config.VERSION } }'" ng-controller="ProductCtrl"></span>
{% endblock %}
это даст вот такую ссылку
<script src="/static/js/vendor.min.js?v=0.0-235-g1ced510.825" type="text/javascript"></script>
То-есть, после каждого обновления продакшена у клиентов будет обновляться статика, а значит и фронт
Но бывает необходимо чтобы статика закачивалась при каждом новом запросе, это необходимо бывает для верстальщикам. Для решения этой задачи можно подменить значение переменной VERSION текущим значением времени. Я делаю переопределив в DevelopmentConfig аттрибут VERSION следующим образом:
class classproperty(property):
def __get__(self, cls, owner):
return classmethod(self.fget).__get__(None, owner)()
class DevelopmentConfig(Config):
DEVELOPMENT = True
DEBUG = True
#~ SQLALCHEMY_ECHO = True
UPLOAD_FOLDER = 'media/'
@classproperty
def VERSION(self):
return str(datetime.datetime.now())
тут я создаю специальный класс, который декорирует функцию VERSION, которая возращает каждый раз новую дату и время и представляет эту функцию в виде статического аттрибута класса, таким образом в ссылках на статику при каждой генерации страницы будет новый, уникальный хешь и статика будет всегда самой свежей
19 января 2018 Python datetime RFC1123 Last-Modified
Использование даты в этом формате необходимо для обработки HTTP заголовка Last-Modified. Это когда сервер отдаёт дату изменения страницы в заголовке Last-Modified а затем клиет отправляе HEAD запрос с этим заголовком и датой и если страница не менялась, то ваш сервер отвечает 200 и отправляет пустое тело страницы. Это экономит и трафик и ресурсы процессора, а так же ускоряет повторную индексацию сайта и просто более технологично чем просто отдават страницы на каждый запрос.
Итак настроить дату обновления страницы в таком формате очень легко и делается это вот так:
class BaseClass(SQLAModel):
__abstract__ = True
...
updated_on = Column(DateTime, default=func.now(), onupdate=func.now(), doc=_('дата редактирования'))
...
def get_last_modified(self):
return self.updated_on.strftime("%a, %d %B %Y %H:%M:%S GMT")
И всё будет прекрасно работать до тех пор пока вам не потребуется локализовать даты (это когда месяцы на русском). Для этого вы сделаете вот так где в __init__.py
...
import locale
...
locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')
Возможно, раз вы используете babel, то у вас будет сменная локаль, это всё круто. Но этот системный вызов изменит поведение вашей get_last_modified и все ваши усилия по обработке Last-Modified приведут к тому, что появится вот такая ошибка
TypeError: http header must be encodable in latin1
По-этому, формировать дату в RFC формате формате необходимо правильным образом, а именно вот так
from time import mktime
from wsgiref.handlers import format_date_time
class BaseClass(SQLAModel):
__abstract__ = True
....
updated_on = Column(DateTime, default=func.now(), onupdate=func.now(), doc=_('дата редактирования'))
def get_last_modified(self):
stamp = mktime(self.updated_on.timetuple())
return format_date_time(stamp)
Вот так вот всё просто.