LINUX.ORG.RU

Сообщения Xintrea

 

Подключение монохромного RCA к VGA-монитору

Привет, народ!

Хочу подключить свою Микрошу к VGA-монитору. Фишка в том, что выход у Микроши низкочастотный и монохромный. То есть, не нужно разделять сигнал по цветовым каналам.

Покупал и возвращал 4 модели всяких преобразователей RCA to VGA, VIDEO to VGA и т.д. с RCA-шным входом и VGA-шным выходом. 3 из них вообще не выдавали изображение. Один преобразователь кое-какое изображение все-таки показал, но оно троилось по вертикали. Перепробовал все параметры в меню, добиться нормального изображения не смог. Тоже сдал.

Сейчас думаю, а если разделять сигнал не нужно, то можно ли просто этот сигнал навесить на один из цветовых пинов VGA-разъема и все? То есть два провода - сигнал и земля. Ну, может быть какое-то сопротивление добавить, видел что рекомендуют «нагрузить» RCA-вход сопротивлением 75 Ом. Но не говорят что имеют в виду - последовательно с сигналом поставить резистор, или сигнал завести на землю через резистор. Я в этих делах не соображаю.

Есть картинка: https://raw.github.com/xintrea/mytetra_syncro/master/base/170557880702eu9jpos...

1. Стоит ли попробовать такой конвертер «два проводка», или однозначно не будет работать?

2. А будет ли работать HD9800/GBS8200 типа такого: https://aliexpress.ru/item/1005006215879986.html?sku_id=12000036318620669&amp...
Или в нем то же самое что и в других конвертерах, и смысла его покупать нет?

 , , , , конвертор

Xintrea
()

Сделал научпоп видео «Как нарисовать звуком картинку? Дуэт гитары и осциллографа»

Пока вы доедали свое оливье, я пилил научпопное видео про визуализацию звука на осциллографе. Видео сделано в рамках акции #хочугитарупушного.

Вот само видео:
https://youtube.com/shorts/XdiwjLKXfT8?feature=share

Вот условия, если кто-то решит участвовать:
https://www.youtube.com/shorts/HlIEsIPFRhU

Не забудьте поставить царские лайки и поделитесь этим видосиком, как вы это обычно делаете. Очень бы не хотелось утонуть в тысячах заливов шортсов.

С новым годом!

(Linux тут при том, что весь монтаж сделан в Debian с помощью Blender, использовался Osci-render и Sunvox).



Перемещено hobbit из talks

 , , , ,

Xintrea
()

Python3 и ALSA = Python int too Large to fit into C Long

Привет, народ.

Пытаюсь запустить Open Source программу Nano-Basket (настройка MIDI контроллера).

Однако, на строке:

self.event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_SYSEX)

получаю вот такую ошибку:
Traceback (most recent call last):
  File "/home/daniel/configs/Nano-Basket/./nano_basket_main.py", line 33, in <module>
    Midi_Device = NanoKontrolAlsaMidiComm()
  File "/home/daniel/configs/Nano-Basket/nano_basket_backend.py", line 269, in __init__
    self.event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_SYSEX)
OverflowError: Python int too large to convert to C long

При добавлении отладочного вывода:
print( "alsaseq.SEQ_EVENT_SYSEX: "+str( int(alsaseq.SEQ_EVENT_SYSEX) ) )

Вижу следующее значение:

alsaseq.SEQ_EVENT_SYSEX: 315701287920557015231746469374140126848057806069433848520996442474077896118040280446827322192982778036935991159410458088858621034602855901831822090957249542454035237858266532406423746184667355646341406675495075296391155014596564577965062354643694753177171515765177344558231920888521336526729754327947612995730269459443629344404521191593403054625932096029258892212307592584049828939880259535763835214469305539836356735613249869911228799956675651622554103861445770814010219159244073507745648250000703350024591332758344364473173395846008868365451882145158578760695509550271688630463095098506898511291039425221333233770177236986045725391119505595248036570982953411623711955801825920921027729570846982511715262600778524621353825145851496489531652828983288054163031843801030412392727901417489077610047264934408166150555940608201872856407413511206173359083516070311558391028193972003488720183479039068178427806738027344778747038954436492511107004297589672250208699482162966403307666332800689253877198682790903233244322329549194860352982466072296480580866480878732354410609338974360551261336806132939982418266558599954613684533679936688065640543177104082203941847816956336839338

