@LogicDaemon-pubru
4 subscribers
3 photos
8 files
15 links
Download Telegram
из моего старого блога, 7 мая 2015 г.

PCI Latency Timer
В BIOS Setup многих x86 систем есть параметр PCI Latency Timer.

Долгое время я устанавливал его на 128 тактов для всех систем, в BIOS Setup которых заходил, поскольку субъективно это давало большую производительность при недостатке ресурсов.

PCI Latency Timer – это число тактов, которое устройство может занимать шину, прежде чем оно будет должно передать контроль за шиной другому устройству. Т.е. устройство может освободить шину и раньше, если она не нужна, но дольше удерживать не может.

Передача управления занимает время, так что, чем больше Latency Timer, тем выше ПСП и ниже нагрузка на процессор. Но чем меньше Latency Timer, тем ниже задержки.

Есть куча материала на эту тему, но в основном – пространные теоретические рассуждения, причём часто основанные на ошибочных догадках. Сегодня наткнулся на статью, которая, наконец-то, прояснила для меня, почему это давало большую производительность, и почему это не всегда полезно: https://www.mythtv.org/wiki/PCI_Latency

Вкратце:

* Не влияет на PCI-Express.
* Для большей части материнских плат по умолчанию Latency Timer – 32 такта, и это разумное значение. Оно устанавливается для всех устройств.
* Драйверы устройств (а в Linux – и setpci в командной строке) могут менять это значение. Оно может быть разным для разных устройств. Контроллеры IDE/SATA/USB обычно остаются с задержкой, установленной в BIOS Setup.
* Проблемы начинаются, если два устройства обмениваются информацией, и у них разный Latency Timer. Устройство с большей задержкой будет ждать окончания передачи, пока устройство с короткой задержкой будет порциями заполнять буфер. Особенно заметно это при видеозахвате (у устройства видеозахвата Latency Timer будет увеличен драйвером, если он слишком маленький, а IDE контроллер останется с 32 тактами).
* Большая задержка может быть проблемой, например, работе со звуком: объём передаваемой информации небольшой, а низкие задержки важны. И у некоторых звуковых карт для уменьшения задержки можно уменьшить буфер до критически низких значений, например, 8 сэмплов. Устройства с большим Latency Timer будут слишком долго удерживать шину, и звуковая карта не будет успевать* отдавать данные при записи (будут пропуски) или получать при воспроизведении (будут паузы/щелчки/шум).
из моего старого блога, 11 янв. 2016 г.

командная строка в Windows – минное поле

У меня есть подозрение, что в недрах Microsoft есть специальная команда разработчиков, которая специально заботится, чтобы у всего, что связано с командной строкой Windows, были грабли, подводные камни и проблемы.

Примеры:

1. %comspec% (cmd.exe) требует, чтобы все параметры после /C или /K были в кавычках. Наример, нельзя выполнить
cmd.exe /C "%ProgramFiles%\notepad2\notepad2.exe" "%USERPROFILE%\Documents\test.txt"
, надо
cmd.exe /C ""%ProgramFiles%\notepad2\notepad2.exe" "%USERPROFILE%\Documents\test.txt""
Что ещё хуже – cmd.exe маскирует этот косяк, и там, где "замечает" свой вызов, сам подставляет внешние кавычки (причём не всегда угадывает). Но остальные программы про это не в курсе! Например, это очень сильно мешает при использовании планировщика Windows.

2. START "notepad.exe" – не работает. Работает
START "" "notepad.exe"

3. "%windir%\System32\find.exe" /n "4" "test.txt" отдельно – работает.
FOR /F "usebackq tokens=*" %%A IN ("%windir%\System32\find.exe" /n "4" "test.txt") DO ECHO %%A – не работает. Работает
FOR /F "usebackq tokens=*" %%A IN (%windir%\System32\find.exe /n "4" "test.txt") DO ECHO %%A

