@LogicDaemon-pubru
5 subscribers
4 photos
8 files
16 links
Download Telegram
из моего старого блога, запись от 25 января 2012:

Только что в мануале wget'а (см. --strict-comments внизу) вычитал страшное про комментарии HTML.

Оказывается, комментарии в HTML рассматриваются как декларации SGML. Декларации определяются специальной разметкой, которая начинается с <! и заканчивается на >, навроде <!DOCTYPE …> (без пробелов после <!). И в ней могут быть комментарий между парой двойных дефисов --комментарий--.

Собственно HTML – это пустые декларации SGML, в которых кроме комментария больше ничего нет. Так что <!--блаблабла--> – годный комментарий, как и <!--раз-- --два-- >. Но <!--раз--два--> – нет! А <!------------> – годный комментарий, если количество дефисов делится на 4. Если нет, то комментарий SGML продолжается до следующего --. А потом (следующей) треугольной скобкой > должна быть закончена декларация, что может и не случиться и до конца документа. Именно по этой причине w3c пишет, что нельзя ставить 2 или больше дефиса подряд в комментарии.

Но силами Microsoft (Internet Explorer) большая часть HTML'щиков уверены, что комментарий в HTML – это что угодно между <!-- и -->. Из-за этого все популярные браузеры игнорируют спецификацию и интерпретируют комментарии так, как этого ожидает быдло :(
из моего старого блога, 30 июн. 2013 г

Скрипты AutoHotkey (.ahk) можно хранить и запускать в «обёртке» и с расширением .cmd. Обёртка добавляется в начало cmd файла, дальше идёт обычный AutoHotkey скрипт.

/*
FOR /F "usebackq tokens=2 delims==" %%I IN (`ftype AutoHotkeyScript`) DO CALL :GetFirstArg AutohotkeyExe %%I
%AutohotkeyExe% %0 %*
EXIT /B
:GetFirstArg
SET %1=%2
EXIT /B
*/


/* и */ обязательны.

Кодировка файла может быть любой, в которой нижняя таблица ASCII стандартная однобайтовая, т.е. можно UTF-8, ANSI, OEM, но нельзя UTF-16. BOM не мешает.
7-Zip params.png
10.8 KB
из моего старого блога, 13 мар. 2014 г



… WinRAR 5.0 по сравнению с 7-Zip. Оказалось, WinRAR и заметно быстрее, и (в данном случае) сжимает сильнее!

… в папке много сканированных документов (PDF и JPEG), … основной объём – гигантские (по 100Мб) таблицы xls …, причём в них нет картинок – только текст, числа и формулы. … много дубликатов.

7-Zip плохо сжимает уже сжатые данные (zip), и результирующий архив сильно меньше, если их предварительно распаковать и снова запаковать, но уже без сжатия (store). Так вот, все архивируемые od? файлы были таким способом перепакованы.

Первый RAR я сделал до перепаковки, результат – 1 623 835 434 байт (против 1 611 695 951 байт для перепакованных данных) – т.е. на 0.7% больше. 7-Zip же, при работе на распакованных данных, отстал на 7.7% (архив 7-Zip из перепакованных данных получился размером 1 735 865 084).

Время сжатия 7-Zip-ом – около 20 часов, WinRAR – 8 часов.
P.S. Параметры обоих были выбраны максимальными, почти без тонкой настройки. 7-Zip – Ultra, LZMA, 64Гб словарь; WinRAR – Best, 128MB словарь. LZMA2 со 128Мб словарём для 7-Zip выбирать пробовал, но в этом случае за ~ 30 часов он сжал только четверть всего объема.
из моего старого блога, 21 июн. 2014 г,

Дэвид Дойч. Структура реальности

Сегодня дочитал эту книгу. Теперь могу сказать точно, её должен прочитать любой, кто пытается объяснить окружающий мир, используя научный подход.

Для тех, кто считает, что что-либо понимает в философии, физике, математике, биологии, информатике, книга окажется весьма интересной. Для остальных, возможно, тоже.

Основная суть – объяснение окружающего мира на основе квантовой физики, принципа Тьюринга, теории Дарвина и философии Поппера.

Но не надо спешить, ибо намного интереснее, когда она даёт объяснения вопросам, разрешить которые читатель безуспешно пытался годами :)
из моего старого блога, 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.