Значение несколько великовато как мне кажется.

Как можно исправить данную ошибку?

Страница с ошибкой тут: https://github.com/royvegard/Nano-Basket/issues/11

 , , ,

Xintrea
()

Можно ли управлять с MIDI-контроллера функциями на Yamaha-PSR Exxx?

Привет, народ.

В синтезаторе Yamaha PSR-E473 имеется настройка значений для различных функций инструмента.

Например, функция 009 - это функция M.Reverb - глубина реверберации для основного тембра, допустимые значения от 0 до 127.

Вопрос 1: если я куплю MIDI-контроллер типа LAudio EasyControl, возьму ноутбук, втыкну в него Yamaha и LAudio, то будет возможность настроить так, чтобы энкодеры на LAudio влияли на значения функций Yamaha? Как примерно это надо делать? Через DAW или есть более легковестные способы?

Вопрос 2: а можно ли сделать то же самое, но без ноутбука, через какой-нибудь MIDI конвертор/концентратор?

 , , , ,

Xintrea
()

А подскажите живой форум клавишников

Имею несколько вопросов по клавишам (имеются в виду музыкальные инструменты).

Нашел только два полуживых форума, с дикой кривой вёрсткой, на которых отвечают спустя пару-тройку дней:

http://sintezator-online.ru/forum/igraem-na-sintezatore

http://www.musicforums.ru/klavishnik/

А вы знаете нормальные русскоязычные форумы клавишников?

 , ,

Xintrea
()

Определить программу-лупер под Android по видео

Привет, народ. Нашел видео на котором явно на Андроиде используется лупер:

https://www.youtube.com/watch?v=pdBw5c0G5DM

Автор видео говорит, что приложение называется Looper.

Я не могу его найти в AppStore.

Можете определить по экрану что это за приложение? Как правильно называется? Cсылка в AppStore какая?

 , , ,

Xintrea
()

Правильная расшифровка int (*a)[2] = new int[n][2];

Имеется определение:

int (*a)[2] = new int[n][2];

И есть два варианта его понимания:

1. Создается переменная-указатель на 2 массива из значений типа int, что может рассматриваться и как указатель на массив из двух элементов типа int (так как общий размер массива одинаковый)

2. Запись int (*a)[2] представляет указатель на массив из двух элементов типа int.

Какой вариант однозначно правильный?

 , ,

Xintrea
()

Где прописывается запуск Qt Creator?

Сегодня менял HDD, переехал на новый, все скопировал через dd, но произошло странное...

В системе был вручную установлен Qt 5.12.6 из официального инсталлятора с qt.io. Все было установлено в каталог /opt/qt_5_12_6. Там же и эта версия и лежит, никуда ничего не перемещалось. В этом наборе имеется Qt Creator 4.10.2.

Так вот, еще сегодня утром, если в меню DE тыкнуть Старт - Разработка - Qt Creator, то запускался Qt Creator 4.10.2.

А после замены HDD, если тыкнуть в меню тот же пункт, то откроется Qt Creator 4.6.2. Это старый Creator, который был давно еще установлен из официального репозитария дистрибутива вместе с Qt 5.11.0. Эти версии тоже как были когда-то установлены, так и стоят, никто ничего на диске не трогал.

В пункте меню используется команда:

qtcreator %F

Вопрос: почему изменился запускаемый Qt Creator? Как вернуть запуск Qt Creator 4.10.2 из /opt/qt_5_12_6 ?

 , ,

Xintrea
()