4. ECHO 123>test.txt – не работает.
ECHO "123">test.txt – записывает "123" с кавычками.
ECHO 123 >test.txt – с пробелом.
Чтобы заработало без пробела, надо писать
ECHO 12^3>test.txt
или
(ECHO 123)>test.txt

5. ECHO выводит ECHO is on. или локализованную фразу (по русски – четыре длинных слова). Чтобы вывести пустую строку, надо писать
ECHO.
(с точкой слитно; также работает ECHO\, ECHO] и т.п.)

6. Если внутри блока (…) будет комментарий со скобками, например, rem (проверка) , интерпретатор командной строки прочтёт закрывающую скобку как конец блока.

7. FOR %%A in ("C:\test.file") DO ECHO %%A выводит C:\test.file независимо от наличия там test.file.

8. Некоторые команды не меняют код ошибки ERRORLEVEL при вызове с неправильными параметрами командной строки. Самые назойливые примеры:
* NET SHARE (при этом NET USER – меняет)
* defrag.exe (на Win8 и выше его стоит запускать с ключом /O, на 7 этот ключ не поддерживается)

9. До Windows Vista не было предустановленной переменной среды, в которой было бы указано расположение %USERPROFILE%\Local Settings\Application Data. В Vista добавили %LOCALAPPDATA%, но ещё добавили папку %USERPROFILE%\AppData\LocalLow, расположение которой снова не указано ни в какой переменной среды.

10. Узнать hostname – нетривиальная задача. Есть переменная %COMPUTERNAME%, но там всегда в верхнем регистре и обрезано, если для NetBIOS оно "слишком длинное". Впрочем, его можно прочитать из реестра, только…

