29 апреля 2022 Python


Задача реализовать прозрачное связывание "союзами" пользователей сайта. Такое необходимо когда пользователь А запросил союз у пользователя Б и тот одобрил этот союз, тогда у обоих пользователей должен обновиться список союзников и табличная связь будет выглядеть следующим образом

таблица пользователей таблице связей
1 осёл
2 козёл
3 мишка
4 пятачёк
5 винипух
1 2
1 3
4 5

 

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

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

class Union(db.Model):
    __tablename__ = "user_unions"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    user1_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
    user2_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)

    created = db.Column(db.DateTime(timezone=True), server_default=func.now())
    updated = db.Column(db.DateTime(timezone=True), onupdate=func.now())

    enable = db.Column(db.Boolean, default=False, nullable=False)

    def __repr__(self):
        if self.enable:
            return "союз с {} заключён".format(self.user2)
        return "союз с {} не подписан".format(self.user2)


class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40), unique=False, nullable=False)
    email = db.Column(EmailType, unique=False)

    def add_user(self, user):
        """ добавление союза с user"""
        union = Union(user1=self, user2=user)
        db.session.add(union)
        db.session.flush()

Всё будет прекрасно до тех пор пока не потребуется у объектов User обратиться к списку союзных пользователей. Дело в том, что метол обращения к списку союзников выглядит по разному для разныз пользователей. Если для того чтобы узнать список союзников осла неоходимо выбрать все вторые колонки в строка в которых в первой колонке номер строки осла, а чтобы выбрать союзников козла, необходимо выбрать все первые колонки в строках где вторая колонка равна номеру строки козла. Таки образом получается метод выбора союзников осла и козла будет разный, а это не красиво.

Но всё таки можно реализовать универсальный метод поиск союзников для каждого пользователя и в SQL виде он будет выглядеть вот так

select * 
  from users 
  where id in (
    select user2_id id  
      from user_unions 
      where user1_id = 1 
    union 
      select user1_id id 
        from user_unions 
          where user2_id =  1
    ) 

тут производится выборка id союзников в ассоциативной таблице для обоих типов запросов, затем результаты объединяются и используются во вложенном запросе при обращении к таблице пользователей.

Sqlalchemy позволяет реализовать и такой достаточно сложный запрос с помощью объектного ORM и тогда метод выбора союзников пользователя будет выглядет следующим образом

class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40), unique=False, nullable=False)
    email = db.Column(EmailType, unique=False)

    created = db.Column(db.DateTime(timezone=True), server_default=func.now())


    def get_all_union_users(self):
        """выборка запросов на союз"""
        q1 = db.session.query(Union.user2_id.label("id"))
        q1 = q1.filter(Union.user1==self)
        q2 = db.session.query(Union.user1_id.label("id"))
        q2 = q1.filter(Union.user2==self)
        return User.query.filter(
            User.id.in_(q1.union(q2))
        )

    def get_union_users(self):
        """выборка подтверждённых союзников"""
        q1 = db.session.query(Union.user2_id.label("id"))
        q1 = q1.filter(Union.user1==self, Union.enable==True)
        q2 = db.session.query(Union.user1_id.label("id"))
        q1 = q2.filter(Union.user2==self, Union.enable==True)
        return User.query.filter(
            User.id.in_(q1.union(q2))
        )

Проверяем результат

# проверяем список союзников у каждого пользователя стандартным способом
for u in User.query.all():u, "союзники", u.unions.all()
... 
(Пользователь: осёл , 'союзники', [союз с Пользователь: козёл  заключён, союз с Пользователь: мишка  заключён])
(Пользователь: козёл , 'союзники', [])
(Пользователь: мишка , 'союзники', [])
(Пользователь: пятачёк , 'союзники', [союз с Пользователь: винипух  заключён])
(Пользователь: винипух , 'союзники', [])


# проверяем список союзников у каждого пользователя проверяем через универсальный метод
>>> for u in User.query.all():u, "союзники", u.get_union_users().all()
... 
(Пользователь: осёл , 'союзники', [Пользователь: козёл , Пользователь: мишка ])
(Пользователь: козёл , 'союзники', [Пользователь: осёл ])
(Пользователь: мишка , 'союзники', [Пользователь: осёл ])
(Пользователь: пятачёк , 'союзники', [Пользователь: винипух ])
(Пользователь: винипух , 'союзники', [Пользователь: пятачёк ])

 


27 апреля 2022 13 октября 2022 Всякое