Миграции в условиях паранойи - полная проверка структуры таблиц

Привет, народ.

Требуется тут сделать нестандарную самописную подсистему миграции в БД PostgreSQL 9.6 с учетом параноидальности начальства.

В стандартном виде миграция осуществляется по алгоритму: где-то хранится номер последнего обновления, и если есть новое обновление, то оно применяется поверх тех данных и структуры что есть в БД. При этом все система полагается на то, что если известна версия текущей структуры, то однозначно известна и сама структура, и эта структура правильная. И поэтому миграция применяется без реальной проверки структуры таблиц. И во всех разумных сценариях это работает.

Теперь рассмотрим параноидальный сценарий:

Предполагается, что в любой момент может появиться «тайный криворукий вредитель», который что-то сделает с таблицами в БД. С самими БД он ничего не сделает (не спрашивайте почему, никто этого не знает), а вот с таблицами - сделает. Поменяет тип столбца, переименует столбец или вовсе удалит, уберет индекс или еще что-то эдакое. Или вообще удалит таблицу.

Поэтому, в миграции надо автоматически проверять полную структуру таблиц, которая сформировалась в результате всех предыдущих миграций. И если структура неправильная, то удалять все данные, и прогонять все миграции заново с самой первой (да, вот такой странный подход).

Вопрос 1: как автоматически «вычислять» структуру таблиц, сформировавшуюся за все миграции, чтобы иметь возможность ее проверить?

Вопрос 2: как непосредственно проверить структуру таблиц на соответствие «вычисленной» на предыдущем шаге структуре?

Есть ли готовые SQL-команды или подходы для таких действий?

Используемые инструменты: C++, Qt. Никаких этих ваших яв, питонов, пхп и сторонних библиотек быть не должно.

PS: Я не прикалываюсь, я все это спрашиваю абсолютно серьезно.

 , , , ,

Xintrea
()

Свежая задачка с Yandex Backend Tour 2023 - «Опытная команда»

Эта тема создается для тех, кто завтра еще будет иметь возможность порешать задачки с Yandex Backend Tour 2023.

Условие задачи «Опытная команда» я не разглашаю (покажу ее после 23:59 19.11.2023), но хочу написать что имели в виду авторы. У меня плохо с пониманием других людей, а когда решение нужно делать на время, когнитивные функции напрочь отключаются.

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

----- 8< -----

В момент времени T=2 к команде присоединяется Victor. Опытность Ivan и Anton теперь равна 1, опытность Victor равна 0. Разность между суммарной опытностью оставшихся членов команды и опытностью самого опытного члена команды равна (1+0)−1=0. Добавляем к ответу Anton 0

----- 8< -----


То возможно вас наведет на правильную мысль следующее объяснение:


----- 8< -----

Ребята из Яндекса не написали в условии задачи, как определяется самый опытный. Зато написали в формате вывода: «Если членов команды с максимальной опытностью несколько, нужно вывести того, чье имя лексикографически минимально».

За этой фразой, видимо, скрывается мысль, что этот принцип используется не только при выводе. Видимо, подразумевалось, что данный принцип надо использовать и в других местах программы. (Для меня это не очевидно).

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

Другими словами, нужно учитывать что «лексикографический выбор» надо делать не только при выборе, какого кандидата показать в результирующей строке. Но и это же нужно делать и в основном коде, когда считается опытность команды. И значение этого человека не включать в суммарный опыт команды.

----- 8< -----


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

PS: Задача даже не на алгоритмы, а просто на корректное написание простого кода, который парсит входные данные по некоторым правилам.

PPS: И да, я не прошел.

 ,

Xintrea
()

Как настроить в VSCode нестандартный запуск Python-скрипта? А чтобы дебаг работал?

Есть специальная команда для запуска python-скрипта:

cat file.txt | python3 sample.py

1. Как сделать так, чтобы она запускалась по Ctrl+F5 вместо стандартного запуска скрипта?

