Кто-нибудь в языковых моделях разбирается?
https://shaochenze.github.io/blog/2025/CALM/
https://github.com/shaochenze/calm
Чем отличается предлагаемый подход?
https://shaochenze.github.io/blog/2025/CALM/
https://github.com/shaochenze/calm
Чем отличается предлагаемый подход?
Понадобилось срочно скинуть на телефон пачку PDFов. python -m http.server, на телефоне в Termux wget -m http://192.168.1.57:8000/…
В ответ ошибка:
192.168.1.57:8000/index.html: Operation not permitted
Cannot write to ‘192.168.1.57:8000/index.html’ (Operation not permitted).
Директория 192.168.1.57:8000/ создалась успешно, но wget писать в неё не может. Лет 5 назад на старом телефоне это работало. В чём проблема теперь?
Файлы скинул, задействовав порт 80 через sudo. Просто интересно, решаема ли проблема.
UPDATE: Похоже, wget ни при чём. mkdir внутри директории «192.168.1.57:8000» работает, но touch — нет, и копирование в неё — тоже. Аппарат Huawei, версия прошивки 14.2.0.180(C10E2R5P2)
Лечится?
https://pyfound.blogspot.com/2025/10/NSF-funding-statement.html
С год назад подали на грант правительства США на усиление безопасности Python и PyPI. Заявку одобрили. Сейчас должны были перевести полтора миллиона долларов, но обнаружилось новое требование — PSF должен был подтвердить, что не работает и на время гранта не будет работать по каким-либо программам, продвигающим или пропагандирующим DEI или другую дискриминационную идеологию, нарушающую федеральные законы США против дискриминации. PSF отказался.
Я правильно понял, что они по DEI получают гораздо больше этих полутора миллионов, поэтому отказались?
Кто хочет, может сделать новость.
Не очень старый Seagate (изготовлен в 2018, работает с 2022) внезапно начал «заикаться»: при чтении файла процесс зависает с характерным тихим «бряком» диска, затем какое-то время тарахтит, как дисковод на сбойном секторе. Времени возиться с этим не было, поэтому терпел, хотя заикания случались всё чаще.
Пару дней назад компьютер отключил мониторы из-за длительной неактивности, после чего прекратил реагировать на внешние раздражители. Кроме Alt-SysRq, на которую мигал светодиодами клавиатуры. После ресета GRUB отказался грузиться.
Загрузился со старого диска (Toshiba), который при последнем включении работал нормально — на нём тоже начались заикания, с паузами до 2 минут. Сделал на нём загрузочные флешки, опробовал, хотел переделать — на этом диске GRUB тоже отказался грузиться. То есть виновата материнская плата, которая портит диски.
В итоге переставил Seagate в другой системный блок, загрузился с флешки и просканировал fsck — нашлось несколько ошибок, которые были исправлены. За сутки заикания не проявлялись.
Вопросы:
Что это было? Конденсаторы на материнской плате помирают?
Как оценить нанесённый диску ущерб? Как эти сбои сказались на достоверности данных в таблице SMART?
Хочу добавить 1400-байтный комментарий к картинке. exiv2 -c отвечает «Установка Image comment в WebP изображений не поддерживается». webpmux требует созданный сторонней программой файл exif (или xmp) и не проверяет его валидность, если использовать *.exv, сделанный exiv2, другие программы этот комментарий не видят.
Чем его добавить?
Или WebP принципиально не могут содержать текст?
Я хочу внести некоторые изменения в содержимое директории, не меняя её время модификации. Примерно так:
$ ls -ld --time-style=+%s book213/
drwxr-xr-x 2 tkzv tkzv 4096 1752784766 book213
$ cd book213; rename ... ... ... ; cd ..
$ touch book213 -d @1752784766
Если я выполняю команду с %s при видимых панелях MC, вместо %s автоматически подставляется выделенный файл. То есть выполняется что-то вроде ls -ld --time-style=+book213 book213/
Как отключить эту подстановку? Помимо закрытия панелей.
Частичный ответ:
ls -l --time-style=+%%s ... — штатное экранирование для MC, как я понял. Работает при открытых панелях, но не работает без них.
ls -l --time-style=+%\s ... — работает и там, и там.
Есть сохранённые файлы HTML, в которых много ненужного: джаваскрипты, стили, SVG… Пытаюсь удалить.
Я попробовал так:
import lxml.html
h = lxml.html.parse('page001.html')
root = h.getroot()
for e in root.iter():
if type(e.tag) != str:
e.drop_tree()
if e.tag in ('link', 'script', 'svg', 'footer', 'style') and ... e.attrib ... :
e.drop_tree()
И затем посмотрел результат print(lxml.etree.tostring(root, pretty_print=True).decode())
В результате удалились линки и скрипты из секции head (например, root[0][12]), но не удалился SVG из глубин body (root[1][0][1][3][0][0][0][2][0][0][0]).
Немного покопавшись, понял: нельзя удалять элементы массива, по которому идёт for от начала к концу (в обратном направлении — можно). Но тогда почему это работало для первых элементов?
Лет 20 назад архиватор StuffIt внедрил интересный метод упаковки в формат .sitx: для хорошо известных форматов, использующих сжатие, например, JPEG, исходный файл перед упаковкой разжимался, затем архиватор сжимал его методом PPMd. При распаковке те же данные распаковывались из PPMd, и затем упаковывались в JPEG методом Хаффмана. За счёт большей эффективности PPMd, обещали сжатие JPEG-ов на треть. (Википедия пишет, что на четверть.) Вроде бы то же делалось для PNG, GIF, ZIP, TIFF, PDF, адоубовских форматов… Но под Линукс для этого формата не было даже распаковщика.
Идея интересная. Кто-нибудь пытался реализовать что-то подобное в свободных архиваторах?
Сейчас наткнулся на информацию, что владельцы StuffIt прекратили его развитие и поддержку в 2019-м. Сайт https://stuffit.com/ пока жив, но сертификат истёк 1 октября.
https://upload.wikimedia.org/wikipedia/commons/e/e1/Mass_Spectrometer_Analysis_Results_(4687970545).jpg — кто-нибудь может опознать программу на мониторе?
Когда-то давно в Дуолинго наткнулся на фото экрана монитора с масс-хроматограммой в качестве иллюстрации «анализа». Сделал скриншот, чтобы поискать, но нашлись более срочные проблемы. Сейчас наткнулся на него, поискал, нашёл в Википедии: https://es.wikipedia.org/wiki/Archivo:Mass_Spectrometer_Analysis_Results_(4687970545).jpg Фотографией иллюстрировали анализ проб воды после аварии Deepwater Horizon (точнее, подготовку эталонов для сравнения). LC/MS или, скорее, GC/MS.
Кто-нибудь может опознать использованную программу?
P.S. Расширения файлов и директорий похожи на Agilent, но Agilent ChemStation, с которыми я имел дело, выглядели иначе.
Существует ли готовая программа, способная сравнивать архивы, как diff сравнивает директории? То есть выводить список различий текстовых файлов в тех же форматах, понятных patch. Всё, что я нашёл — предельно примитивные zipcmp и folderdiff, которые только выводят имена различающихся файлов. И советы, как сделать подобный скрипт. Выглядит несложно.
Форматы документов ODT и DOCX — набор файлов XML в архиве ZIP. Подобный diff мог бы помочь сравнивать офисные документы. Почему его до сих пор не сделали? Содержимое XML при многократных сохранениях слишком сильно преобразуется? Много случайного мусора? Элементы тасуются в произвольном порядке?
А что если обобщить? Пусть архив будет форматом-контейнером (OLE, RIFF, PNG, что ещё можете предложить…), а сравниваемое содержимое — любыми данными, для которых текстовый diff или побайтное сравнение несёт какую-то человекочитаемую информацию, и патч можно легко наложить/откатить. Так кто-нибудь делал?
Никакую практическую задачу не решаю. Просто в очередной раз столкнулся со сравнением бинарных документов, стало любопытно.
ОТВЕТ: Судя по скриншотам, это умеет diffoscope: https://diffoscope.org https://try.diffoscope.org
Хотя в комментариях пишут, что его подход может не быть оптимальным для сравнения XML. Попробую как-нибудь.
Не спится. Мучает вопрос. Мешают ли флешки друг другу?
Есть несколько флешек. Разного размера, с разными характеристиками. Нужно сохранить на них много файлов. С машины у которой все гнёзда USB одинаковые — 2.0 для определённости. Как быстрее: воткнуть самую быструю и сохранять на неё, или воткнуть все имеющиеся флешки, разбить файлы на группы, и одновременно сохранять на все флешки? (Разумеется, во 2-м случае возможна переброска из группы в группу, если какая-то флешка заметно быстрее и управится раньше.) Считаем, что скорость жёсткого диска больше суммарной скорости флешек.
Ответ: Коллективный разум считает, что быстрее распараллелить.
Делаю на веб-странице (для определённости — в firefox) Ctrl-A, переключаюсь в LibreOffice Writer, кликаю средней кнопкой мыши — вставляется красиво отформатированный текст и картинки. Можно даже сохранить как HTML с картинками.
А как сделать то же автоматически, не задействуя LibreOffice? В идеале — скриптом, который автоматически определяет, что буфер изменился, и тут же сохраняет содержимое.
Пробовал читать буфер скриптами на питоне средствами Qt6 и GTK4. Большая часть нагугленных скриптов устарели и или не работают, или крэшат интерпретатор. Методом тыка сумел найти отображение в виде HTML или текста для Qt6. Но не primary selection, а clipboard.
from PyQt6.QtWidgets import QAbstractItemView, QApplication, QTableView
from PyQt6.QtGui import QStandardItem, QStandardItemModel
app = QApplication([])
c = app.clipboard()
Далее c.mimeData().formats() выдаёт тот же список, что и xclip -t TARGETS, HTML можно получить c.mimeData().html(), текст — c.mimeData().text() или c.text(). Как я понял из хэлпа, c.Mode(1) должно переключить на selection вместо clipboard, но это не происходит.
Как в PyQt6 обращаться к primary selection?
Как в PyQt6 детектировать изменение primary selection?
Как LibreOffice извлекает картинки из скопированного с веб-страницы? — Ответ: похоже, парсит HTML и скачивает содержимое <img ...>. В таком случае, удалю простыни исследования xclip. чтобы не отвлекали.
Выделяю в браузере на веб-странице текст, копирую. Переключаюсь в Kate/mcedit/VIm, вставляю — получаю текст без форматирования. Вся раскраска текста, все гиперссылки потерялись. (Обычно так и нужно.) Переключаюсь в Офис, вставляю — форматирование вставилось. Но извлекать гиперссылки из этого текста — та ещё задача.
А можно в консоли набрать xclip -out -selection clipboard -target text/html > page.htm, открыть файл в Kate/mcedit/VIm и получить искомые гиперссылки.
А сразу вставить HTML в Kate как-нибудь можно?
Про пункты меню «Исходный текст страницы» и «Исходный текст выделенного фрагмента» знаю, но они не всегда работают с динамическими страницами. Про инспектора DOM знаю, но он менее удобен, чем просто выделить мышью на странице.
Можно ли задавать mime-тип вставляемого в Kate и vim?
Промежуточный ответ: пока выяснил, как добавлять вызов произвольной команды в Kate и Vim и добавил вызов xclip.
Столкнулся с проблемой с curl-ом, написал багрепорт. Мне предложили попытаться воспроизвести баг с патченным curl-ом. Проблема в том, что для воспроизведения файл должен качаться, условно говоря, с минуту. Сайт, на котором я обнаружил проблему, за это время успел совсем сдохнуть. Большинство вебсайтов сейчас работают быстро и не любят, когда в них долбятся curl-ом и прочими самопальными качалками.
Вопрос: какой самый простой способ поднять локальный HTTP-сервер с урезанной до предела скоростью скачивания (GET) и поддержкой докачки? Например, умеет ли так идущий в комплекте с Python http.server? Или есть реальный сайт, который удовлетворяет этим требованиям?
P.S. Poorconn не поддерживает докачку.
Есть 2 файла JPEG. 800х600 и 800х494. Я хочу объединить их по вертикали в один без потери качества. Горизонтальные серые полосы не мешают.
В сети рекомендуют увеличить один файл до суммарного размера -crop-ом и вставить туда другой -drop-ом. Но когда я делаю 1-му файлу jpegtran -crop 800x1104+0+0 -outfile tmp1.jpg 1.jpg, в нём изображение обрезается на высоте 592. -perfectничего не даёт, -verbose и -report ничего интересного не показывают. Как я понимаю, изображение разбито на квадраты 16x16, и нижний ряд квадратов (заполненных наполовину) отбрасывается. Как его сохранить?
Регулярно сталкиваюсь с проблемой в интерактивном режиме в новом Питоне. После каких-то действий перестают работать кнопки курсора: стрелки, Home, End. И серые, и на цифровой клавиатуре. Ctrl-стрелки иногда работают, иногда тоже перестают. Ввод с клавиатуры обычно работает, Backspace работает. После нажатия на Enter или Ctrl-C стрелки начинают работать. Можно нажать F2 и q, тогда заработает и в текущей строке.
Когда это начинается, сказать затрудняюсь, но смог устойчиво воспроизводить следующим образом:
запустить в консоли Midnight Commander,
запустить в нём python3.13,
набрать что-нибудь в интерактивном режиме,
открыть панели MC по Ctrl-O, затем закрыть Ctrl-O,
после этого стрелки игнорируются.
В bash такой проблемы с MC не возникает.
В чём дело? Исправить это можно? Или как сбросить помимо F2, q?
Gentoo, KDE6, X.org-21.1.16, Konsole-24.12.3, Python-3.13.3, MC-4.8.33
Учебная задача. Симулятор обработки сетевых пакетов. Дан буфер размера size и набор Npac пар чисел Ti-Di. В моменты Ti приходят пакеты, на обработку которых нужно Di времени. Di может быть 0. Несколько Ti подряд могут совпадать, но они гарантированно не убывают. Пришедший пакет добавляется в хвост буфера. Обрабатывается только пакет в голове, на 0-м месте, остальные ждут. Если подряд идут несколько пакетов длительностью 0, они обрабатываются в одном такте, в том же, когда первый из них дошёл до головы, и этот же такт засчитывается и в обработку следующего за ними ненулевого пакета. Когда буфер заполнен, приходящие пакеты сбрасываются.
Требуется выдать массив времён, когда началась обработка каждого пакета. Или «-1», если пакет был сброшен.
Я сделал предельно просто — счётчик тактов времени, на каждом такте пробегается вначале очередь, всем ждущим снижается время ожидания, если что-то доходит до головы — обрабатывается, затем пробегается массив пакетов от первого необработанного до первого со временем прибытия Ti больше текущего. Работает правильно, но долго.
Попробовал ускорить, двигать время не по 1 такту, а определять дельты до прихода ближайшего пакета или окончания обработки головы очереди, что раньше. Выигрыш получился несущественный. Оптимизации с заменой list на collections.deque и хранением длин массивов в отдельных переменных дали прирост 10-20%
Почитал советы — говорят, надо избавиться от цикла со счётчиком времени и работать с событиями. Какая принципиальная разница с дельтами? Попробовал, запутался в алгоритме, постоянно что-то теряется. Получилось гораздо быстрее, но возможно, потому, что неправильно.
Вариант с дельтами:
import time, sys, collections
ar = list(map(int, sys.stdin.read().split()))
size, npac = ar[0:2]
packets = [ar[lcv*2+2:lcv*2+4] for lcv in range(npac)]
packets = [{'arrival':arrival, 'duration':duration, 'start':-1, 'time':duration} for arrival, duration in packets]
maxtime = 1 + sum(p['arrival'] + p['duration'] for p in packets)
queue = collections.deque()
curp = 0 # номер первого необработанного пакета
t = 0
nextarrival = 0
nextqueue = 0
delta = 1
while t < maxtime:
# обработать очередь
if queue:
queue[0]['time'] -= 1
if queue[0]['time'] <= 0:
queue.popleft()
while queue and queue[0]['time'] <= 0:
queue[0]['start'] = t
queue.popleft()
if queue:
queue[0]['start'] = t
nextqueue = queue[0]['time']
# проверить прибытие пакетов
for i in range(curp, npac):
p = packets[i]
if t < p['arrival']:
nextarrival = p['arrival']
break
curp = i+1
if t == p['arrival']:
if not queue:
p['start'] = t
if p['duration'] > 0:
queue.append(p)
elif len(queue) < size:
queue.append(p)
else:
p['start'] = -1
# выход, всё закончилось
if len(queue) < 2 and curp >= npac:
break
# время следующего события
tlast = t
t = max(min(nextarrival, nextqueue), t+1)
delta = t - tlast
for p in packets:
print(p['start'])
Что и как здесь можно ускорить?
Или как делать иначе? Цикл по массиву пакетов, где в ожидании очередного прибытия прокручивается очередь, у меня получился слишком запутанным. Другие варианты есть?
Ответ: Свёл к следующему:
import sys, collections
ar = list(map(int, sys.stdin.read().split()))
size, npac = ar[0:2]
packets = [ar[lcv*2+2:lcv*2+4] for lcv in range(npac)]
queue = collections.deque()
log = [-1 for _ in range(npac)]
t0 = 0 # tc = 0
for pn in range(npac):
cparrival, cpduration = packets[pn]
# tc <= cparrival
while len(queue) > 0 and t0 + queue[0][0] <= cparrival :
d0, pn0 = queue.popleft()
t0 = t0 + d0 #tc
if queue:
log[queue[0][1]] = t0
#t0 = tc
#tc = cparrival
if len(queue) < size:
queue.append([cpduration, pn])
if len(queue) == 1:
log[pn] = cparrival
t0 = cparrival
#tc = t0
while queue:
d0, pn0 = queue.popleft()
print(log)
Вычислительная часть работает вдвое быстрее.
После грозы с миганием света стал глючить интернет. ping 8.8.8.8 стал терять 20-40% пакетов, ping по имени домена вдобавок стал отказываться ресолвить домен (примерно 1 раз из 3). На звонки к провайдеру трое суток отвечал робот «в вашем районе ведутся ремонтные работы». Подключился через сотовый телефон. По окончании работ лучше не стало. По совету техподдержки перезагружал роутер и компьютер и шатал штекера в разъёмах — не помогло. Попробовал подключить кабель напрямую — те же потери 30%, и опять «в вашем районе ведутся ремонтные работы» на двое суток.
Когда сотрудник провайдера наконец до меня добрался, он смог меня убедить попробовать напрямую ещё раз. Почему-то в этот раз не заработало без подмены MAC-адреса, зато с подменой связь стала отличной. То есть, виноват роутер. По его мнению — помирает от старости (MikroTik hAP ac lite, куплен в 2019).
Собственно вопросы:
Что сейчас стоит брать в Подмосковье? Требуются 3 выхода Ethernet и WiFi. Искать устройства с «OpenWRT» в описании?
Что могло случиться со старым? Как определить, ремонтопригоден ли он, и что можно сделать? Если это надолго, возиться не буду, просто интересно.
Требовалось произвести кое-какие преобразования строк в списке. Обнаружил, что при использовании list comprehension не могу взять i-й символ из строки, пишет «string index out of range». Вне генератора выражение работает нормально.
>>> ls1[0]
"#mkdir '1236'"
>>> line = ls1[0]
>>> line[0]
'#'
>>> [line[0] for line in ls1]
Traceback (most recent call last):
File "<python-input-49>", line 1, in <module>
[line[0] for line in ls1]
~~~~^^^
IndexError: string index out of range
Для других индексов — то же. В итоге сделал через регулярные выражения, но в чём проблема?
Python 3.13.3
P.S. Гуглить не получается, интернет в доме почти не работает, все ремонтники в отпуске. ЛОР кое-как грузится, с более навороченными сайтами — швах.
Ответ: Пустая строка в конце после str.split(‘\n’)
Есть 9-мегабайтный текстовый файл. Я в него добавил в разные места несколько килобайт, затем неправильно применил в FAR-е скрипт EditWrap.lua и по ошибке сохранил. Бэкап, сделанный до всех правок, есть.
Нужно сравнить этот файл с оригиналом, игнорируя разрывы строк, и перенести отличия из нового в старый. То есть при сравнении должны считаться одинаковыми фрагменты:
a bc d
и
a b
c d
Если при этом фрагменты окажутся одинаковыми с a b c d или abcd — значения не имеет, не проблема.
diff, насколько я понял, может приравнять любое число пробелов и табов к одному пробелу, но игнорировать разрыв строки не может.
wdiff и dwdiff работают на уровне слов, поэтому разрывы строк, разрывающие слова, они игнорировать не смогут. Так?
Что ещё есть?
UPD: Сравнил их скриптом на Питоне в полуручном режиме, но вопрос о более универсальном решении остался.
| ← назад | следующие → |