По службе пришлось столкнуться с сервисом продажи доменов hugedomains.com, интересующий нас домен определялся с такими данными

Domain Name: CENTERSVET.COM
   Registry Domain ID: 2524336753_DOMAIN_COM-VRSN
   Registrar WHOIS Server: whois.namebright.com
   Registrar URL: http://www.NameBright.com
   Updated Date: 2021-08-26T18:12:19Z
   Creation Date: 2020-05-10T18:15:17Z
   Registry Expiry Date: 2023-05-10T18:15:17Z
   Registrar: TurnCommerce, Inc. DBA NameBright.com
   Registrar IANA ID: 1441
   Registrar Abuse Contact Email: support@namebright.com
   Registrar Abuse Contact Phone: 17204960020
   Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
   Name Server: NSG1.NAMEBRIGHTDNS.COM
   Name Server: NSG2.NAMEBRIGHTDNS.COM
   DNSSEC: unsigned
   URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/

и при переходе на домен перекидывало на предложение о покупке домена за 3695 долларов (на момент покупки это 276 430 рублей).

Покупка доменов на www.hugedomains.com

Поиск отзывов на этот сервис в рунете подтвредил сомнения о том, что это сайт мошеннический, но я обратил внимание на то, что в рунете не было ни одного упоминания, что ктото заплатил за домен и не получил ни домена ни денег. Поиск отзывов на американских форумах подтвердил мысль, о том, что люди очень недовольны что их забытые домены выкупают за $5, а затем предлагают купить им же за $1500, всех смушают цены, но очевидно, что некоторым приходилось выкупать свои домены.

Так же из этих форумов стало известно, что hugedomains.com находится на одном гео.адресе с namebright.com, а hugedomains.com это сервис аренды доменов. То-есть там выстроена схема в которой пользователи покупают и используют домен на namebright.com, а когда домен освобождается (например, в случае когда хозяин забыл оплатить), домен передаются в hugedomains.com, а там работает автоматизированная система продажи домена. У домена настраивается редирект на hugedomains.com, там открывается предложение о покупке и форма ввода данных, включая номер карты и cvv код

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

После оплаты счёта, мы в своём кабинете на namebright.com получили полный контроль над доменом, заменили DNS сервера и домен работает. Остаётся лишь перенести домен к нашим хостерам


18 апреля 2022 27 апреля 2022 Всякое


У компании Nic.ru есть специальная страничка где можно прочитать отзывы о работе комании, я сегодня оставил там свой отзыв и на всякий случай продублировал его сюда

оставил такой отзыв на сайте https://www.nic.ru/info/otzyvy/

Ужасный и отвратительный сервис которым приходится пользоваться уже больше 10 лет
и каждый раз когда приходится сделать какую либо манипуляцию непроизвольно испытывают целую гамму негативных эмоций от гнева до презрительного отвращения

с каждым случаем использования стоимость продления увеличивается
и домены купленные за 150 рублей сейчас можно продлить минимум за 1600 рублей

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

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

причём нужно понимать, что стоимость услуги совершенно не соответствует реальности и является завышенной как минимум на 1000% процентов, у других хостеров регистрация и продление доменов стоят 200-250 рублей в год, и там не навязываются ни какие платные опции в виде скрытого whois или антивируса для домена

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

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

в качестве небольшой иллюстрации работы сервиса опишу как я переводил домены с nic.ru к другому хостеру

по ссылке Услуги >     Мои домены >         Перенос доменов
открывается форма на которой можно заказать перенос доменов
необходимо ввести адреса доменов и заказать перенос

и вот у меня в первый раз страница зависла и висели 15 минут, затем пришлось перезагрузить страницу и повторить ввод данных

после повторного  ввода списка доменов, появилась ошибка что они не могут перевести 3 из 2 доменов, да именно 3 из 2

пришлось ещё обновить страницу и в третий раз вести список доменов и заказать перенос, с третьего раза форма обработала и появилось сообщение что ушло письмо с инструкцией

письмо пришло через 3 дня со следующим текстом

An English version of this message is contained below.
 

Уважаемый клиент!
 
Истек срок подтверждения администратором согласия на генерацию кодов переноса к другому регистратору. Список доменов, для которых отменен заказ на получение кодов:
 

пришлось в 4 раз вводить список доменов для переноса, опять вылазила ошибка о невозможности переноса 2 доменов из 2, но после обновления сработало