2. А как сделать, чтобы и дебаг запускался с такой же командой?

VSCode v. 1.81.1, плагин - стандартный Python IntelliSence (Pylance) от Microsoft v.2023.14.0.

 , , , ,

Xintrea
()

Как в Python написать цикл с постусловием?

Классический цикл for(инит; действие при каждой итерации; условие продолжения) в C/C++ - это, по-сути цикл с пост-условием.

А как написать for-цикл с пост-условием в Python? Если пользоваться range(), то range() «запекает» перебираемые значения при старте цикла.

А нужно, чтобы цикл бежал не до фиксированного значения, а до того, пока будет выполняться условие. Как это сделать?

Только через while-цикл и никак иначе?

Я пробовал через for и генератор с условием, наложенным на range, но не получается:

for i in ( x for x in range(0, len(s)) if x<(len(s)-maxLen)) ):
Так тоже в процессе работы цикла количество итераций не уменьшается.

 , ,

Xintrea
()

Как в Google/Yandex найти страницу, на которой упоминается заданная ссылка?

Google все время пытается проиндексировать страницы, которых нет на сайте webhamster.ru ужо несколько лет как.

Вот примеры таких ссылок:

http://webhamster.ru/mytetrashare/index/mtb131/1490546683q10675zpp6
https://webhamster.ru/mytetrashare/index/mtb176/14982150565oqhyblndu
https://webhamster.ru/mytetrashare/index/mtb189/1490267599a1aqopr8ha

То есть, где-то, или на самом webhamster.ru или на каких-то других сайтах эти ссылки существуют.

Вопрос: какой запрос надо дать в Google или в Yandex чтобы найти в Интернете страницы, которые содержат вышеперечисленные линки?

 , , ,

Xintrea
()

Миграции: как в самой таблице хранить номер версии структуры таблицы?

Для создания наколеночной системы миграции таблиц в PostgreSQL нужно мне где-то хранить номер версии структуры таблицы.

Существует ли способ где-то сохранить номер версии структуры таблицы в самой таблице?

То есть, не создавать в БД специальную таблицу, в которой будут храниться имена таблиц и их текущие версии структуры, а хранить номер версии в какой-то сопровождающей таблицу информации?

 , , , ,

Xintrea
()

Что такое PulseAudio? Как оно работает?

Имеется следующая цитата:

PulseAudio - звуковой сервер в виде демона, запускаемый, что интересно, от имени обычного пользователя. Создает слой абстракции звуковых потоков для возможности различной коммутации, принимает по собственному API звуковой поток от приложений и воспроизводит его через ALSA. Так же PulseAudio создает для ALSA специальный порт, через которые может получать данные, отправляемые приложениями в сам ALSA, и такое поведение настраивается по-дефолту при установке PulseAudio. Считается надстройкой над ALSA, так как без ALSA его использование бессмысленно (будет работать только комутация, а звука не будет).


Имеются ли в ней грубые фактические ошибки, вводящие читателя в заблуждение? Сам пользуюсь PulseAudio, и конфигурю его по необходимости «чтоб работало», но понимание внутреннего устройства ограничено общими фразами из околозвуковых статей.

 , , , ,

Xintrea
()

Все уже посмотрели новость как НИИЭТ перемаркировывает китайские MOSFET на российские GaN?

Максим Горшенин снова бомбанул. После разборок с чипом Миландра, который заменяет три кусочка проволоки в мониторах LightCom, ему подсказали подумать вот о чем... Как так получается, что российская автомобильная зарядка с разработанными в России GaN-транзисторами от Воронежского института электронной техники имеет абсолютно ту же плату, что и некоторые китайские зарядки с классическими MOSFET-тами? Почему совершенно не меняется схемотехника? Не кажется ли это странным?

