LINUX.ORG.RU

Сообщения question4

 

re.DOTALL и нежадные регулярные выражения

Форум — General

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

Поэтому вопрос: чем они отличаются от жадных, и почему не работает 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 строку.

 ,

question4
()

Что даёт umount --force --lazy ? Чем ls отличается от strace ls ?

Форум — Admin

Столкнулся с проблемой, что время от времени программы начинают подвисать при попытке прочитать домашнюю директорию. ls, mc, автодополнение в bash… Лечится перезагрузкой, но через несколько суток аптайма возвращается. (Что удивительно, strace ls ~ отрабатывает без проблем и завершается успешно.) Всё же смог установить виновника, перебирая маски — ~/nfs/ при отвалившемся VPN. umount отказался её отмонтировать — «device is busy». Помогло umount --force --lazy

В связи с этим вопросы:

  1. Что где осталось висеть после отмонтирования из-за --lazy, и чему оно может мешать в дальнейшем?

  2. Почему ls не подвисает при запуске под strace? ls чувствует, что работает в пайпе и не выполняет операцию, приводившую к бесконечному ожиданию? Может ли strace запускать программы так, чтобы её присутствие не чувствовали?

Ответ на вторую группу вопросов: в данном случае «ls» оказалось переопределено в баше как alias ls='ls --color=auto', а проблемы вызывали операции, выяснявшие, как окрашивать директорию nfs.

 , ,

question4
()

Окончание истории с диоритовой вазой

Форум — Science & Engineering

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

26 месяцев работы, при том что ваза получилась значительно меньше, чем планировалось, и не стали тратить время на её полировку, только отшлифовали. Хотя стенки вышли тоньше и ровнее, чем у египетских.

Ничего не сказано про сравнение диаметра горлышек данной вазы и египетского образца.

Предыдущие темы:
Невозможный артефакт — диоритовая ваза
Пилите, Ольга, пилите, там внутри ваза.
«Диоритовая ваза по древним технологиям»

 ,

question4
()

Как проходить капчу из скрипта?

Форум — Development

Есть скрипт для рипанья сайтов. Для определённости — gallery-dl. Работает отлично. Но если сайт хостится на CloudFlare, и ему не нравится твой IP, появляется страница с капчой. Скрипт эту страницу проходить не умеет. Если пользоваться TOR-ом или популярным прокси, это происходит регулярно.

А может ли скрипт, получив страницу с запросом от CloudFlare, открыть её в браузере, чтобы пользователь ввёл всё, что надо, скрипт получил нужные куки и работал дальше? Где-нибудь это реализовано?

 , ,

question4
()

Markdown и LibreOffice

Форум — Desktop

Можно ли из LibreOffice/OpenOffice сохранять и загружать маркдаун? Желательно, с зачёркиванием. Есть ли готовые плагины? Гугл предлагает только онлайн-конвертеры.

Или какой есть редактор с поддержкой маркдауна и LanguageTool?

 , , ,

question4
()

Подсчёт подстрок в списке строк. Как быстрее?

Форум — Development

Какие в Питоне самые быстрые способы искать подстроку в списке строк?

Есть список 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)

 

question4
()

Firefox не может восстановить сессию

Форум — Desktop

Закрыл фаерфокс. Как обычно — с сохранением сессии. 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 в терминале.

 

question4
()

О роли оффтопичного трёпа для существования форума

Форум — Talks

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 года включительно активность вдвое падала на летних каникулах.

А для ЛОРа кто-нибудь такие графики строил?

 

question4
()

Как читать историю буфера обмена KDE из питона?

Форум — Development

Копирую фрагменты текста со страниц, затем обрабатываю и объединяю их скриптом. Чтобы читать текущее значение буфера, хватает 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)]

Тему пока не помечаю решённой на случай, если существует легче запоминающееся решение.

 , ,

question4
()

Забавный пример преобразования типов на Си

Форум — Development

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; 
}

 

question4
()

Ещё один форумный движок

Форум — Talks

Я к этому отношения не имею. Может, кому-то здесь будет интересно. 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

 , ,

question4
()

Поиск частых подстрок в списке строк

Форум — Development

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

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

Если просто перебирать подстроки для каждой строки в списке и сравнивать каждую со всем списком и со списком найденных, получается слишком долго. Как сделать быстро?

 

question4
()

Как в MC войти в архив, если с расширением проассоциировано другое действие?

Форум — Desktop

Например, CBZ, который представляет собой ZIP-файл с изображениями. Допустим, MC настроен открывать *.cbz в Okular. Enter на таком файле запустит проассоциированную программу. В FAR можно нажать Ctrl-PgDn и войти в архив как в директорию, независимо от расширений, но в MC Ctrl-PgDn работает только с директориями.

Есть ли способ входить в архивы вне зависимости от настроек файла расширений? Например, настроить отдельное действие на Ctrl-PgDn?

 

question4
()

Загрузить ноутбук с флешки

Форум — Linux-hardware

Подскажите, пожалуйста, как загрузиться с линуксовой флешки (Ophcrack — забыли пароль) на ноутбуке Toshiba Satellite C850? В прошлом году как-то удалось загрузиться с флешки Dr Web без проблем. Включаюсь с зажатыми F2, F12, Esc, Del — не помогает, грузит Windows 7.

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

