LINUX.ORG.RU

Сообщения micronekodesu

 

Ищу pipe, к которому можно будет подключаться и отключаться по необходимости

Форум — General

Не знаю как правильно называется то что я ищу и есть ли вообще такое, надеюсь поможете. В любом случае буду признателен за идеи!

Обычный пайп (foo | bar) связывает две команды очень "жестко" - если одна команда завершается, то завершится и другая, плюс есть размер буфера и если кто-то не успевает вычитывать\записывать туда данные то другая команда тормозится, ну и плюс я не могу подцепиться к какому-нибудь пайпу и получить актуальные данные когда захочу. В целом немного тут помогает mkfifo, но как минимум тут проблема как раз в том что это FIFO - нужно выгрести все что туда понаписали чтоб получить свежие данные, и опять таки упираемся в размер буфера.

Мне нужно что-то типа UDP, только на уровне файлов-потоков - один процесс пишет туда данные и не париться читает ли там что-то этот выхлоп или нет, с какой скоростью и так далее. Читающий поток тоже просто подключается и получает те данные, которые сейчас проходят через эту трубу, и потом отключается когда захочет, и пишущий поток ничего об этом не знает. Соответственно сам такой "udp-пайп" существует независимо от того, кто в него пишет и читает, и есть ли вообще такие процессы - если писать некому, то читателю просто будет отдаваться "ничего", некому читать - просто выкидываем те данные, что пришли на вход.

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

 ,

micronekodesu ()

ffmpeg - синхронизировать два входящих видеопотока

Форум — Multimedia

Привет! У меня есть два источника входящего видео и три источника входящего аудио. Надо взять все это добро и синхронно записать в один файл при помощи ffmpeg - видео объединяется в формате "картинка в картинке", аудио добавляется отдельными дорожками. Проблема в том что у источников у меня разный fps - /dev/video0 отдает 60 FPS , /dev/video1 - 30 FPS. Результирующий FPS ожидается 60. Так вот, если убрать 30-фпс'ный источник то проблем никаких. Если с обоих источников брать 30 и записывать результат в 30 - проблем никаких. Если добавить 30-fps-input после инпута на 60 и перед входящими аудиопотоками - аудио рассинхронивается с 60-фпсным потоком. Если добавить 30fps в самое начало или конец цепочки инпутов - оно получается несинхронным с другим видеопотоком.

Я перепробовал уже кучу вариантов async\vsync, экспериментировал с таймстампами, pts'ами и прочей этой лабудой. Это не дает вообще ничего. Самое классное что ffmpeg при запуске показывает что типа "есть поток 1, у него время запуска 10; а вот поток 2 - у него время запуска 15", и дальше у меня эти пять секунд расхождения стабильно присутствуют в видео. Советы типа "сделай оффсет" не подойдут - эта задержка каждый раз разная, и я понятия не имею чем она вызвана, потому что стоящий рядом mplayer\vlc открывают девайсы практически мгновенно, ffmpegу надо тупить по 10 секунд на каждый инпут. Какого хрена он сам не может засинхронить потоки, при том что знает какая разница между ними, я не могу понять.

В общем, прошу помощи, у меня сил воевать с этим больше нет, идеи кончились, я несколько дней уже туплю над этим и похоже сам не справлюсь. Ах, да, рядом стоящий OBS отлично справляется с задачей синхронизации инпутов вообще из коробки (но не делает некоторые важные штуки, которые может ffmpeg).

Текущий вариант запуска с логами (тут я подождал всего пять секунд, но не важно, оно и через полчаса абсолютно также работает):