пришла СМС с кодом и через 30 минут пришло письмо с инструкцией

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

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

Услуги >     Мои домены >         Перенос доменов

опять ошибка с вводом списка доменов, опять обновление и повторный ввод и сообщение что ушло письмо с инструкцией и СМС

СМС пришла, а письмо не пришло и видимо не придётся в течении трёх дней, я попробовал сменить почтовый ящик но система не даёт создать заказ переноса так как уже есть созданный ранее заказ

получается, необходимо ждать три дня, затем я получу уведомление что заказ отменён и повторить процедуру


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

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


я считаю, что nic.ru и reg.ru это монопольные и мощенические конторы, которые взвинтили цены на доменные имена более чем на 1000%, которые ежегодно выкачивают миллиарды денег из госучреждений и частных компаний

 

орфографию, подчёркивающие эмоции от использования сервиса, сохраняю


18 апреля 2022 27 апреля 2022 Всякое


Идея за 300

Евгений Касперксий приходит в nic.ru и reg.ru и предлагает им дополнительную услугую добавления домена в белый список антивируса Касперского, например по 100 рублей за домен.

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

А мошенники из nic.ru и reg.ru заключают договор  с Касперским и добавляют на своих сервисах обязательную и не отключаемую платную (по 1000р) услугу поддержки Антивируса Касперский всем своим клиентам.

После чего стоимость продления услуги возрастает с 1600 рублей, до 2600 рублей


03 марта 2022 Linux mpd songs amq


После блокировки западных стриминговых платных платформ можно оживить устройство Songs AMQ с помощью MPD

На любом хостинг-сервере ставим mpd

apt install mpd

закачиваем музыку в /var/lib/mpd/music

меняем на неё права

chown -R mpd:nogroup /var/lib/mpd/music/

в файле конфигурации /etc/mpd.conf можно оставить только такие настройки

playlist_directory        "/var/lib/mpd/playlists"
db_file            "/var/lib/mpd/tag_cache"
log_file            "/var/log/mpd/mpd.log"
pid_file            "/run/mpd/pid"
state_file            "/var/lib/mpd/state"
sticker_file                   "/var/lib/mpd/sticker.sql"
user                "mpd"
bind_to_address        "0.0.0.0" # слушаем все вшешние адрес
port                "6600"
password                        "Z2022.02.24@read,add,control,admin"
input {
        plugin "curl"
}
audio_output {    
    type        "httpd"    
    encoder     "lame"          # кодек lame необходим для работы с Songs AMQ
    port        "8000"    
    bitrate     "256"             # повышенный битрейт
    format      "44100:16:1"    
}
filesystem_charset        "UTF-8"

перезапускаем mpd

service mpd restart

Полученную ссылку в виде http://хостинг-сервер:8000 прописываем в songsApp

Всё работает. Управлять можно через приложение GMPC, так же есть приложения управления mpd для Android. Для управления используем адрес [хостинг-сервер], порт 6600, пароль из опции password


20 января 2022 28 декабря 2022 Hardware


Индикаторы самодиагностики на материнской плате 820-2128-B

Светодиод Название Цвет Значение Необходимо нажать на DIAG_LED Указание на
Led 1 Sleep Красный Выключен; горит, когда компьютер находится в спящем режиме Да Спяший режим
Led 2 Standby (Trickle Pwr) Жёлтый вкл Да Работа от резервного источника питания * **
Led 3 CPU B Error Красный выкл Нет Процессор Б останавливается на IERR (ошибка инструкции)
Led 4 CPU A Error Красный   Нет Процессор A останавливается на IERR (ошибка инструкции)
Led 5 CPU B OT Красный выкл Нет Перегрев процессор Б
Led 6 CPU A OT Красный выкл Нет Перегрев процессор А
Led 7 GPU Present Зелёный вкл Да EFI настроил видеокарту
Led 8 Power Good Зелёный вкл Да Все силовые шины работают
Led 9 EFI Done Зелёный вкл Да EFI загружается

Это резервная мощность. Он не позволяет внутренней резервной батарее (или «аккумулятору PRAM») работать, если только питание переменного тока не отключается полностью, например, в случае короткого сбоя питания или отключения компьютера от сети для обслуживания или перемещения.          

Указывает, что основная логическая плата обнаружила скачкообразное напряжение от источника питания.
Этот индикатор загорается при подключении iMac к работающему источнику питания переменного тока.
Светодиод остаётся включенным, пока компьютер включен или находится в спящем режиме.


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