11. При чтении ключей с помощью reg.exe проблемы начинаются, если в названии ключа есть пробелы, поскольку reg.exe никогда не выводит на экран только значение – оно выводится всегда после названия ключа и типа значения. Так что, чтобы, например, прочитать hostname, надо писать
FOR /F "usebackq tokens=2*" %%I IN (REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "Hostname") DO SET "Hostname=%%~J"
но чтобы прочитать NV Hostname, надо писать уже
FOR /F "usebackq tokens=3*" %%I IN (REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname") DO SET "NVHostname=%%~J"
Интересно, что reg.exe был уже в XP (в NT4 и 2000 он был в Resource Kit). Но XP'шная команда в выводе REG QUERY разделяет поля tab'ом (символ с кодом 8). Поскольку в названиях ключей tab'ов не бывает, такой вывод намного проще парсить (однако, от шапки всё равно никак не избавиться). Примерно так:
FOR /F "usebackq tokens=2* delims=<tab>" %%I IN (REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "Hostname") DO SET "Hostname=%%~J"
(подчеркнутый <tab> в скрипте должен быть символом с кодом 8, а не в виде треугольных скобок и букв). В таком случае число после tokens= не зависит от количества пробелов в названии ключа.
@LogicDaemon-pubru
из моего старого блога, 11 янв. 2016 г. командная строка в Windows – минное поле У меня есть подозрение, что в недрах Microsoft есть специальная команда разработчиков, которая специально заботится, чтобы у всего, что связано с командной строкой Windows,…
Кстати, если читаете путь из реестра, молитесь, чтобы там не было международных символов. Обнаружить их в командной строке – нереально, а выдаются reg'ом они в кодировке ANSI (а cmd.exe работает в OEM), поэтому при наличии не-ASCII символов, при попытке совершить chdir (или что угодно другое) пакетный файл будет поджидать облом.

12. Копирование папок – эпичный пример фейла (или win'а команды из первого абзаца?). Типичная команда для копирования папки в Windows:
xcopy s:\WindowsImageBackup r:\WindowsImageBackup /E /I /Q /G /H /R /K /O /Y /B /J
смогли с первого раза посчитать количество ключей? Ну ок, наверное, не все они требуются. Вот необходимый минимум, чтобы xcopy не остановился где-нибудь посередине и не задал тупой вопрос, ожидая интерактивного ответа: /E /I /G /H /R /Y. Да, кстати, Вы использовали copy? Облом будет поджидать незаметно :) Ключи copy указываются перед аргументами откуда и куда, xcopy – после аргументов.

13. %comspec% /U /C "ECHO 123>test.txt" записывает файл в UNICODE.
%comspec% /U /C "FOR /F %A IN (test.txt) DO ECHO %A" не может прочитать его!
Вы пользуетесь putty? Тогда у меня для вас штука, которая умеет копировать настройки из одной сессии в другие (например, поменяли шрифт в Default Session, и желаете применить его во всех остальных).

https://github.com/LogicDaemon/PersonalUseScripts/blob/master/misc/copy_putty_settings.ahk

--
En: For anyone who use putty, I've wrote a GUI utility to copy settings between sessions. Useful, for example, for updating font or term type in all sessions.
Questions welcome.
latest_python3.py
11.6 KB
Давно хотел запилить, и вот оно.
github.com/.../latest_python3.py

Скрипт находит последнюю версию python на официальном сайте, опционально: скачивает, в linux собирает из исходника, и ставит в $HOME/.local, а в windows просто скачивает exe и устанавливает пользователю.

Если запустить без параметров, выведется краткая справка; если с -h или --help — подробная

Перед запуском, установите lxml:
pip install lxml packaging
Я сделал свой первый python3 asyncio скрипт. Сравнивает два каталога, и для одинаковых файлов (расположенных по одинаковому под-пути) устанавливает дату более старого.

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

set_older_datetimes_for_same_files.py

P.S. asyncio – какой-то ужас. Легче сразу на go писать.
concurrency в python:

* Threading: работает как ожидается, внедрять можно постепенно в отдельные модули, остальная программа может про это вообще ничего не знать. Но отдельный тред создаётся на каждый чих, либо надо писать собственный пул-менеджер.
* Concurrent.futures: только для простых задач или для одной процедуры (main?), т. к. если таска в pool'е, и попытается запустить другую таску, может случиться дэдлок прямо в этом месте (если пул уже будет заполнен)
* asyncio (async, await): вроде лишен этих недостатков, но требует полного переписывания всего кода. "Постепенное" внедрение невозможно. Все синхронные примитивы, типа стандартного open(), все операции с файлами, все вызовы внешних библиотек, не поддерживающих asyncio, блокируют всю программу целиком.
Коллега посоветовал gevent.
Выглядит хорошо.

from gevent import monkey; monkey.patch_all()
Нашел для python модуль logicmin, минимизирующий логику по таблицам истинности; причем в моём случае оптимизированная логика используется, чтобы объяснить, почему то или иное состояние приводит к определённому действию сервера.

Вроде, то же самое умеет pyeda, но logicmin явно меньше и проще.
С прискорбием узнал, что KC Softwares закрывается :-( SUMo и DUMo больше не работают, и больше никогда работать не будут.

Замены им нет, пока (временно) начал использовать https://github.com/NexovaDev/UpdateHub, но он из нескольких сотен программ видит пару десятков :-(
Скрипт для бэкапа почты из IMAP4. И бойлерплейт для питонячих скриптов с CLI и чтением конфига (причем параметры конфигурации в CLI и конфиге идентичны, их не надо указывать дважды)
https://t.me/logicdaemon_pub/6
Интересная Copilot-like дополнялка-рефакторилка https://marketplace.visualstudio.com/items?itemName=Morph.rift-vscode https://github.com/morph-labs/rift
Есть фичи, которых нет в Copilot, но нет автоподбора контекста из открытых и соседних файлов (который есть в Copilot).
Модель выбирается: можно использовать OpenAI-шное (если есть токен), но можно и локальные модели GPT4All и HuggingFace.
commit_message.py
20.4 KB
тут в пятницу и сегодня утром запилил генератор commit message по git diff-у, используя gpt4all (тестировал с mistral-7b-openorca.gguf2.Q4_0.gguf но может заработать и с другими моделями).