из моего старого блога, запись от 25 января 2012:
Только что в мануале wget'а (см.
Оказывается, комментарии в HTML рассматриваются как декларации SGML. Декларации определяются специальной разметкой, которая начинается с
Собственно HTML – это пустые декларации SGML, в которых кроме комментария больше ничего нет. Так что
Но силами Microsoft (Internet Explorer) большая часть HTML'щиков уверены, что комментарий в HTML – это что угодно между
Только что в мануале wget'а (см.
--strict-comments
внизу) вычитал страшное про комментарии HTML.Оказывается, комментарии в HTML рассматриваются как декларации SGML. Декларации определяются специальной разметкой, которая начинается с
<!
и заканчивается на >
, навроде <!DOCTYPE …>
(без пробелов после <!
). И в ней могут быть комментарий между парой двойных дефисов --комментарий--
.Собственно HTML – это пустые декларации SGML, в которых кроме комментария больше ничего нет. Так что
<!--блаблабла-->
– годный комментарий, как и <!--раз-- --два-- >
. Но <!--раз--два-->
– нет! А <!------------>
– годный комментарий, если количество дефисов делится на 4. Если нет, то комментарий SGML продолжается до следующего --
. А потом (следующей) треугольной скобкой >
должна быть закончена декларация, что может и не случиться и до конца документа. Именно по этой причине w3c пишет, что нельзя ставить 2 или больше дефиса подряд в комментарии.Но силами Microsoft (Internet Explorer) большая часть HTML'щиков уверены, что комментарий в HTML – это что угодно между
<!--
и -->
. Из-за этого все популярные браузеры игнорируют спецификацию и интерпретируют комментарии так, как этого ожидает быдло :(www.gnu.org
Recursive Retrieval Options (GNU Wget 1.24.5 Manual)
Next: Recursive Accept/Reject Options, Previous: FTP Options, Up: Invoking [Contents][Index]
из моего старого блога, 30 июн. 2013 г
Скрипты AutoHotkey (.ahk) можно хранить и запускать в «обёртке» и с расширением
Кодировка файла может быть любой, в которой нижняя таблица ASCII стандартная однобайтовая, т.е. можно UTF-8, ANSI, OEM, но нельзя UTF-16. BOM не мешает.
Скрипты 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). Так вот, все архивируемые
Первый 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 часов.
… 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 будут слишком долго удерживать шину, и звуковая карта не будет успевать* отдавать данные при записи (будут пропуски) или получать при воспроизведении (будут паузы/щелчки/шум).
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.
, надо
Что ещё хуже –
2.
3.
4.
Чтобы заработало без пробела, надо писать
или
5.
(с точкой слитно; также работает
6. Если внутри блока
7.
8. Некоторые команды не меняют код ошибки
*
*
9. До Windows Vista не было предустановленной переменной среды, в которой было бы указано расположение
10. Узнать hostname – нетривиальная задача. Есть переменная
11. При чтении ключей с помощью
но чтобы прочитать
Интересно, что
(подчеркнутый
командная строка в 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 %%A4.
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,…
Кстати, если читаете путь из реестра, молитесь, чтобы там не было международных символов. Обнаружить их в командной строке – нереально, а выдаются
12. Копирование папок – эпичный пример фейла (или win'а команды из первого абзаца?). Типичная команда для копирования папки в Windows:
смогли с первого раза посчитать количество ключей? Ну ок, наверное, не все они требуются. Вот необходимый минимум, чтобы
13.
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? Тогда у меня для вас штука, которая умеет копировать настройки из одной сессии в другие (например, поменяли шрифт в
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.
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.
Коллеги прислали (bash's echo is broken)
https://youtu.be/lq98MM2ogBk
https://youtu.be/lq98MM2ogBk
YouTube
bash's echo command is broken
Bash's echo command is broken. You can't reliably print variable contents using echo.
This video explores how it's broken, and some things you can do to work around it.
There's even a demo of a bug in some other software caused by the strange behaviour of…
This video explores how it's broken, and some things you can do to work around it.
There's even a demo of a bug in some other software caused by the strange behaviour of…
latest_python3.py
11.6 KB
Давно хотел запилить, и вот оно.
github.com/.../latest_python3.py
Скрипт находит последнюю версию python на официальном сайте, опционально: скачивает, в linux собирает из исходника, и ставит в
Если запустить без параметров, выведется краткая справка; если с
Перед запуском, установите lxml:
github.com/.../latest_python3.py
Скрипт находит последнюю версию python на официальном сайте, опционально: скачивает, в linux собирает из исходника, и ставит в
$HOME/.local
, а в windows просто скачивает exe и устанавливает пользователю.Если запустить без параметров, выведется краткая справка; если с
-h
или --help
— подробнаяПеред запуском, установите lxml:
pip install lxml packaging
Я сделал свой первый python3 asyncio скрипт. Сравнивает два каталога, и для одинаковых файлов (расположенных по одинаковому под-пути) устанавливает дату более старого.
Нужен, чтобы восстановить даты файлов из бэкапа после
set_older_datetimes_for_same_files.py
P.S. asyncio – какой-то ужас. Легче сразу на go писать.
Нужен, чтобы восстановить даты файлов из бэкапа после
git checkout
, но только тех, которые не поменялись.set_older_datetimes_for_same_files.py
P.S. asyncio – какой-то ужас. Легче сразу на go писать.
GitHub
PersonalUseScripts/set_older_datetimes_for_same_files.py at master · LogicDaemon/PersonalUseScripts
scripts for my personal use. Nothing private, but barely useful for others - PersonalUseScripts/set_older_datetimes_for_same_files.py at master · LogicDaemon/PersonalUseScripts
concurrency в python:
*
*
*
*
Threading
: работает как ожидается, внедрять можно постепенно в отдельные модули, остальная программа может про это вообще ничего не знать. Но отдельный тред создаётся на каждый чих, либо надо писать собственный пул-менеджер.*
Concurrent.futures
: только для простых задач или для одной процедуры (main?), т. к. если таска в pool'е, и попытается запустить другую таску, может случиться дэдлок прямо в этом месте (если пул уже будет заполнен)*
asyncio
(async
, await
): вроде лишен этих недостатков, но требует полного переписывания всего кода. "Постепенное" внедрение невозможно. Все синхронные примитивы, типа стандартного open(), все операции с файлами, все вызовы внешних библиотек, не поддерживающих asyncio, блокируют всю программу целиком.Коллега посоветовал
Выглядит хорошо.
gevent
.Выглядит хорошо.
from gevent import monkey; monkey.patch_all()
Нашел для python модуль logicmin, минимизирующий логику по таблицам истинности; причем в моём случае оптимизированная логика используется, чтобы объяснить, почему то или иное состояние приводит к определённому действию сервера.
Вроде, то же самое умеет pyeda, но logicmin явно меньше и проще.
Вроде, то же самое умеет pyeda, но logicmin явно меньше и проще.
GitHub
GitHub - dreylago/logicmin: Logic Minimization in Python
Logic Minimization in Python. Contribute to dreylago/logicmin development by creating an account on GitHub.
С прискорбием узнал, что KC Softwares закрывается :-( SUMo и DUMo больше не работают, и больше никогда работать не будут.
Замены им нет, пока (временно) начал использовать https://github.com/NexovaDev/UpdateHub, но он из нескольких сотен программ видит пару десятков :-(
Замены им нет, пока (временно) начал использовать https://github.com/NexovaDev/UpdateHub, но он из нескольких сотен программ видит пару десятков :-(
GitHub
GitHub - NexovaDev/UpdateHub: UpdateHub is an app that simplifies updating software on your computer. A user-friendly interface…
UpdateHub is an app that simplifies updating software on your computer. A user-friendly interface allows you to quickly check for and install available updates for your operating system and applica...
забавное интервью. Тем, насколько я согласен с Bobuk-ом, и не согласен с интервьюером https://youtu.be/Ro1T-e0455g, особенно в последних ~30 минутах.
YouTube
ЧТНП | Григорий Бакунов (Bobuk) о развитии ИИ, вреде аутсорса и роли в проектах Яндекса
Григорий Бакунов aka Bobuk — известная фигура в IT-сообществе, топ-менеджер Яндекса в прошлом и IT-предприниматель в настоящем. В подкасте поговорили не о жизни и карьере Bobuk’а, а узнали его мнение об удаленке и двух работах, великом предназначении программистов…
Скрипт для бэкапа почты из IMAP4. И бойлерплейт для питонячих скриптов с CLI и чтением конфига (причем параметры конфигурации в CLI и конфиге идентичны, их не надо указывать дважды)
https://t.me/logicdaemon_pub/6
https://t.me/logicdaemon_pub/6
Telegram
LogicDaemon-pub
Just wrote a simple IMAP4 backup script, which is mostly a boilerplate of a CLI with a config file, which shows expected locations of the config when invoked with --help.
To use with gmail, create app password first in https://myaccount.google.com/apppasswords
To use with gmail, create app password first in https://myaccount.google.com/apppasswords
Интересная Copilot-like дополнялка-рефакторилка https://marketplace.visualstudio.com/items?itemName=Morph.rift-vscode https://github.com/morph-labs/rift
Есть фичи, которых нет в Copilot, но нет автоподбора контекста из открытых и соседних файлов (который есть в Copilot).
Модель выбирается: можно использовать OpenAI-шное (если есть токен), но можно и локальные модели GPT4All и HuggingFace.
Есть фичи, которых нет в Copilot, но нет автоподбора контекста из открытых и соседних файлов (который есть в Copilot).
Модель выбирается: можно использовать OpenAI-шное (если есть токен), но можно и локальные модели GPT4All и HuggingFace.