По счастливой случайности у Горшенина на руках оказалось две зарядки, которые ему лично передали представители НИИЭТ, на которых имеются транзисторы с логотипом НИИЭТ. Об этих зарядках Горшенин даже снимал ролик. Каково же было его удивление, когда внимательнее посмотрев под лупой на эти транзисторы он обнаружил, что, верхняя поверхность корпуса транзистора полностью снята лазером, и поверх, этим же лазером, сделана маркировка НИИЭТ!

Не поверив собственным глазам, Горшенин позвонил в НИИЭТ и поинтересовался, а как так получилось, что на упаковке написано что это зарядка с GaN-транзисторами, а оказалось, что это простая зарядка с китайскими MOSFET-транзисторами? Представители НИИЭТ в телефонном разговоре сообщили, что это все китайцы виноваты, и вложили в коробочки не те зарядные устройства. На вопрос почему транзисторы пиленные, в НИИЭТ ответить не смогли. Но очень хотели, чтобы Максим не публиковал эту информацию, подумал, поговорил с гендиректором института и не делал поспешных выводов.


Веселая новость с фотографиями:
https://webhamster.ru/site/page/index/main/news/720

Видео 1 - Прекрасные зарядки с GaN транзисторами:
https://www.youtube.com/watch?v=ilNeKlgBpwU

Видео 2 - Походу, это развод покупателей:
https://www.youtube.com/watch?v=E53Mo_rHDqs

 , , перелицовка, ,

Xintrea
()

Как закрыть тред при выходе из Tkinter-приложения?

Имеется Tkinter-приложение, в котором есть:

  • Основное окно
  • Дополнительное окно, которое запускается в отдельном треде. Оно содержит кнопку Panic.

Задача проста: при завершении работы программы любым способом (например, по сочетанию Alt+F4), нужно корректно завершить программу.

Я сделал минимальный пример. При завершении его работы появляется ошибка:

Запускается тред для окна с кнопкой остановки
Внутри треда с окном-кнопкой Panic
Устанавливается флаг на остановку треда с кнопкой Panic
Завершен тред _threadCodeSmallWindow
Тред с кнопкой Panic полностью завершен

Tcl_AsyncDelete: async handler deleted by the wrong thread
Аварийный останов

То есть, нужно, чтобы этой ошибки не возникало.

Если в примере закомментировать последнюю команду main.destroySmallWindow(), то ошибки не будет. Но и программа не будет завершаться по Alt+F4, потому что не завершен тред с дополнительным окном.

Я пробовал перед вызовом rootWindow.mainloop() добавить команду:
rootWindow.protocol("WM_DELETE_WINDOW", onDeleteWindow)

И функцию при закрытии писал такую:
def onDeleteWindow():
    main.destroySmallWindow() # Завершение треда
    rootWindow.destroy() # Закрытие основного окна

Но и тогда все равно ошибка сохраняется.

Вопрос: как корректно завершить программу?

Код примера:
#!/usr/bin/python3

import tkinter as tk
import time
from threading import Thread, Event