$ ffmpeg -y -f v4l2 -thread_queue_size 512 -input_format yuyv422 -pix_fmt yuv420p -s 320x240 -framerate 30 -i /dev/video1 -f v4l2 -thread_queue_size 512 -input_format yuyv422 -pix_fmt yuv420p -s 1920x1080 -framerate 60 -i /dev/video0 -f pulse -guess_layout_max 0 -thread_queue_size 512 -channels 2 -i alsa_input.dev1.analog-stereo -f pulse -guess_layout_max 0 -thread_queue_size 512 -channels 2 -i alsa_input.dev2.analog-stereo -f pulse -guess_layout_max 0 -thread_queue_size 512 -channels 2 -i alsa_input.dev3.analog-stereo -filter_complex "[0:v]pad=height=ih+10:color=black[b]; [1:v][b]overlay=(main_w-overlay_w):main_h-overlay_h[o]" -c:a libfdk_aac -ac 2 -q:v 2 -c:v mjpeg -r 60 -muxdelay 0 -map [o] -map 2:a /tmp/output.mkv

ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9 (Debian 9.2.1-28)
  configuration: --disable-decoder=amrnb --disable-decoder=libopenjpeg --disable-gnutls --disable-libopencv --disable-podpages --disable-sndio --disable-stripping --enable-avfilter --enable-gcrypt --enable-gpl --enable-ladspa --enable-libaom --enable-libaribb24 --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libfdk-aac --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libilbc --enable-libjack --enable-libkvazaar --enable-liblensfun --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libwebp --enable-libzvbi --enable-lv2 --enable-nonfree --enable-openal --enable-opencl --enable-opengl --enable-openssl --enable-postproc --enable-pthreads --enable-shared --enable-version3 --incdir=/usr/include/x86_64-linux-gnu --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --toolchain=hardened --enable-frei0r --enable-chromaprint --enable-libx264 --enable-libiec61883 --enable-libdc1394 --enable-vaapi --enable-libmfx --enable-libvmaf --disable-altivec --shlibdir=/usr/lib/x86_64-linux-gnu
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, video4linux2,v4l2, from '/dev/video1':
  Duration: N/A, start: 21674.247421, bitrate: 36864 kb/s
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 320x240, 36864 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
Input #1, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 21682.714085, bitrate: 1990656 kb/s
    Stream #1:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1920x1080, 1990656 kb/s, 60 fps, 60 tbr, 1000k tbn, 1000k tbc
Input #2, pulse, from 'alsa_input.dev1.analog-stereo':
  Duration: N/A, start: 1584448360.733878, bitrate: 1536 kb/s
    Stream #2:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
Input #3, pulse, from 'alsa_input.dev2.analog-stereo':
  Duration: N/A, start: 1584448361.639887, bitrate: 1536 kb/s
    Stream #3:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
Input #4, pulse, from 'alsa_input.dev3.analog-stereo':
  Duration: N/A, start: 1584448361.588144, bitrate: 1536 kb/s
    Stream #4:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
Stream mapping:
  Stream #0:0 (rawvideo) -> pad (graph 0)
  Stream #1:0 (rawvideo) -> overlay:main (graph 0)
  overlay (graph 0) -> Stream #0:0 (mjpeg)
  Stream #2:0 -> #0:1 (pcm_s16le (native) -> aac (libfdk_aac))
Press [q] to stop, [?] for help
[swscaler @ 0x55d4e89e5b00] deprecated pixel format used, make sure you did set range correctly
Output #0, matroska, to '/tmp/output.mkv':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0: Video: mjpeg (MJPG / 0x47504A4D), yuvj420p(pc, progressive), 1920x1080, q=2-31, 200 kb/s, 60 fps, 1k tbn, 60 tbc (default)
    Metadata:
      encoder         : Lavc58.54.100 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
    Stream #0:1: Audio: aac (libfdk_aac) ([255][0][0][0] / 0x00FF), 48000 Hz, stereo, s16, 139 kb/s
    Metadata:
      encoder         : Lavc58.54.100 libfdk_aac