P.S. Погуглил и узнал, что Windows умеет запрещать/разрешать вход в BIOS на «Тошибах». В частности, запрещают, когда компьютер переводят в спящий режим. Могло ли это включиться из-за зациклившегося обновления Windows 7, когда при каждой перезагрузке постоянно ставит и ставит одно последнее обновление?

 

question4
()

pylint не видит константы в библиотеке

Форум — Development

Есть программа из 2 строк:

from pygame.locals import FULLSCREEN, K_a, K_BACKQUOTE, K_BACKSPACE, K_c, K_d, K_DELETE, K_DOWN, K_e, K_ESCAPE, KEYDOWN
print(FULLSCREEN, K_a, K_BACKQUOTE, K_BACKSPACE, K_c, K_d, K_DELETE, K_DOWN, K_e, K_ESCAPE, KEYDOWN)

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

$ pylint test.py --errors-only
************* Module test
test.py:2:0: E0611: No name 'FULLSCREEN' in module 'pygame.locals' (no-name-in-module)
test.py:2:0: E0611: No name 'K_a' in module 'pygame.locals' (no-name-in-module)
test.py:2:0: E0611: No name 'K_BACKQUOTE' in module 'pygame.locals' (no-name-in-module)
test.py:2:0: E0611: No name 'K_BACKSPACE' in module 'pygame.locals' (no-name-in-module)
test.py:2:0: E0611: No name 'K_c' in module 'pygame.locals' (no-name-in-module)
test.py:2:0: E0611: No name 'K_d' in module 'pygame.locals' (no-name-in-module)
test.py:2:0: E0611: No name 'K_DELETE' in module 'pygame.locals' (no-name-in-module)
test.py:2:0: E0611: No name 'K_DOWN' in module 'pygame.locals' (no-name-in-module)
test.py:2:0: E0611: No name 'K_e' in module 'pygame.locals' (no-name-in-module)
test.py:2:0: E0611: No name 'K_ESCAPE' in module 'pygame.locals' (no-name-in-module)
test.py:2:0: E0611: No name 'KEYDOWN' in module 'pygame.locals' (no-name-in-module)

В чём проблема? Почему анализатор их не находит?

Python 3.10, Gentoo. Pygame-2.2.0 и Pylint-2.17.1 ставил через ебилды.

 ,

question4
()

Kittens Game by bloodrizer

Форум — Games

Наткнулся на браузерную игру: https://kittensgame.com/web/, с исходниками: https://bitbucket.org/bloodrizer/kitten-game/src/master/

Довольно залипательная текстовая стратегия в реальном времени с паузой. Персонажи изображаются в виде котят (картинок нет), поэтому бывают забавные текстовые сообщения: https://bitbucket.org/bloodrizer/kitten-game/src/master/res/i18n/en.json https://bitbucket.org/bloodrizer/kitten-game/src/master/res/i18n/ru.json — искать по слову «flavor», например

"buildings.reactor.flavor": "Светящихся мышей ловить проще!",

P.S. Меня поправляют, что такие игры называются кликерами. Хотя в других кликать приходилось гораздо чаще.

 браузерные игры

question4
()

Вопрос по гуглокартам и Google Earth

Форум — Talks

Захотелось посмотреть на панорамы Уганды. На картах показывает, что доступны Street View для всей столицы, национального парка рядом с Белым Нилом и соединяющей их дороги. Пытаюсь посмотреть разные точки на этой дороге — в Maps ничего не происходит, в Earth показывает «ground-level view» — сгенерированное из спутниковых снимков и несложного трёхмерного рельефа. Точно так же недоступна часть столицы.

Попробовал включить в Earth «show historical imagery», перепробовал разные даты — панорамы недоступны.

В чём дело? Почему показывает что картинки есть, когда их нет?

 , ,

question4
()

Лучшая на сегодня видеокарта

Форум — Linux-hardware

Лет 9 назад собрал новый десктоп. И здорово ошибся с видеокартой Radeon HD 6950. HD 6000 были последними, не поддерживавшими Vulkan. OpenCL не взлетел, всюду требовался CUDA, а поддержка Radeon-ов была «на отвяжись» или отсутствовала.

Что брать сейчас? Что из имеющихся останется актуально ещё лет 10?

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

 , , , ,

question4
()

Растянуть окно 640x480 на весь экран

Форум — Desktop

Старая программа запускается под Вайном в очень маленьком окне. Растянуть невозможно. Можно ли средствами композитора увеличить окно со всем содержимым в 2 раза? Или лучше в нецелое число раз, чтобы заняло весь экран хотя бы в одном измерении.

Для определённости: КДЕ 5, игра Tone Rebellion, экран 1920x1080.

Когда-то давно я читал, что это несложно сделать средствами OpenGL, но в X Window нет возможности перенаправлять нажатия мыши из смасштабированных координат. Это так? Тогда что может предложить Wayland?

 , , ,

question4
()

«Чекбокс „Запомнить пароль” — лучший способ потерять пароль.»

Форум — Talks

Без всяких видимых причин — даже не апдейтил КДЕ — при очередном логине KRDC запросил пароль для первого подключения ко KWallet, которым я пользовался уже полгода. Пароли — генерированные, по 12 букв, запомнить нереально, в целях безопасности не записывал.

Вызваниваю админов…

 ,

question4
()

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