class MainFrame(tk.Frame):

    def __init__(self, parent):

        self.stopThreadFlag = Event()
        self.smallWindow = None
        self.threadSmallWindow = None

        # Инициализация базового класса рамки
        super(MainFrame, self).__init__(parent)

        # Основная рамка
        frame = tk.Frame(self, relief=tk.RAISED, borderwidth=1)
        frame.pack(fill=tk.BOTH, expand=True)

        # Надпись
        label = tk.Label(frame, text="Содержимое окна")
        label.pack(anchor=tk.W)

        # Создается окошко-кнопка с кнопкой Panic в отдельном потоке
        self._createSmallWindow()


    # Создание окошка с кнопкой Panic в отдельном потоке
    def _createSmallWindow(self):
        print("Запускается тред для окна с кнопкой остановки")
        self.stopThreadFlag.clear() # Очищается флаг прекращения работы потока
        self.threadSmallWindow = Thread(target = self._threadCodeSmallWindow)
        self.threadSmallWindow.start()


    # Код, выполняемый внутри треда
    def _threadCodeSmallWindow(self):
        print("Внутри треда с окном-кнопкой Panic")

        # Создается окошко с кнопкой Panic
        self.smallWindow= tk.Tk() # = tk.Toplevel(Parameter().rootWindow)
        self.smallWindow.resizable(0, 0) # Запрещает изменение размера
        self.smallWindow.overrideredirect(1) # Отключается все оформление окона

        smallWindowFrame = tk.Frame( self.smallWindow )
        smallWindowFrame.pack(fill="both", expand=True)

        button=tk.Button(smallWindowFrame, text="Panic", borderwidth=0, relief=tk.FLAT)
        button.pack(fill=tk.BOTH, anchor="center", expand=True)

        self.smallWindow.update() # Прорисовка окна с кнопкой Panic

        # Вместо mainloop() используется цикл, который завершается при установке флага
        while not self.stopThreadFlag.is_set():
            if self.smallWindow != None:

                # ... Всякие действия ...

                time.sleep(0.5) # Разгрузка работы, чтобы не выжирался весь процессор

        if self.smallWindow != None:
            self.smallWindow.destroy()

        print("Завершен тред _threadCodeSmallWindow")


    # Уничтожение окна и треда с кнопкой Panic
    def destroySmallWindow(self):
        if self.smallWindow != None:
            print("Устанавливается флаг на остановку треда с кнопкой Panic")
            self.stopThreadFlag.set()

            self.threadSmallWindow.join() # Ожидание завершения треда с кнопкой Panic
            print("Тред с кнопкой Panic полностью завершен")


if __name__ == "__main__":

    # Запуск Tk-подсистемы графических виджетов и создание основного окна
    rootWindow = tk.Tk()
    rootWindow.geometry("320x200+0+0")

    # Создание основной рамки с интерфейсом приложения
    main = MainFrame( rootWindow )
    main.pack(fill="both", expand=True)

    # Основной цикл GUI-интерфейса
    rootWindow.mainloop()

    # Вызов завершения треда с окошком Panic
    # Без этого вызова программа не завершится
    main.destroySmallWindow()

 , , ,

Xintrea
()

У кого-нибудь открывается в LibreOffice CSV файл ОКАТО Росстата?

Файл с классификтором ОКАТО:

https://rosstat.gov.ru/opendata/7708234640-7708234640-okato/data-20230803-str...

Не открывается в LibreOffice 7.0.4.2 - программа зависает.

В MS Office все в порядке.

У кого-то LO открывает этот файл?


Перемещено hobbit из general

 

Xintrea
()

Тормозит открытие окна файлового диалога в KDE/LXDE? Я знаю решение.

Всего год мучений, и я разобраться как побороть застаревший баг Qt-шного окна открытия файла.

Баг и решение написаны здесь: Исправление ошибки в KDE/LXDE если долго открывается файловый диалог

Пользуйтесь, если у кого похожая проблема.

 , , диалог,

Xintrea
()

Эксперимент со звуком в Audacity: синус плюс синус = пшпшпш

Открываю Audacity, создаю две моно-дорожки с синусоидальным сигналом на частотах 261 Гц (До) и 440 Гц (Ля).

Создать - Тон
Волноформа: Синусоидальная
Частота: 261 (или 440)
Амплитуда: 0,5
Длительность: 1 сек
По отдельности дорожки звучат красивым мягким синусом.

Но вместе получается жуткий пердеж. Ну не должно такого быть. Ну как так то? Что мешает двум синусам звучать вместе красиво? Вроде как это большая септима, и по классификации должна быть несовершенным, но все-таки консонансом. А тут даже не консонанс и не диссонанс, а тупо пердеж.

На ЦАП звуковой карточки и частоту дискретизации тоже вроде не погрешишь, она в 100 раз выше, а по теореме Котельникова нам достаточно было бы меньше 1000 Гц чтоб услышать все что нам нужно.

Почему такой эффект?

 волна, , ,

Xintrea
()

RSS подписка на новые темы