[libfdk_aac @ 0x55d4e89ab380] Queue input is backward in time
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 149, current: 2; changing to 149. This may result in incorrect timestamps in the output file.
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 149, current: 24; changing to 149. This may result in incorrect timestamps in the output file.
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 149, current: 45; changing to 149. This may result in incorrect timestamps in the output file.
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 149, current: 66; changing to 149. This may result in incorrect timestamps in the output file.
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 149, current: 88; changing to 149. This may result in incorrect timestamps in the output file.
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 149, current: 109; changing to 149. This may result in incorrect timestamps in the output file.
[libfdk_aac @ 0x55d4e89ab380] Queue input is backward in time
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 149, current: 130; changing to 149. This may result in incorrect timestamps in the output file.
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 152, current: 71; changing to 152. This may result in incorrect timestamps in the output file.
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 152, current: 92; changing to 152. This may result in incorrect timestamps in the output file.
[libfdk_aac @ 0x55d4e89ab380] Queue input is backward in time
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 152, current: 114; changing to 152. This may result in incorrect timestamps in the output file.
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 152, current: 135; changing to 152. This may result in incorrect timestamps in the output file.
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 152, current: 124; changing to 152. This may result in incorrect timestamps in the output file.
[matroska @ 0x55d4e89a57c0] Non-monotonous DTS in output stream 0:1; previous: 152, current: 145; changing to 152. This may result in incorrect timestamps in the output file.
[libfdk_aac @ 0x55d4e89ab380] Queue input is backward in time
frame=  249 fps= 43 q=2.0 Lsize=   23060kB time=00:00:05.85 bitrate=32286.8kbits/s speed=1.01x    
video:22942kB audio:105kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.059679%

UPD: Забыл сказать - я пробовал всякими способовами конвертить входящие 30 fps в 60 (через minterpolate например) - это получается какая-то бредовая жесть с дерганными кадрами (даже когда говоришь что нужно дублировать рядомстоящий такое ощущение что оно их дергает из всего потока). И все равно даже так синхронности не удалось добиться.

Очень надеюсь на вашу помощь! Заранее огромное спасибо!

 

micronekodesu ()

Аггрегация колонок с дальнейшим поиском в postgres

Форум — Web-development

Приветствую! Нужна помощь с sql-запросом, надеюсь не пройдете мимо.

Есть три таблицы (упрощенно, по структуре у меня вопросов нет, ну и приведенное тут не отражает реальную структуру, просто передает важные части):

create table users (
    id int,
    username text
);

create table messages (
    id int,
    message text
)

create table usermessages (
    user int references users(id),
    message int references messages(id)
);

Мне нужно из этого получить id из users и массив с messages вида {"id": messages.id, "message": messages.message}, по одной строке на пользователя. И затем из всего иэтого найти пользователей с определенными сообщениями, при этом получив список всех сообщений пользователя в аггрегации.

Выбираю все вот так:

select
    users.id,
    json_agg(json_build_object('id', messages.id, 'message', messages.message))
from
    users
left outer join usermessages on
    usermessages.user. = users.id
left outer join messages on
    messages.id = usermesages.message
group by
    users.id;

Результаты примерно такие:

| id | json_agg |
| 1  | [{"id": 1, "message": "foo"}, {"id": 2, "message": "bar"}] |
| 2  | [{"id": 3, "message": "qwerty"}, {"id": 4, "message": "ololo"}] |
| 3  | [{"id": 5, "message": "1234"}] |
| 4  | [{"id": 6, "message": "foo"}] |

Вот в данном примере мне нужно получить все те записи, где есть message=«foo», то есть в результате должно быть

| id | json_agg |
| 1  | [{"id": 1, "message": "foo"}, {"id": 2, "message": "bar"}] |
| 4  | [{"id": 6, "message": "foo"}] |

Не могу понять как искать по аггрегации (даже имя этой колонки в where не впихнуть - в «as» он не умеет, а на «json_agg» (который у меня в результатах выводится) говорит что такой колонки нет), а в случае фильтров я выбираю вообще все записи, просто там где условие не выполняется получаю пустой массив. Отдельно выбирать по message по приджоиненной таблице - тогда я не вижу других message'й user'а.

В общем мне нужно что-то, что сможет пройтись по элементам массива, но ничего подобного нагуглить не получилось.

А, да, все это живет в PostgreSQL 10 (в теги не пишу так как вроде вопрос не про сам постгрес).

