Три монитора без иксов
Можно ли использовать 3 монитора в ядерной консоли для разных tty? Сейчас у меня на все три выводится одно и то же (причём ширина соответствует самому узкому из мониторов).
Можно ли использовать 3 монитора в ядерной консоли для разных tty? Сейчас у меня на все три выводится одно и то же (причём ширина соответствует самому узкому из мониторов).
Исходники хостятся на собственном сервере Gitea: https://git.cavemanon.xyz/Cavemanon
Визуальные романы. 3 коротких, 2 подлиннее. Скрипты — под лицензией Affero 3, картинки и музыка — Affero, CC-BY-SA, CC0. Есть и бинарные сборки:
Snoot Game https://snootgame.xyz
Скандально известная пародия на игру Goodbye Volcano High, которая пыталась выехать на LGBTQ+ повестке и антропоморфных динозаврах. Коллективное творчество с 4chan.
Выпускной класс, безликий (в буквальном смысле) новенький Анон И. Мус, небинарная гитаристка-скандалистка. Можно убедить её сменить ориентацию на гетеросексуальную. Или довести до расстрела школы. Или оставить всё как есть.
Приятная гитарная музыка, похожая на Wallflowers и Dire Straits.
I Wani Hug that Gator! https://cavemanon.itch.io/i-wani-hug-that-gator-demo
Спинофф от тех же авторов со снижением накала драмы. Безликий новенький Инко Г. Нито и мрачная художница в инвалидном кресле. Игра в процессе написания.
Кстати, это не аллигатор, а барионикс.
A Star in Her Eyes https://cavemanon.itch.io/a-star-in-her-eyes
She Likes You Alotl https://cavemanon.itch.io/she-likes-you-alotl
She’s a bit sluggish https://cavemanon.itch.io/shes-a-bit-sluggish
Предельно простые симуляторы свиданий с персонажами из замороженной игры Exit 665.
На новой квартире примерно раз в пару недель мигает электричество. Надоело каждый раз восстанавливать несохранённое. Можете посоветовать дешёвый бесперебойник, обеспечивающий 500 Вт?
Первые попавшиеся на Яндекс-маркете — ExeGate и CBR. Про них беглый поиск ничего не нашёл — ни хорошего, ни плохого. Дальше — PowerCom, ими, вроде, кто-то успешно пользуется некоторыми моделями. Можете про них что-то сказать? Или есть советы получше?
Уже несколько часов примерно каждый десятый клик по ссылке на ЛОРе выдаёт ошибку в Фаерфоксе:
Время ожидания соединения истекло
При соединении с www.linux.org.ru произошла ошибка. PR_IO_TIMEOUT_ERROR
Код ошибки: PR_IO_TIMEOUT_ERROR
Что-то с сервером? Или у меня проблемы?
Я настроил FoxyProxy в фаерфоксе направлять запросы к нескольким сайтам по шаблонам через TOR-прокси, включая запросы DNS. TOR я включал только когда заходил на эти сайты.
Но время от времени при попытке войти на некоторые сайты, включая teams.microsoft.com и reddit.com, получаю ошибку «Прокси-сервер отказывается принимать соединения». Если включаю прокси или отключаю FoxyProxy — всё работает. В чём проблема? Почему FoxyProxy обрабатывает обращения не из белого списка?
Oтвет: Судя по журналу FoxyProxy, шаблон t.co обрабатывается как *t.co* и применяется к microsoft.com и reddit.com. Шаблон *://t.co/ таких проблем не вызывает.
Gentoo. Несколько недель аптайма, неоднократно апдейтился, не перезагружаясь. Помимо прочего, пересобирал Firefox с поддержкой pipewire вместо apulse, перезапускал, работало. Медиаплееры тоже апдейтил и перезапускал, работали.
На сутки выключил машину, сейчас включил, и звук нигде не работает. Куда копать?
Результат alsa-info.sh: https://pastebin.com/PAMmUP9v (Вкратце: чип на материнской плате и HDMI, колонки на первом.)
Фаерфокс при проигрывании звука пишет:
[Child 6948, MediaDecoderStateMachine #4] WARNING: 7f9929fbf280 Could not set cubeb stream name.: file /var/tmp/portage/www-client/firefox-115.5.0/work/firefox-115.5.0/dom/media/AudioStream.cpp:321
mplayer:
couldn't open play stream: Device or resource busy
ao2: can't open sndio
Дополнение: Пока выяснил, что при загрузке запустились 2 процесса pipewire, и было видно устройство PulseAudio. После того, как я убил pipewire, плееры смогли работать через ALSA. Звука в Фаерфоксе пока нет, так как ему нужен PulseAudio.
Дополнение 2: Каким-то образом я пропустил стадию «пересобрать мир с USE=‘pulseaudio’». После её выполнения:
$ wpctl status
PipeWire 'pipewire-0' [1.0.0, oleg@jet, cookie:679913454]
└─ Clients:
31. pipewire [1.0.0, oleg@jet, pid:14327]
33. WirePlumber [1.0.0, oleg@jet, pid:14320]
34. WirePlumber [export] [1.0.0, oleg@jet, pid:14320]
45. Firefox [1.0.0, oleg@jet, pid:13488]
55. mpv [1.0.0, oleg@jet, pid:18703]
61. wpctl [1.0.0, oleg@jet, pid:18721]
Audio
├─ Devices:
│ 44. Cayman/Antilles HDMI Audio [Radeon HD 6930/6950/6970/6990] [alsa]
│
├─ Sinks:
│ * 49. Cayman/Antilles HDMI Audio [Radeon HD 6930/6950/6970/6990] Цифровой стерео (HDMI) [vol: 1.00]
│
├─ Sink endpoints:
│
├─ Sources:
│
├─ Source endpoints:
│
└─ Streams:
50. Firefox
52. output_FL > HDMI 0 *:playback_FL [init]
54. output_FR > HDMI 0 *:playback_FR [init]
56. mpv
57. output_FR > HDMI 0 *:playback_FR [active]
59. output_FL > HDMI 0 *:playback_FL [active]
Video
├─ Devices:
│
├─ Sinks:
│
├─ Sink endpoints:
│
├─ Sources:
│
├─ Source endpoints:
│
└─ Streams:
Settings
└─ Default Configured Node Names:
Правильно ли я понимаю, что pipewire-pulseaudio играет звук через видеокарту вместо материнской платы? Как переключить? Как зафиксировать это перманентно?
И как запускать gentoo-pipewire-launcher под пользователем, если он запускается из *.desktop-файла при старте KDE?
Дополнение 3: Перезагрузил систему после пересборки. Теперь gentoo-pipewire-launcher запускается от того пользователя, который запускает иксы. Видимо, в прошлый раз не были прописаны какие-то права. Остался вопрос: как переключить PulseAudio на материнскую плату?
Дополнение 4: Как выяснилось, SDL2 была собрана с -pulseaudio и -pipewire.
Дополнение 5: fuser -v /dev/snd/* показало, что все устройства держит timidity. После отключения демона Timidity++ стали видны другие карты:
$ wpctl status
PipeWire 'pipewire-0' [1.0.0, oleg@jet, cookie:48267698]
└─ Clients:
31. pipewire [1.0.0, oleg@jet, pid:20833]
33. WirePlumber [1.0.0, oleg@jet, pid:20826]
34. WirePlumber [export] [1.0.0, oleg@jet, pid:20826]
51. Firefox [1.0.0, oleg@jet, pid:3822]
60. mpv [1.0.0, oleg@jet, pid:7113]
71. wpctl [1.0.0, oleg@jet, pid:7138]
Audio
├─ Devices:
│ 42. Встроенное аудио [alsa]
│ 44. Cayman/Antilles HDMI Audio [Radeon HD 6930/6950/6970/6990] [alsa]
│
├─ Sinks:
│ * 41. Встроенное аудио Аналоговый стерео [vol: 0.40]
│ 49. Cayman/Antilles HDMI Audio [Radeon HD 6930/6950/6970/6990] Цифровой стерео (HDMI) [vol: 1.00]
│
├─ Sink endpoints:
│
├─ Sources:
│ * 40. Встроенное аудио Аналоговый стерео [vol: 1.00]
│
├─ Source endpoints:
│
└─ Streams:
58. Firefox
53. output_FR > ALC887-VD Analog:playback_FR [init]
55. output_FL > ALC887-VD Analog:playback_FL [init]
61. mpv
62. output_FL > ALC887-VD Analog:playback_FL [active]
63. output_FR > ALC887-VD Analog:playback_FR [active]
66. Firefox
67. output_FL > ALC887-VD Analog:playback_FL [active]
68. output_FR > ALC887-VD Analog:playback_FR [active]
Video
├─ Devices:
│
├─ Sinks:
│
├─ Sink endpoints:
│
├─ Sources:
│
├─ Source endpoints:
│
└─ Streams:
Settings
└─ Default Configured Node Names:
Фаерфокс, MPV и VLC стали нормально проигрывать звук. Mplayer почему-то стал играть один из файлов в 2 с небольшим раза быстрее. Потом пришёл в норму.
Следующий вопрос: как подружить pipewire с timidity? Не то, чтобы я им много пользовался, но перфекционизм давит.
Дополнение 6: И с media-video/pipewire[-pipewire-alsa], и с media-video/pipewire[pipewire-alsa], если они уже загружены, timidity не запускается.
Неполный ответ: Нужно убедиться, что всё сделано строго по https://wiki.gentoo.org/wiki/PipeWire (USE, группы, rtkit), отключить Timidity и перезагрузиться.
Искал в интернете, но нашёл только однотипные ответы «ты не понимаешь, что такое нежадные регулятные выражения» без дополнительных пояснений.
Поэтому вопрос: чем они отличаются от жадных, и почему не работает re.DOTALL?
Собственно задача. Есть много однотипных файлов, скачанных с перегруженного скриптами сайта (webnovel.com, если интересно). Требуется удалить все теги <script ... </script>. Однострочник ''.join(re.split('<script.*?</script>', filestring)) удаляет однострочные скрипты, но не удаляет многострочные. ''.join(re.split('<script.*?</script>', filestring, re.DOTALL)) вдобавок не удаляет половину однострочных. Если предварительно прогнать filestring = filestring.replace('\n', '<abzats>'), удалить скрипты и вернуть filestring = filestring.replace('<abzats>', '\n'), получается желаемый результат. Почему не работает с DOTALL?
Ответ: Следует вызывать эту функцию как re.split('<script.*?</script>', filestring, flags=re.DOTALL)
без flags re.DOTALL воспринимается как параметр для maxsplit, поэтому часть найденных результатов игнорируется. Так как у меня было 32 результата, игнорировалась ровно половина.
То же относится к re.sub и многим другим.
Если охота побухтеть «HTML невозможно парсить регекспами, существуют специализированные библиотеки», назовите специализированную питоновскую библиотеку для совершения этой операции в 1 строку.
Столкнулся с проблемой, что время от времени программы начинают подвисать при попытке прочитать домашнюю директорию. ls, mc, автодополнение в bash… Лечится перезагрузкой, но через несколько суток аптайма возвращается. (Что удивительно, strace ls ~ отрабатывает без проблем и завершается успешно.) Всё же смог установить виновника, перебирая маски — ~/nfs/ при отвалившемся VPN. umount отказался её отмонтировать — «device is busy». Помогло umount --force --lazy
В связи с этим вопросы:
Что где осталось висеть после отмонтирования из-за --lazy, и чему оно может мешать в дальнейшем?
Почему ls не подвисает при запуске под strace? ls чувствует, что работает в пайпе и не выполняет операцию, приводившую к бесконечному ожиданию? Может ли strace запускать программы так, чтобы её присутствие не чувствовали?
Ответ на вторую группу вопросов: в данном случае «ls» оказалось переопределено в баше как alias ls='ls --color=auto', а проблемы вызывали операции, выяснявшие, как окрашивать директорию nfs.
https://www.youtube.com/watch?v=EGue2gO36ck
26 месяцев работы, при том что ваза получилась значительно меньше, чем планировалось, и не стали тратить время на её полировку, только отшлифовали. Хотя стенки вышли тоньше и ровнее, чем у египетских.
Ничего не сказано про сравнение диаметра горлышек данной вазы и египетского образца.
Предыдущие темы:
Невозможный артефакт — диоритовая ваза
Пилите, Ольга, пилите, там внутри ваза.
«Диоритовая ваза по древним технологиям»
Есть скрипт для рипанья сайтов. Для определённости — gallery-dl. Работает отлично. Но если сайт хостится на CloudFlare, и ему не нравится твой IP, появляется страница с капчой. Скрипт эту страницу проходить не умеет. Если пользоваться TOR-ом или популярным прокси, это происходит регулярно.
А может ли скрипт, получив страницу с запросом от CloudFlare, открыть её в браузере, чтобы пользователь ввёл всё, что надо, скрипт получил нужные куки и работал дальше? Где-нибудь это реализовано?
Можно ли из LibreOffice/OpenOffice сохранять и загружать маркдаун? Желательно, с зачёркиванием. Есть ли готовые плагины? Гугл предлагает только онлайн-конвертеры.
Или какой есть редактор с поддержкой маркдауна и LanguageTool?
Какие в Питоне самые быстрые способы искать подстроку в списке строк?
Есть список 16 000 URL-ов. Требуется узнать, сколько раз встречается какой домен. Отдельно требуется посчитать число доменов второго уровня. То есть домены вида dpmmax.livejournal.com учтутся дважды — и как dpmmax.livejournal.com, и как livejournal.com.
Список уникальных доменов можно получить регулярным выражением или через urllib:
unique_domains = set( urllib.parse.urlsplit(url).hostname for url in allurls )
unique_domains = sorted(unique_domains.union(m[1] for m in (re.match('.*?([^.]+\.[^.]+)$', d) for d in unique_domains) if m))
Можно для каждого домена в сете перебирать список URL-ов функцией:
def d_count(domain):
d1, d2 = '.' + domain + '/', '/' + domain + '/'
return sum( 1 for url in allurls if d1 in url or d2 in url )
Но это долго — 4-5 секунд для 1500 доменов и 16 000 URLов.
Можно заранее сделать список доменов, соответствующих URLам (allhosts = [urllib.parse.urlsplit(url).hostname for url in allurls]), и проверять по нему функцией:
def d_count(domain):
d1 = '.' + domain
return sum( 1 for hostname in allhosts if hostname.endswith(d1) or hostname == domain )
Но выигрыш получается в пределах погрешности.
Если использовать регулярные выражения, получится на 2 порядка дольше.
sum( 1 for <итератор> if <условие> ) работает на 20-30% быстрее sum( <условие> for <итератор> ). Бывает и все 60%.
Как ещё можно ускорить?
Ответ:
list.count() примерно втрое быстрее.
second_level_domains = [ m[1] for m in (re.match('^.*?([^.]+\.[^.]+)$', host) for host in allhosts) if m ]
counts = { domain: max(allhosts.count(domain), second_level_domains.count(domain)) for domain in unique_domains }
collections.Counter() ещё втрое быстрее:
counts =
collections.Counter(urllib.parse.urlsplit(url).hostname for url in allurls) |
collections.Counter(m[1] for m in (re.match('^.*?([^.]+\.[^.]+)$', urllib.parse.urlsplit(url).hostname) for url in allurls) if m)
Это быстрее в 10 раз.
Ещё вдвое можно ускорить, если не вычислять список хостов дважды:
allhosts = [urllib.parse.urlsplit(url).hostname for url in allurls]
counts = collections.Counter(allhosts) | collections.Counter(m[1] for m in (re.match('^.*?([^.]+\.[^.]+)$', host) for host in allhosts) if m)
Ещё несколько процентов можно получить, если заменить объединение сложением, а для этого регулярным выражением взять только домены 2 уровня из хостов глубже 2 уровня, отбросив всё остальное. Ещё немного даёт замена re.search и re.match на re.fullmatch с отказом от ^ и $:
allhosts = [urllib.parse.urlsplit(url).hostname for url in allurls]
counts = collections.Counter(allhosts) + collections.Counter(m[1] for m in (re.fullmatch('.*?\.([^.]+\.[^.]+)', host) for host in allhosts) if m)
Закрыл фаерфокс. Как обычно — с сохранением сессии. 4 окна, каждое — с кучей вкладок. Попробовал запустить — не вышло, закрывается с ошибкой. Попробовал другой профиль — запустилось нормально. Попробовал Safe Mode — предложило почистить профиль или просто запустить без плагинов. Выбрал второе — снова упало. Повторил Safe Mode, почистил профиль, запустил сохранённые вкладки — опять упало.
Проапдейтил фаерфокс со 102 до 115. Запустил — пишет «Нам не удалось восстановить вашу последнюю сессию. Выберите «Восстановить сессию», чтобы попробовать снова.»
Кнопка «Восстановить сессию» неактивна, список «Предыдущие вкладки» пуст, в меню «Журнал» тоже ничего интересного: «Восстановить предыдущую сессию» и «Недавно закрытые окна» серые, в «Недавно закрытые вкладки» — только вкладки о новшествах в новой версии Фаерфокса.
Как восстановить вкладки?
Ответ: https://support.mozilla.org/ru/kb/kak-vosstanovit-sessiyu-prosmotra-iz-rezervnoj-kop
В моём случае помогло по-быстрому скопировать все файлы из ~/.mozilla/firefox/<имя профиля>/sessionstore-backups/ а затем перед запуском Фаерфокса заменить ~/.mozilla/firefox/<имя профиля>/sessionstore.jsonlz4 на самый большой из них. Там было 2 одинаковых файла: previous.jsonlz4 и upgrade.jsonlz4-20230916112848. Возможно, 2-й сохранился потому, что я закрывал браузер по Ctrl-c в терминале.
https://resql.ru/forum/topic.php?fid=64&tid=2186833 https://resql.ru/forum/ajax/attachment.php?aid=40137935&nr=1&picture=1
Человек, пытающийся воскресить форум SQL.ru, проанализировал активность на нём. Обнаружил интересную закономерность — после того, как удалили 2 из 3 форумов для оффтопичного трёпа, в несколько раз упало количество просмотров и постов на тематических форумах. А начало общего угасания сайта он связывает с закручиванием гаек в 2015 году.
Также интересно, что до 2011 года включительно активность вдвое падала на летних каникулах.
А для ЛОРа кто-нибудь такие графики строил?
Копирую фрагменты текста со страниц, затем обрабатываю и объединяю их скриптом. Чтобы читать текущее значение буфера, хватает pyperclip. Но мне проще открыть 20 страниц, на каждой нажать Ctrl-Ins, а затем, не отвлекаясь, скормить скрипту всё сразу. А может ли скрипт сам залезть в историю буфера обмена и скопировать последние 20 записей?
Про то, что pyperclip умеет ждать изменения в буфере, знаю, но не пользовался. Если не найдётся более простого решения — попробую так.
Предварительный ответ:
import dbus
dbus.SessionBus().get_object('org.kde.klipper', '/klipper').get_dbus_method('getClipboardHistoryMenu', dbus_interface='org.kde.klipper.klipper')()[:20]
или
import dbus
method = dbus.SessionBus().get_object('org.kde.klipper', '/klipper').get_dbus_method('getClipboardHistoryItem', dbus_interface='org.kde.klipper.klipper')
[str(method(n)) for n in range(20)]
Тему пока не помечаю решённой на случай, если существует легче запоминающееся решение.
https://www.onlinegdb.com/S00Xzrubl
#include <stdio.h>
int main()
{
printf("%i %i %c %i %i %c %i %i %c %i %i %s",
'1'+'5'+'9', // 159
'9'-'2', // 7
'9'- 2 , // всё ещё 7
'9'- 2 , // автохрен, 55
'5'+ 2 , // 55 (╯°□°)╯︵ ┻━┻
'5'+ 2 , // а, не, норм, 7
1 * 1 , // единичка
0 *'1', // нолик
'0'*'1', // ну слава богу, нолик
'1'*'1', // 2401 щ(゜ロ゜щ)
'1'*'0', // верни. мне. мой. нолик.
"¯\\_(ツ)_/¯");
// да пошло оно всё, буду проституткой
return 0;
}
Я к этому отношения не имею. Может, кому-то здесь будет интересно. PHP, MySQL.
https://github.com/avkoudinov/simpleCommunicator
Используется https://nosql.itwrks.org/forum/forums.php
Обсуждение попыток взлома было где-то здесь: https://nosql.itwrks.org/forum/topic.php?fid=8&tid=10422&all=1
Имеется несколько тысяч файлов. Названия отражают содержимое и происхождение файла. Например: название книги, номер страницы, кто сканировал, откуда скачано, к какой дате приурочена выкладка, и т.п. Формат произвольный.
Требуется разбить их на группы, выделив общие для большого числа файлов названия книг. Как это автоматизировать?
Если просто перебирать подстроки для каждой строки в списке и сравнивать каждую со всем списком и со списком найденных, получается слишком долго. Как сделать быстро?
Например, CBZ, который представляет собой ZIP-файл с изображениями. Допустим, MC настроен открывать *.cbz в Okular. Enter на таком файле запустит проассоциированную программу. В FAR можно нажать Ctrl-PgDn и войти в архив как в директорию, независимо от расширений, но в MC Ctrl-PgDn работает только с директориями.
Есть ли способ входить в архивы вне зависимости от настроек файла расширений? Например, настроить отдельное действие на Ctrl-PgDn?
Подскажите, пожалуйста, как загрузиться с линуксовой флешки (Ophcrack — забыли пароль) на ноутбуке Toshiba Satellite C850? В прошлом году как-то удалось загрузиться с флешки Dr Web без проблем. Включаюсь с зажатыми F2, F12, Esc, Del — не помогает, грузит Windows 7.
Заранее спасибо.
P.S. Погуглил и узнал, что Windows умеет запрещать/разрешать вход в BIOS на «Тошибах». В частности, запрещают, когда компьютер переводят в спящий режим. Могло ли это включиться из-за зациклившегося обновления Windows 7, когда при каждой перезагрузке постоянно ставит и ставит одно последнее обновление?
| ← назад | следующие → |