Заранее спасибо!

 

micronekodesu ()

Пара вопросов по лицензии и авторскому праву

Форум — Talks

Привет! Нужна консультация от местных юристов.

Представим что я пишу, например, мессенджер. Основной фичей моего проекта является то что информация при общении между клиентом и сервером кодируется картинками с котиками. Я хочу чтоб мой проект был свободным, и выпускаю его под GPL (ну и соответственно все компоненты внутри тоже соответствуют требованиям GPL). У меня есть серверная часть (ну и свой сервер на котором это запущено), есть описание API, есть примеры клиентов, и я разрешаю все это использовать как угодно в соответствии с лицензией. Но я не хочу чтоб кто-то собрал свой клиент для моего сервиса и распространял в гуглоплее с рекламой внутри - либо за деньги, либо полностью бесплатно. К распространению в апсторе у меня никаких требований нет. Будет ли в таком случае считаться мой проект свободным и будет ли он соответствовать выбранной лицензии? По сути то серверная часть открыта и к ней никаких требований\ограничений, апи тоже, клиенты написаны только для примера и вообще их можно не считать частью проекта. Я не против того чтоб кто-то взял серверную часть и поднял у себя, но рекламы в клиенте в гуглоплее я хочу избежать в любом случае пока используется мой протокол "КотикиOverIP".

Тот же мессенджер, я пилю его на своем локалхосте никуда не выкладывая кучу времени в силу того что лень, не основное занятие и так далее. Пока я я пишу какая-нибудь компания независимо от меня выпускает проект с той же идеей с котиками, и делает его проприетарным. Если я правильно понимаю то когда я свой проект после этого захочу всем показать на меня наедут что я нарушаю лицензию на чужой продукт. У меня нет задачи бодаться с юристами той компании, я в целом согласен свой проект не доводить до продуктива, но хочу выложить код и линкать его в свое портфолио, пусть там даже в каждом файле и будет написано про то что это только пример, никак не связан с продуктом той компании и вообще они молодцы. Что мне сейчас (на этапе когда я только придумал проект и начинаю разработку) нужно сделать, чтоб в будущем не оказалось что я просто тратил время? Описать апи в бложике, написать PoC, запатентовать пересылку котиков или что? То есть я просто хочу как-то зафиксировать что придумал я это сейчас, других проприетарных проектов и патентов с этой идеей нет, ну и все такое.

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

 , , , ,

micronekodesu ()

Python, общее пространство имен для ипортируемых модулей

Форум — Development

Привет!

У меня питоновый проект с кучей модулей. Модули, по сути, не зависят друг от друга - могут импортироваться как угодно или вообще работать в режиме "скрипта". В целом вся работа внутри этих модулей крутится вокруг базы данных. Так вот, когда в каком-то скрипте я хочу использовать много этих модулей то сталкиваюсь с проблемой в виде долгой инициализации всего этого дела - каждый модуль коннектится к базе, вытаскивает всю нужную ему структуру таблиц и так далее. Все бы ничего, только пул коннектов к базе можно было бы и один использовать, а не свой для каждого модуля, таблицы между модулями тоже "пересекаются" и тянуть всю их метадату несколько раз мне совсем не хочется, ну и прочее. В итоге я придумал объявлять все это добро в модулях вот так:

if 'foo' in dir(sys.modules['__main__']):
    foo = sys.modules['__main__'].foo
else:
    foo = 'bar'
    sys.modules['__main__'].foo = foo

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

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

Спасибо за советы!

 ,

micronekodesu ()

Как не включать монитор при нажатии на кнопку клавиатуры

Форум — Desktop

Привет!

Гашу монитор через повешенный на хоткей скрипт с xset dpms force off внутри, и хотелось бы включать его обратно аналогичным способом - внутри скрипта есть еще некоторые действия, и все зависит от того в каком режиме находится монитор когда скрипт вызывается. Проблема в том что при нажатии хоткея выключенный монитор включается и только после этого скрипт запускается, соответственно скрипт видит монитор уже включенным и опять гасит.

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

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

 ,

micronekodesu ()

python - dict.get() для большого словаря сложной структуры

Форум — Development

Привет!

У меня есть словарь со сложной структурой с кучей значений, из которого мне нужно полуить определенное значение «из глубины» или вернуть дефолтное значение. Если бы словарь был простым, я воспользовался бы .get(), но лепить его для каждого вложенного элемента мне не хочется. Плюс внутри словарей попадаются списки, есть функции для которых мне нужно получить значение (и они возвращают тоже подобные сложные структуры), ну и так далее. То есть выглядит это примерно так (упрощенно):

print(foo['bar']['baz'][1]['qwerty'][2].get_data())

Хочу задействовать функцию, внутри которой был бы простой try\except-блок, ну вроде

def f1(data, default=''):
  try:
    return data
  except:
    return default

Но никак не могу нагуглить как можно передать значение из примера выше не вычисляя его при подстановке. Ну например нет у меня ключа 'baz' в словаре, которой лежит в ключе 'bar' словаря 'foo', и я ожидаемо получаю ошибку при вызове своего f1. Пытался передавать как функцию, пытался использовать LazyProxy из objproxies, но успеха не добился.

Как можно решить мою проблему не обвешивая код try\except'ами, 'key' in dict и len(list) > N?

Заранее благодарен за советы!

 ,

micronekodesu ()

Ищу тулзу для сбора информации о сервере

Форум — Admin

Привет!

Мне нужен какой-нибудь инструмент, который сможет пробежаться по серверам и собрать информацию о них, как то:

- Информация об ОС - дистрибутив, ядро, вот это все;

- Ресурсы сервера - что за CPU, сколько памяти, какие диски и на какие разделы какого объема они разбиты (PV\VG\LG в случае LVM);

- Сетевая информация - какие интерфейсы, какие на них айпшники (опционально - посмотреть netstat и понять с какими другими хостами в данный момент общается исследуемый хост);

- Информация об установленном софте - список установленных пакетов с версиями

- Специфическая информация об определенных пакетах - например в случае java-серверов (tomcat\jboss) хочу получать их класспасы, для postgres - увидеть какие базы развернуты, ну и так далее, то есть получить инфы больше чем просто версия пакета;

- Хорошо бы чтоб эта тулза могла «опрашивать» сетевые железки, гипервизоры и прочее;

- Иметь возможность делать выборки по собранной информации, типа «покажи мне список серверов, на которых стоит nginx»;

- Иметь возможность писать какие-то свои процедуры обнаружения компонентов без правок «ядра» - поддержка каких-нибудь скриптов или что-то в этом духе

Есть ли что-нибудь свободное на этот счет? В целом могу решить проблему навелосипедив что-нибудь используя оркестратор типа ansible\puppet, но хотелось бы сначала посмотреть готовые варианты.

Я знаю про, например, GLPI, но это не совсем то - знать что у меня просто есть N машин и их «серийники» мне мало.

Спасибо за советы!!

// Как такой класс ПО то называется?

 ,

micronekodesu ()

«Синхронная» работа с XMLHttpRequest в js

Форум — Web-development

Привет!

Столкнулся с необходимостью написания небольшой поделки, которая использует javascript. У меня есть список item'ов, мне нужно по каждому из них сделать запрос к внешнему сервису и результат показать табличкой типа «| item | результат запроса |». Запросы выполняю через XMLHttpRequest. Так вот при работе с ним синхронно все получается так, как я и хочу - я по каждому элементу списка создаю новую строку таблицы через js, в первую колонку пишу item, выполняю запрос, результат записываю во вторую колонку, и перехожу к следующему элементу. И все хорошо, только вот консоль мне постоянно ругается «э ты чо в 2К18 никто не пишет синхронно быстро переделывай посоны засмеют», если мне нужно больше чем одну таких таблички сделать то js (ну движок браузера или что там) видно не умеет нормально параллелить запросы и все это постоянно отваливается с чудесным «NetworkError: A network error occurred.», ну и вообще в интернетах все советуют забыть про синхронные запросы.

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

Заранее спасибо за советы!

 ,

micronekodesu ()

Докстанция для thinkpad

Форум — Linux-hardware

Привет! Вопрос по l460.

Как понять может ли он в докстанцию (не ту что по onelink+, а через разъем на днище)? У меня этот коннектор есть, значит док точно поддерживается, или может чего-то на плате не хватать? В спеках написано «Dock connector (integrated models only)» что за встроенные модели? В каком-нибудь там dmidecode ничего полезного не увидел.

 , ,

micronekodesu ()

Поиск решения для обеспечения отказоустойчивости демона с «уникальным» исходящим соединением

Форум — Admin

Добрый день!

У меня есть демон, который поднимает коннект к удаленному серверу и ждет от него инфы. На соседней тачке нужно поднять еще одну копию такого демона. Проблема в том, что удаленный хост может принимать только одно соединение (в соединении используется идентификатор, и вот для одного идентификатора можно поднимать только один коннект, поднимаем больше - все отваливаются; адрес хоста, порты и прочее - одинаковые). Какими средствами я могу реализовать такую схему? То есть чтоб если host1 или демон на нем упал, об этом узнавал host2 и поднимал демона у себя, ну и чтоб если host1 внезапно пришел в норму то либо демон на нем не запустился, либо остановился на host2? А, да, на самом деле таких демонов на хосте несколько (с разными идентификаторами), плюс не все запросы к удаленному хосту уникальны (у него есть контексты с максимум одним обращением с одним идентификатором, а есть те где ограничения на кол-во коннектов нет), то есть проверить только коннект на определенный адрес мне не достаточно.

В общем для входящего соединения можно было бы использовать балансировщики, virtualIP со всякими коросинками\пеймейкерами\кипалайвами, но что делать в случае исходящего соединения я придумать не могу.

В общем случае какой софт будет использоваться для построения такого «кластера» не не принципиально, но самым идеальным вариантом было бы накрутить это на основе supervisord. Если у демона нет коннекта к хосту - он падает, то есть можно смотреть только на сам процесс, не проверяя состояние его подключения к удаленному серверу. В код демона могут вноситься любые правки (осталось понять какие нужно).

Заранее спасибо за советы!

 , ,

micronekodesu ()

Однозначное переключение раскладки

Форум — Desktop

Добрый день!

Хочется сделать переключение раскладки однозначным - то есть чтоб us всегда включалась одной клавишей, ru - другой. Хочется чтоб поведение не зависело от DE (чтоб одинаково работало и в графической сессии, и в VT).

Варианты, предлагаемые через изменение keyboard-configuration меня не устраивает - там нет однозначных, только циклические. Плюс еще и те что через ctrl ломают ^C и прочие горячие клавиши.

Варианты с setxkbmap также ломают стандартные хоткеи, плюс к этому там очень мало вариантов - единственный нормальный это Caps\Shift+Caps, из-за которого теряется капслок. И опять же подгружается это все только в оболочке.

xmodmap вообще работает странно - ради интереса переназначил capslock как numlock (а при использовании shift он опять становится capslock'ом что мне весьма подходит), в своем DE настроил хоткеи переключения по numlock'e на us-раскладку и по printscreen на кириллицу - все работает нормально. Заблокировал десктоп (через xscreensaver) - снять блокировку уже не получается потому что переключение языков сломалось. После ребута нажатие на капслок то включает uppercase, то меняет раскладку, при этом по-разному работает в зависимости от текущей раскладки.

В общем, хотелось бы избежать все этой ерунды, сделать один раз и чтоб оно и дальше работало. Идеальный вариант для меня - CapsLock - us, PrintScreen - ru, shift+CapsLock = uppercase. Посоветуйте, пожалуйста, как я могу это сделать.

Кстати, варианты типа «ctrl+1 - en \ ctrl +2 - ru» тоже подходят, но я не смог найти ни одного даже близко похожего рецепта.

 , ,

micronekodesu ()

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