October 2025
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
|
1/24/23 04:25 am
Перепрошивка полуокирпиченного Nokia X2 Lumia (RM-1013)
В принципе делал все по этой видеоинструкции:
Прямая ссылкаНо с некоторыми оговорками, видимо потому, что телефон был не совсем "кирпич", н наполовину, т.е. заставку Nokia показывал, но дальше фигвам: 1. Ставим драйвер из каталога Driver в архиве QPST (ссылки на софт и прошивку будут ниже) 2. Ставим сам QPST 3. Ставим Care Suite For Store 4. Качаем прошивку 5. Пытаемся перепрошить стандартным способом с помощью Care Suite (есть инструкция на 4PDA) 6. Или не получится, или на этом этапе телефон окирпичится до такого состояния, как показано на видео. 7. Делаем все по видеоинструкции. Софт и прошивкаПоскольку, на 4PDA половина ссылок битая, а половина вообще ведут на сраный фашистский Хуяндекс, я весь набор переложил на православную Мегу: - Care Suite For Store 5.6.134.1513- QPST- ПрошивкаСсылки- Тема на 4PDA- Инструкция по перепрошивке с помощью Care Suite (копия)- Копия видеоинструкции (MKV)Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/01/24/pereproshivka-poluokirpichennogo-nokia-x2-lumia-rm-1013/
1/23/23 06:45 am
Переключение кодировки вручную в новом Firefox
В прошлой заметке (копия), где я писал и о том, что дебильные менеджеры Mozilla, какого-то полового органа отключили выбор кодировки вручную, я немного ошибся, написав, что соответствующий задаче плагин пока никто не удосужился написать, аноним подсказал, что плагин таки написали:
Скриншот Ссылка на страницу плагинаOverride Text EncodingПроверил на Firefox 109.0 x64 Windows, работает! Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/01/23/pereklyuchenie-kodirovki-vruchnuyu-v-novom-firefox/
1/22/23 06:08 am
Китайская кодировка, китайский документ, расшифровка, Firefox
И минутка НЕНАВИСТИ в конце, ну как же без нее.
ПреамбулаПривезли клиенту "мозги" для станка, ЧСХ, китайские, но доехали они почему-то без документации, т.е. простая серая коробочка с девайсом, напоминающим роутер. Два порта, один по специальному кабелю соединяется со станком, во второй - вставляется обычный Ethernet-кабель, который идет на управляющий комп. На "мозгах" три кнопки, как потом выяснилось - старт, экстренный останов и самотест. Надписи иероглифами. Ну ладно, с кнопками разобрались методом тыка. А вот управляющая софтина оказалась хитроумной, менюшки на английском, а вот хелпа нет, а последовательность команд для резки задается на js-подобном языке, сильно урезанном, только по нему хелпа тоже нет. Ну хуле делать, пишу производителю шайтан-машины в почту, мол, пришлите мануал. "Да не вопрос, дорогой уважаемый клиент, айн момент", отвечает мне добрый китайский менеджер, и через время малое, прилетает мне мануал в виде текстового файла и кучи примеров, там даже изящная розочка была, как ее на металле вырезать... На китайском. Но это полбеды, выглядит этот китайский примерно так: ÖØÐÂÉèÖöÔÏó То, что это не Юникодовская кодировка, стало понятно сразу. Ну иначе тот же Notepad++ прекрасно бы все показал иероглифами, а дальше уж дело только за гугль-переводчиком. Пролюбившись целый день с перекодировщиками, китайскими кодировками, задействовав даже Far Manager с его довольно большой базой кодировок, я не получил ровным счетом ничего. Минутка любви к FirefoxНаконец, пришла идея, а если текстовый файл переименовать в *.html и скормить его Firefox'у, у него же была довольно неплохая внутренняя определялка кодировок, повыбираю из списка, или же он сам определит. Определил сам, наконец невнятные кракозяблы ÖØÐÂÉèÖöÔÏó превратились во вполне внятные иероглифы: 重新设置对象 , что значит всего лишь сбросить объект. Ну а дальше немного смекалки, экспериментов, гугль-переводчика, и ТЕЛЕМАРКЕТ! Минутка ненависти к FirefoxРешил я посмотреть какая же все-таки кодировка у файла. И... не нашел меню с выбором кодировок вручную. Оказывается, разкозлоработчики Firefox просто тупо убрали возможность выбора кодировки страницы вручную из браузера. Кодировка текста больше недоступна в меню FirefoxКакой пиздец! А если ваше поделие таки неправильно кодировку определит, прикажете ехать в вашу штаб-квартиру и ебать вас раскаленным урановым ломом? Вот жеж бля, от кого не ожидал подставы, дык от Mozilla. И вообще непонятно, нахера так делать? Как посмотреть кодировку страницы1. Надо включить Панель меню2. Зайти в Инструменты --> Сведения о странице (или нажать комбинацию клавиш CTRL+I) 3. В сведениях о странице будет отображена и информация о кодировке: Как вручную поменять кодировку страницы в FirefoxВ последних версиях пока никак, соответствующий задаче плагин пока никто не удосужился написать, может быть Firefox идеально определяет кодировки, а может мозилловцы пока не столкнулись с багом, так что если надо в браузере вручную покрутить кодировки - придется скачивать старые версии, например: С PortableApps.com (версия 88.1), установщик БэкапДля выбора кодировки вручную, необходимо включить меню, а далее выбрать: Вид --> Кодировка текста, и далее выбрать нужную кодировку: Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2023/01/22/kitajskaya-kodirovka-kitajskij-dokument-rasshifrovka-firefox/
12/19/22 08:26 am
Shred для Windows, перевод краткой справки и эксперимент с параметрами программы
ПреамбулаЧто такое shred ? Это опенсорсный "уничтожитель" файлов, т.е. программа затирает (забивает случайными данными) файл на диске, чтобы невозможно было его восстановить средствами восстановления файлов, например, чтобы окончательно удалить конфиденциальные данные, доступ к которым может получить злоумышленник. shred входит во многие дистрибутивы Линукс, но есть версии и под другие ОС. Тут буду экспериментировать и описывать версию для windows. Друзья попросили перевести на русский краткую справку, а заодно уж я поэкспериментировал с параметрами, чтобы подобрать оптимальные для повседневного использования. Внимание! Идеальный уничтожитель данных, во всяком случае, с HDD-дисков, это молоток, с последующей обработкой диска в костре на березовых дровах, а всего оставшегося в микроволновке. Перевод краткой справкиИспользование: shred.exe [ОПЦИИ] ФАЙЛ1 [ФАЙЛ2 ФАЙЛ3 ...]
Многократное перезаписывание указанных ФАЙЛОВ, для затруднения восстановления данных даже очень дорогим аппаратным обеспечением.
Обязательные аргументы для длинных опций обязательны и для коротких опций. -f, --force изменить разрешения файловой системы, чтобы разрешить запись, если это необходимо -n, --iterations=N Перезаписать N раз вместо значения по умолчанию (25) -s, --size=N затереть указанное количество байтов (допускаются такие суффиксы, как K, M, G) -u, --remove обрезать и удалить файл после перезаписи -v, --verbose показать прогресс -x, --exact не округлять размеры файлов до следующего полного блока; это значение по умолчанию для нестандартных файлов (В Windows он все файлы округляет до полного блока, т.е. кластера на диске - Tolik) -z, --zero добавить окончательную перезапись нулями, чтобы скрыть затирание файла --help показать эту справку и выйти --version вывести информацию о версии и выйти
Если в качестве файла указан -, затирается стандартный вывод.
Удалить ФАЙЛ(ы), если указан --remove (-u). По умолчанию не удалять файлы, потому что обычно работают с файлами устройств, такими как /dev/hda, и эти файлы обычно не следует удалять. При работе с обычными файлами большинство людей используют параметр --remove. (Лучше так не делать, ниже обьясню почему)
ВНИМАНИЕ: обратите внимание, что shred основывается на очень важном допущении: что файловая система перезаписывает данные на месте. Это традиционный способ работы, но многие современные файловые системы не удовлетворяют этому предположению.
Ниже приведены примеры файловых систем, в которых уничтожение файлов неэффективно:
* лог-структурированные или журналируемые файловые системы, такие как поставляемые с AIX и Solaris (а также JFS, ReiserFS, XFS, Ext3 и т. д.)
* файловые системы, которые записывают избыточные данные и продолжают работать даже в случае сбоя некоторых операций записи, например, файловые системы на основе RAID
* файловые системы, которые делают моментальные снимки, такие как NFS-сервер Network Appliance
* файловые системы, кэширующие во временных местах, такие как клиенты NFS версии 3
* сжатые файловые системы
Кроме того, резервные копии файловой системы и удаленные зеркала могут содержать копии файла, которые невозможно удалить, что позволит позже восстановить затертый файл.
Сообщайте об ошибках по адресу <bug-coreutils@gnu.org>.
Вместо ФАЙЛ можно использовать маску файлов, если вы хотите затереть группу файлов по маске, например, shred *.txt уничтожит все текстовые файлы в каталоге - Tolik
Разрешения файлов обрабатываются нормально, т.е., например, *.htm и *.html воспринимаются, как разные файлы.- Tolik Эксперименты, заметки и мыслиВнимание! Под рукой у меня нет лаборатории и оборудования разных там контор, тем более, проводил я их на скорую руку и довольно дилетантски, так что на абсолютную истину не претендую. Используйте все нижесказанное на свой страх, риск и хвост! Условия: - Windows 7 Professional x64 - SATA HDD Seagate, 500 GB - FS: NTFS - форк shred (ниже дам ссылку) Проверял работу затиралки WinHex'ом 19.9[ https://www.x-ways.net/winhex/] x64, не самым свежим, но даже лицензионным (мне его кто-то подарил), на самом деле, следов мелких файлов я так и не обнаружил, так что сразу говорю, почти все тесты shred прошел, и мне лень делать скрины с WinHex'а, а теперь о параметрах: Внимание! Не советую использовать опцию -u , т.е. удаление файла. shred его просто удалит, не поменяв ему имя на случайное, как это делают многие "затиралки", потому, если вы затираете файл, например, с именем, путин бомба взрыв бомбас.doc , то понятно кто хоть содержания файла и не увидит, но выводы сделает. Так что после shred файл лучше обработать напильником, т.е. переименовать его случайным набором символов, или неслучайным, например, мой_кот.jpg , а после этого удалять штатными средствами ОС. Количество итераций: т.е. опция -n <число> или --iterations=<число> На ваше усмотрение, я не заметил разницы в WinHex'е между 3, которые выставил я, и 25 по умолчанию, но стоит ли лишний раз насиловать HDD или SSD перезаписями... Не знаю. Дозапись файла: опция -s <число> (--size=<число>) Дозаписывает файл числом байт (случайных). Если использовать после числа без пробела K M или G , то, соответственно -кило -мега или -гига байт. На мой взгляд, это излишне, найдут у вас в директории C:\DOC файл мой_кот.jpg размером в 5Гб и удивятся. Но вообще можно, shred с файловой системой обращается аккуратно и другие файлы не затрет. Забить все нолями: Опция -z ( --zero ) На последней итерации затирания, shred перезаписывает весь файл символом с кодом 0 . На мой взгляд, довольно полезная опция, при использовании рекомендаций по переименованию файла и удалению, после затирания. "А хрен знает, товарищ майор, что это у меня за файл был с названием dfghuyty.13 в D:\DOC , вирус, наверное." (Не)дописывать до кластера: Опция -x В Linux'овой версии shred эта опция включает не дописывание до кластера, самое странное, что в Windows-версии наоборот, отключает. Небольшое пояснение. В стандартных файловых системах файл занимает 1 кластер на диске. Т.е. файл, какого бы размера он не был, займет, как минимум 1 кластер. Размер кластера устанавливается настройками ОС, также его можно изменить при форматировании (иногда). Например, кластер в NTFS при стандартном форматировании равен 4Кб, т.е. 4096 байт, потому, даже если файл фактически занимает 4 байта, например, текстовый файл с содержимым 1234 , он все равно будет занимать 1 кластер. Если файл больше одного кластера, то автоматически он займет весь следующий, даже если в файле 4096+1 байт, и т.д. Если (в Windows-версии shred ) применить опцию -x к файлу 3.txt , который содержит 4 байта (текст 1234 , например), то shred и запишет 4 случайных байта. Мое мнение: опцию -x не использовать, пусть уж затирает кластер целиком. Оптимальный вариант опций для мелких повседневных задач (затереть небольшой файл): shred -n 3 -z <file_or_mask> где <file_or_mask> - файл или маска файлов. Позже напишу батник, который будет затертые файлы рандомно переименовывать и удалять. Скачать shred для WindowsС Mega.NZЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/12/19/shred-dlya-windows-perevod-kratkoj-spravki-i-eksperiment-s-parametrami-programmy/
12/7/22 06:02 pm
Красивые часы на любой дисплей
Припер шеф в офис телевизор, новый здоровый плоский, чтоб клиентам МУЗ-ТВ или какое другое камеди показывать, мол, пусть будет, как в лучших домах города. Сразу выяснилось, что коаксиал в офисе есть, но это оказалось не кабельное, а какая-то неведомая фигня, которая, в общем, даже неведомое показывать отказалась, хотя по тестам там даже какой-то сигнал есть, но с ним я ночью поэкспериментирую, вдруг какая Бухта Кэндл или Криполе Чудес после полуночи передается.
Оказалось, железячка не венде (какой-то окончательно порезанной и изуродованной 10-ке), так что довольно быстро научил его показывать из расшаренной Самбы видосы, но, поскольку там одни ужастики 80-х ("Извне", "Реаниматор", "Фантомы" и.д.), то для клиентов это не включишь, а за ютупом следить надо, вдруг посреди котиков Невзоров вылезет.
В общем, хуй с ним, сказал начальник, и попросил Большие Красивые Часы на весь экран.
Оказалось, что после небольшого шаманства, железке можно скрамливать неподписанные экзешники, и заливать все что хочешь, на доступный пользователю раздел SSD.
Что-ж, сказал я... И немедленно выпил. А потом сделал часы (ну как сделал, сконвертировал в экзешник(и)).
 Clock_1.exe - часы в стандартном окне (с кнопками развернуть, свернуть и закрыть) Clock_Noborder.exe - часы в стандартном окне без заголовка, закрываются ALT+F4 или по щелчку правой кнопкой мыши, выпадет меню с пунктом ExitClock_Fullscreen.exe - часы на полный экран без заголовка, закрываются аналогично предыдущему варианту. Идеальны для стационарного показа на мониторе, телевизоре, старом смартфоне под винду или информационном киоске. swf\Clock_1.swf - оригинал программы. Скачать с Mega.NZЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/12/07/krasivye-chasy-na-lyuboj-displej/
12/5/22 12:27 am
Transren
Translit Renamer - программа, которая заменяет русские буквы в именах файлов на латинские, т.е. транслитерирует имена файлов и каталогов. v 0.0.1b (L) ChaosSoftware 2022.
Использование: transren.exe <-h>|<-m <mask> и/или <-t>>[-d] [-s]
-h - эта помощь
-m <mask> - Маска <mask> , маска для файлов, которые нужно переименовать
-t - переименовать каталоги (по маске каталоги не ищет)
[-d] <directory> - Стартовый каталог. Если не указан, используется текущий каталог.
[-s] - включить в поиск подкаталоги
[-f] - только поиск, показывает файлы для переименования
Примеры:
transren.exe -m *.html - транслитерировать *.html в текущем каталоге
transren.exe -t - переименовать подкаталоги в текущем каталоге
transren.exe -m *.html -s - переименовать *.html в текущей директории и всех подкаталогах
transren.exe -m *.* -s -t - транслитерировать все файлы и все поддиректории в текущей директории
transren.exe -m *.html -d D:\DOC\ - транслитерировать файлы *.html в каталоге D:\DOC
Если файл существует, программа спросит, заменить ли его. Если каталог существует, программа его пропустит.
Скриншоты

Как сделалБыла у меня для этих целей программулина на VB 6.0, но за давностью лет проебалась, вместе с исходниками. Пришлось с ноля переписывать на Трупопаскале FreePascal, в принципе, как написаны основные части, я уже рассказал, по тегу pascal ( копия на LJR) Зато не требует за собой таскать framework и кучу библиотек. Системные требования+ 64 Мб ОП + 800 Kb HDD + OS: Windows XP - Windows 11. СкачатьЭкзешникИнсталлятор (распаковывается в %WINDIR% )ZIP-архивИсходникиНа GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/12/05/transren/
12/3/22 01:39 am
Lazarus: Crt, WinCrt, русский язык и нажатие клавиши в консоли.
Понадобилось сделать что-то типа такого:
Файл уже существует. Заменить? [Y/N]
Вспомнил, что в Турбопаскале была функция ReadKey из модуля Crt , а вдруг и во FreePascal есть?
Есть, но модуль Crt делает глюк русскому языку:
program TestCrt;
uses Crt;
var Ch:char;
begin
WriteLn('Нажмите любую клавишу...');
Ch:=ReadKey;
end.
 Ладно, пробуем заменить Crt на WinCrt . Глюк с русским языком пропал, но функция ReadKey на нажатие клавиш не реагирует, да пиздец, еб твою мать! В общем, долго плевался, реализовал через TKeyEvent из модуля Keyboard : uses SysUtils,Keyboard;
function Ask(FilePath:UnicodeString):boolean;
var K: TKeyEvent;
KS:String;
begin
WriteLn ('File ', FilePath, ' is exists! Replace file? [Y/N]');
InitKeyBoard;
while true do begin
K:=GetKeyEvent;
K:=TranslateKeyEvent(K);
KS:=KeyEventToString(K);
if (KS='Y') or (KS='y') then begin DoneKeyBoard; exit(true); end;
if (KS='N') or (KS='n') then begin DoneKeyBoard; exit(false); end;
end;
DoneKeyBoard;
exit(false);
end; Исходник на PasteBinЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/12/03/lazarus-crt-wincrt-russkij-yazyk-i-nazhatie-klavishi-v-konsoli/
12/2/22 02:22 am
Lazarus, сортировка TStringList.
ПреамбулаИногда список строк ( TStringList ) требуется сортировать, что, как бы, понятно. Но во Freepascal сортировка устроена довольно странно, в C# у аналогичного класса из коробки несколько больше возможностей, во всяком случае, можно поменять направление, по возрастанию или по убыванию. С хитрыми сортировками, конечно, тоже вылезает нетривиальщина, но на то они и хитрые сортировки. Тестовые спискиДля начала сформируем тестовые списки, для русского и английского языков. Там код тривиален, потому не буду загружать заметку, ссылки на PasteBin: Тестовый список для английского языкаТестовый список для русского языкаЗаодно уж и выведем списки в их изначальном виде: Стандартная сортировкаОна же единственная из коробки, является стандартной сортировкой по возрастанию, т.е. список сортируется от меньшего к большему, а об алгоритме будет ниже. Вызов функции простой: lstTest.Sort; Пробуем. Выводим список на экран: WriteLn('Сортировка по возрастанию (по-умолчанию, логическая):'); i:=0; while i < lstTest.Count do begin WriteLn(lstTest[i]); inc(i); end;
Writeln(); WriteLn('Press Enter...'); ReadLn(); Результат:  Как обычно, с поддержкой русского язкы все весело, но чинить эту поддержку в данной заметке не буду. Кому сильно надо - пишите. Стандартный алгоритм сравнения строк во freepascalАлгоритм: 1. Строки сравниваются посимвольно. Например, в словах parrot и puppy первые символы ( p и p ) равны, а далее a меньше u , т.е u в кодовой таблице находится ниже, чем a . 2. На этом сравнение прекращается, строка puppy больше чем parrot . 3. Если начальные символы строк совпадают, то в дело вступает длина, чем строка длиннее, тем она больше, поэтому, зависимая от центра Каталония, все еще больше, чем кот, который гуляет сам по себе: program test;
var
S1:string;
S2:string;
begin
S1:='cat';
S2:='catalonia';
if S1 < S2 then Writeln ('S1 (',S1,') < S2 (',S2,')' );
if S1 = S2 then Writeln ('S1 (',S1,') = S2 (',S2,')' );
if S1 > S2 then Writeln ('S1 (',S1,') > S2 (',S2,')' );
Readln();
end.
Вывод: S1 (cat) < S2 (catalonia) Что, конечно, печально, потому что кот свободнее Каталонии, и явно больше в этом смысле. Пользовательские функции сортировкиОграничение, накладываемое одной функцией сортировки в комплекте класса TStringList легко решается тем, что можно подключить любую пользовательскую сортировку ссылкой на внешнюю функцию. Для этого надо установить пользовательскую функцию сортировки, таким вот образом: lstTest.CustomSort(@MySort); где MySort - имя вашей функции сортировки. Естественно, она должна быть заранее создана, чтобы все откомпилировалось и заработало. Не забудьте про символ @ перед именем функции, в Delphi не надо было его указывать, компилятор сам знал, где вместо имени функции вставить ссылку на ее адрес, в freepascal это надо указывать явно.Формат функции следующий: MySort(List: TStringList; Index1, Index2: Integer): Integer; Т.е. на входе нужна переменная типа TStringList и две переменные типа Integer , для индексов строк в списке, функция должна возвращать значение типа Integer : 1 - Если строка Index1 > Index2 0 - Если строки равны -1 - Если строка Index1 < Index2 Конечно, по мнению пользовательского алгоритма сортировки. Например, можем повторить стандартный метод сортировки: function SortByAsc(List: TStringList; Index1, Index2: Integer): Integer;
begin
if List[Index1]>List[Index2] then
begin
Result := 1;
Exit;
end;
if List[Index1]=List[Index2]
then Result := 0
else Result := -1;
end;
 Внезапно, починился русский язкы :) Сортировка по убываниюfunction SortByDesc(List: TStringList; Index1, Index2: Integer): Integer;
begin
if List[Index1]<List[Index2] then
begin
Result := 1;
Exit;
end;
if List[Index1]=List[Index2]
then Result := 0
else Result := -1;
end;
Вообще просто, достаточно заменить знак > на < в операторе сравнения. Другие пользовательские сортировкиВозможности пользовательских сортировок не ограничены практически ничем. Покажу, как обычно, самое простое - сортировка строк по длине. Сортировка по возрастанию: function SortByLenAsc(List: TStringList; Index1, Index2: Integer): Integer;
begin
if Length(List[Index1])>Length(List[Index2]) then
begin
Result := 1;
Exit;
end;
if Length(List[Index1])=Length(List[Index2])
then Result := 0
else Result := -1;
end;
Т.е. просто применяем функцию Length в операторе сравнения: Length(List[Index1])  Тот же вариант, но по убыванию: function SortByLenDesc(List: TStringList; Index1, Index2: Integer): Integer;
begin
if Length(List[Index1])<Length(List[Index2]) then
begin
Result := 1;
Exit;
end;
if Length(List[Index1])=Length(List[Index2])
then Result := 0
else Result := -1;
end;
Тестовые программыПример для английского языка на GitHubПример для русского языка на GitHubПо мотивамОбсуждения на Исходниках, но более подробнее и лучше у меня. Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/12/02/lazarus-sortirovka-tstringlist/
11/28/22 02:31 pm
Lazarus. Поддержка Unicode в консоли Windows.
Продолжаем бодаться с русским языком в консоли (копия).
Ну не может же быть так, что виндовая консоль и Unicode (UTF-8) не поддерживает, подумал я. У меня и функции, которые, собственно, в программе нужны, UTF8 требуют, и с русским языком, если исходник не в UTF-8 работают криво, и в документации по Lazarus написано, что он поддерживает вывод на консоль в UTF-8, и в документации по винде написано, что она тоже нежно любит UTF-8, хотя может и в OEM(которая CP866).
Хинт оказался небольшим, неочевидным, и вообще был обнаружен чисто случайно, кодировку исходника надо поменять на на CP866, как я делал по ссылке выше, а на UTF-8 с BOM!
И нигде в документации (не в виндовой, не в Лазарувской) об этом не сказано, ну или закопано в такие бездны Варпа, что не докопался.
До (исходник в UTF-8):
 После (исходник в UTF-8 с BOM):  program Project1;
begin
WrileLn('Какая-то фигня с русскими буквами');
WrileLn('А, уже не фигня');
Readln();
end. Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/28/lazarus-podderzhka-unicode-v-konsoli-windows/
11/27/22 12:04 am
Lazarus, встроенный парсер командной строки.
ПреамбулаВ Lazarus есть довольно неплохой парсер командной строки, который (почти) работает из коробки. Для его использования нужно создать приложение на базе класса TCustomApplication , который обладает таким функционалом. Готовый шаблон проекта имеется в комплекте. Проект --> Создать проект... и в появившемся окне выбрать тип проекта Консольное приложение:  Можно ввести параметры для генерации кода:  Основной код приложения размещается в процедуре DoRun , например, в procedure TMyApplication.DoRun; Решил расширить пример с поиском файла по маске ( копия), заодно поэкспериментировать с парсером командной строки. Параметры будут такие: Использование: smallfinder.exe <аргументы> -h - эта помощь -m <маска> - маска файла для поиска. Обязательный параметр -d <директория> - Начальняя директория, если параметр не указан, используется текущая. -s - включить в поиск подкаталоги Анализ параметров командной строкиПримечание: весь код в процедуре TSmallfinder.DoRun . Почему-то способ проверки из документации, случая, когда параметров нет вообще, у меня сработал криво, так что пришлось вспоминать более старый: // check if no parameters - способ из документации нихуя не сработал
if ParamCount=0 then begin
WriteHelp;
Terminate;
Exit;
end; Но далее все вроде бы пошло как надо, единственное, что параметры регистрозависимые (т.е. -d и -D программа воспринимает как разные параметры), пока не стал с этим разбираться, может после, если сильно надо будет. Длинные имена параметров не использовал, только короткие. Вывод помощи: //help
if HasOption('h', '') then begin
WriteHelp;
Terminate;
Exit;
end;
Процедуру WriteHelp можно создать при создании нового проекта, а потом только запомнить, примерно так: procedure TSmallfinder.WriteHelp;
begin
writeln('Usage: ',ExtractFileName(ExeName), ' <arguments>');
WriteLn('-h - this help');
WriteLn('-m <mask> - file mask for search. Parameter must be!');
WriteLn('-d <directory> - start directory. If not, use current dir.');
WriteLn('-s - include subdirs');
end;
Маска файла: //mask
if HasOption('m','') then begin
Mask:=GetOptionValue('m','');
if Mask = '' then begin
WriteHelp;
Terminate;
Exit;
end;
end;
Стартовый каталог: //start directory
StartDir:=GetOptionValue('d','');
if StartDir='' then begin
StartDir:=GetCurrentDir();
end;
Искать в подкаталогах: //Include subdirs
IncludeSubdirs:=HasOption('s','');
Ну и сам процесс поиска, до кучи: WriteLn('Start directory: ',StartDir);
lstFiles := TStringList.Create;
FindAllFiles(lstFiles, StartDir, Mask, IncludeSubdirs);
i:=0;
while i < lstFiles.Count do begin
WriteLn(lstFiles[i]);
inc(i);
end;
lstFiles.Free();
Естественно, все нужные переменные перечисляем в секции var процедуры TSmallfinder.DoRun var
Mask, StartDir:string;
IncludeSubdirs:boolean;
i:LongInt;
lstFiles:TStringList; Примеры работыsmallfinder.exe -m *.exe -d C:\Windows  smallfinder.exe -m *.exe -d C:\Windows -s  smallfinder.exe -m *.exe СсылкиМануал по обработке параметров командной строкиПример целиком на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/27/lazarus-vstroennyj-parser-komandnoj-stroki/
11/26/22 03:45 am
Lazarus: Транслит строки (в консоли)
1. Понадобятся модули regexpr и fgl :
uses regexpr, fgl;
regexpr нужен для небольшой оптимизации, a fgl - для создания аналога словаря (Dictionary ).
2. Создаем тип для будущего словаря:
type
TDictTrans=class(specialize TFPGMap<string, string>);
Документация по TFPGMap
3. Сделаем функцию для транслитерации, с одним параметром, входной строкой с русскими буквами:
function Translit(Str:string):string; //тут будет код end;
4. Заводим внутренние переменные функции:
var Regex:TRegExpr; Dict:TDictTrans; Ch,oStr,oTrans:string; I:LongInt;
Regex - экземпляр класса для работы с регулярным выражением.
Dict - словарь для транслитерации.
Ch - транслитерируемый символ
oStr - выходная строка
oTrans - сюда будем возвращать результат транслита отдельного символа.
I - счетчик цикла, в котором будем анализировать строку.
Небольшая оптимизацияСоздаем новое регулярное выражение для кириллицы (и пробела) и проверяем входную строку на наличие русских букв. Если их нет - возвращаем исходную строку и выходим из функции: Regex:=TRegExpr.Create;
Regex.Expression:='[А-Я]|[а-я]|\s';
if not Regex.Exec(Str) then begin
exit(Str);
end;
5. Заполняем словарь (транслит взят из старого армейского учебника времен СССР, можете сделать свой): Dict:=TDictTrans.Create; Dict.Add(' ','_'); Dict.Add('А','A'); Dict.Add('а','a'); ... Dict.Add('Я','JA'); Dict.Add('я','ja'); Словарь целиком на PasteBin6. Инициализируем переменные, используемые в цикле: Ch:=''; oStr:=''; 7. Заводим цикл for , нумерация символов в строке идет с 1 , длина строки получается функцией Length(Str) : for I:=1 to Length(Str) do begin ... end; 8. В цикле получаем символ из строки: Ch:=Copy(Str,I,1); 9. Пробуем получить данные из словаря по ключу, которым является русская буква. Если это удалось, присоединяем результат транслита к выходной строке, если нет - это не русская буква, присоединяем исходный символ к выходной строке: if Dict.TryGetData(Ch, oTrans) then begin
oStr:=oStr+oTrans; //russkaya bukva - transliteriruem
end
else begin
oStr:=oStr+Ch; //nerusskaya bukva, ostavlaem v pokoe
end;
10. Освобождаем память словаря после цикла: Dict.Free; 11. Возвращаем результат работы функции: exit(oStr); Функция целиком на PasteBin12. Код основной программы: var
strInput, strOutput:string;
...
begin
Write('Input string:'); ReadLn(strInput);
strOutput:=Translit(strInput);
WriteLn(strOutput);
WriteLn('Press Enter...'); ReadLn();
end.
Для совместимости с русским языком в консоли необходимо добавить директивы компилятора, иначе словарь будет работать неправильно: program translit; {$mode objfpc} {H+} {$codepage CP866} ... $mode objfpc H+ - чтоб строки по умолчанию не были ShortString 'ами$codepage CP866 - установка кодовой страницы. Документация по работе со строкамиПроверка Исходник примера на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/26/lazarus-translit-stroki-v-konsoli/
11/25/22 11:55 pm
Lazarus, поддержка русских букв в консоли (Windows 7)
Из коробки русские буквы в консоли поддерживаются через жопу:
 Это потому что Lazarus по умолчанию создает файл в UTF8, а консоль Windows 7 поддерживает CP 866 (кодировку DOS/OEM), достаточно перекодировать файл: 1. Щелкаем по пустому месту в исходнике в редакторе. 2. Выбираем Параметры файла --> Кодировка 3. В выпадающем списке выбираем CP866:  4. В появившемся окне нажимаем кнопку Изменить файл:  5. ФАНФАРЫ! ИсточникТестовый пример на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/25/lazarus-podderzhka-russkih-bukv-v-konsoli-windows-7/
11/25/22 08:39 pm
Lazarus, регулярные выражения.
Из коробки доступен мощный класс TRegExpr , вполне себе работает с регулярками. Сожрал даже C#-овскую, без изменения синтаксиса вообще. Пример регулярки для обнаружения русских букв:
program regexptest;
uses regexpr;
var Regex:TRegExpr;
begin
Regex:=TRegExpr.Create;
Regex.Expression:='[а-я]|\s';
Writeln(Regex.Exec('АБВГ'));
Writeln(Regex.Exec('ABCD'));
ReadLn();
end.
ДокументацияПример на КиберфорумеЭтот пример на GitHubUPD: Более лучшая регулярка для поиска кириллицы (и пробела). [А-Я]|[а-я]|\s Первая ( [а-я]|\s ) нормально работает, если формат файла исходника UTF-8, и текст в UTF-8, а вот с консолью в Win7 она работает только на строчных буквах, на заглавных не работает. А консоль требует CP866. О других косяках кириллицы в консоли - в следующих выпусках нашего журнала. Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/25/lazarus-regulyarnye-vyrazheniya/
11/25/22 01:34 pm
Lazarus, список каталогов с подкаталогами
Плохо, что по маске не умеет каталоги искать. А в остальном все просто.
 program alldirs;
uses Classes, SysUtils, FileUtil;
var
lstDirs:TStringList;
i: Integer;
begin
lstDirs := TStringList.Create;
FindAllDirectories(lstDirs,'C:\Windows',true);
i:=0;
while i < lstDirs.Count do begin
WriteLn(lstDirs[i]);
inc(i);
end;
WriteLn ('Found: ',lstDirs.Count);
WriteLn ('Press Enter');
lstDirs.Free();
ReadLn();
end. Ссылка на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/25/lazarus-spisok-katalogov-s-podkatalogami/
11/24/22 09:58 pm
Поигрался с Freepascal/Lazarus
Больше по служебной необходимости, и воле случая, чем по собственному желанию. Инет отсутствовал, компы нормальные все заболели, а утилиту писать надо. Ще було, на том и писали.
Поиск файлаНаконец-то нормальный поиск файла, где маска файла работает как надо (как в DOS) и не принимает, например, расширение *.htm и *.html за одно и то же. C# мне не удалось этому очевидному решению научить, конечно, можно потом по выборке прогнать регулярное выражение, но оно тоже плохо срабатывает, упускает некоторые случаи, например, если имя файла начинается с расширения (т.е. на файл .html оно не сработает): В Lazarus все работает из коробки:  program testfind;
uses Classes, SysUtils, FileUtil;
var
lstFiles:TStringList;
i: Integer;
begin
lstFiles := TStringList.Create;
FindAllFiles(lstFiles, 'C:\Temp\Test', '*.htm', true);
i:=0;
while i < lstFiles.Count do begin
WriteLn(lstFiles[i]);
inc(i);
end;
WriteLn ('Found: ',lstFiles.Count);
WriteLn ('Press Enter');
ReadLn();
lstFiles.Free();
end. Пример и каталог с тестовыми файлами на GitHubUPD: Ссылка на мануалЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/11/24/poigralsya-s-freepascal-lazarus/
10/27/22 03:34 am
Dyna Blaster for DOS (Бомбермен)
 Родное demo игры:  По многочисленным просьбам зрителей, Werwolf сделал репак старой DOS-овской игры. Под Windows XP и выше можно играть в DOSBOX последней версии (на момент написания заметки 0.74-3). Добавлена возможность включения и отключения фоновой музыки: Для включения надо запустить файл ONMUSIC.EXE , для выключения OFFMUSIC.BAT , по умолчанию фоновая музыка отключена. Добавлен файл CHEATS.TXT с кодами для доступа к каждому уровню и кодом на бессмертие. Копия на PasteBinСкачатьDYNA Blast for DOS с Mega.NZ(ZIP)Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/10/27/dyna-blaster-for-dos-bombermen/
10/21/22 07:16 pm
Скрипт для тестирования сетевых соединений. Инструкция.
ПреамбулаДрузья из одной небольшой фиромочки попросили написать небольшой скрипт для тестирования соединений, чтобы быстро понять, где отвалилось. Например, упал роутер, не отвечает внутренний сервер, упал провайдер, или сдох VPN. Попросили сделать кросивое, с этим тоже справился, ошибки выделяются красным цветом, пройденные этапы зеленым, можно включить или отключить звуковое оповещение через PC-speaker. Что умеет+ Последовательно проводить два вида тестов: ping и получение страницы (или файла) с web-сервера + Оповещать пользователя об ошибках или пройденных тестах, с цветным текстом. + Выдавать звуковые сигналы об успешном завершении теста, или об ошибке на PC-speaker.  Для звуковых оповещений должен быть настроен PC-speaker и установлена утилита beep ( копия). Последовательность операций задается в конфигурационном файле. Конфигурационный файлКонфигурационный файл состоит из строк следующего формата: операция|адрес|отображаемое описание|прервать/игнорировать Пока поддерживаются только две операции: ping - для ping'а адреса getp - для получения страницы или файла с WEB-сервера (с помощью wget ) адрес - адрес, WWW для getp , IP или WWW для ping . отображаемое описание - описание операции, текст, который будет выводиться на консоль. прервать/игнорировать - при ошибке операции, если указано ключевое слово break, скрипт останавливает работу и выводит сообщение о том, что в ходе тестирования произошли ошибки. Если указать иное значение, например, skip , то скрипт продолжит производить тесты, пока не закончится конфигурационный файл, или пока не будет следующий сбой в тесте, где указана опция break . Названия операций и break нечувстивительны к регистру (т.е. можно написать Ping , ping или Getp , GeTP или BreaK , breaK ). Первые два поля (операция и адрес) являются обязательными. Если они не будут указаны, скрипт будет прерван на строке с ошибкой: ...
Ping|192.168.0.1|Main router|break #Main router ping
ping|[ДАННЫЕ УДАЛЕНЫ]|Provider IP|break
getp
...
 Если не будет указано поле описания, то оно будет по умолчанию установлено в значение No desription :  Если последнее поле не будет заполнено, то оно принимает значение break . Если в первом поле будет неверно указанный код операции, то скрипт его проигнорирует, выдав соответствующее сообщение, продолжит выполнять другие операции, но завершится с ошибкой: Ping|192.168.0.1|Main router|break #Main router ping ping|[ДАННЫЕ УДАЛЕНЫ]|Provider IP|break getp|[ДАННЫЕ УДАЛЕНЫ]|Provider page 1234|[ДАННЫЕ УДАЛЕНЫ]|VPN Server IP|break ping|8.8.8.8|Internet IP|break getp|google.com|Internet page|break Для разделения полей используется символ | В конфигурационном файле можно использовать комментарии, начинающиеся с символа # , все, что находится после этого символа - игнорируется. Пустые строки также игнорируются. Пример конфигурационного файла (без данных)#inettest.cfg example
Ping|192.168.0.1|Main router|break #Main router ping ping|x.x.x.x|Provider IP|break #Change x.x.x.x to your provider ip getp|myprovider.net|Provider site page|skip #change myprovider.net to real site your provider ping|x.x.x.x|VPN Server IP|break #Change x.x.x.x to real VPN provider IP ping|8.8.8.8|Internet IP|break getp|google.com|Internet page|break Переменные скриптаСкрипт не имеет параметров командной строки, основные настройки осуществляются через переменные самого скрипта: CONFIG - путь к конфигурационному файлу, например CONFIG="./inettest.cfg" . Если конфигурационный файл не будет найден, скрипт выдаст ошибку: CRITICAL ERROR: Config file ./inettest.cfg not exist! NOCOLOR - если значение равно 0 , включить вывод цветного текста на консоль, если 1 - отключить. По умолчанию 0 NOCOLOR=1 :  NOSOUNDP - включение ( по умолчанию 0 ) или отключение ( 1 ) звука в процессе тестов. Звук выдается после каждого отдельного теста. NOSOUNDF - аналогично предыдущей переменной, только звук звучит после окончания всех тестов или их прерывания. NOADDR - 0 , включить тестируемый адрес в вывод скрипта, 1 - не включать. NOADDR=0 :  NOADDR=1 :  PACKETS - количество пакетов для команды ping (по умолчанию PACKETS=3 ) TIMEOUT - тайм-аут для получения страницы или файла (в скрипте делается с помощью wget , по умолчанию TIMEOUT=5 ) Тест при ошибке сетиКонфиг: Ping|192.168.0.1|Main router|break #Main router ping ping|[ДАННЫЕ УДАЛЕНЫ]|Provider IP|skip getp|[ДАННЫЕ УДАЛЕНЫ]Provider page|skip ping|[ДАННЫЕ УДАЛЕНЫ]|VPN Server IP|break ping|8.8.8.8|Internet IP|break getp|google.com|Internet page|break Результат: Коды ошибокping : 1 — No reply (не один из пакетов до пингуемого адреса не дошел) 2 — Other error (другая ошибка, в большинстве случаев — «сеть недоступна»). getp ( wget ): 1 — Иная / общая ошибка (generic error code) 2 — Ошибка в параметрах командной строки или файлах конфигурации (.wgetrc или .netrc) 3 — Ошибка файлового ввода/вывода (I/O error) 4 — Ошибка сети (например, при обрыве связи) 5 — Ошибка SSL 6 — Ошибка идентификации (неправильное имя пользователя или пароль) 7 — Ошибка протокола 8 — Ошибка сервера (например, нужный файл на сервере не найден, ошибка 404) Коды возврата скрипта0 - Ошибок в ходе тестов не произошло. 1 - Произошла хотя бы одна ошибка. СкачатьРепозиторий на GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/10/21/skript-dlya-testirovaniya-setevyh-soedinenij-instruktsiya/
10/6/22 04:29 am
Linux: как проверить в скрипте, пингуется ли адрес.
Оказалось все очень просто.
ping <ip|url> -c <packets_count>
где:
<ip|url> - IP или URL адрес
ip - IP-адрес (например 8.8.8.8 или 192.168.0.1 )
url - URL-адрес (например google.com)
<packets_count> - количество отправленных пакетов
В следующем примере мы пингуем google.com :
ping google.com -c 3
Вывод команды приводить не буду для экономии места, кому нужно, смотрите на PasteBin
Можно пропинговать и по IP, например, локальный роутер:
ping 192.168.0.1 -c 3
Вывод, опять же на PasteBin
Внимание! Количество отправленных пакетов (-с <число> ), если вы используете ping в скрипте bash нужно указать обязательно, иначе команда ping никогда не прекратит свою работу и завесит скрипт, в отличии от команды ping в Windows (она по умолчанию посылает 5 пакетов и прекращает работу).
Коды возврата pingЕстественно, для анализа работы ping в скрипте, нам потребуются коды возврата. К сожалению, в официальном man для команды ping их, почему-то забыли указать. 0 - Success (хоть один из пакетов дошел до адреса) 1 - No reply (не один из пакетов до пингуемого адреса не дошел) 2 - Other error (другая ошибка, в большинстве случаев - "сеть недоступна"). На всякий случайЕсли произошла ошибка с кодом 2 , то команда ping выводит на stderr сообщение об ошибке, например: ping 8.8.8.8 -c 3 connect: Network is unreachable Отключение выводаping является полуинтерактивной командой, и показывает параметры отправленных пакетов ( см. на PasteBin), если это не нужно, можно отключить вывод стандартным способом, перенаправив вывод команды ping из stdin и stderr в /dev/null , например: ping 8.8.8.8 -c 3 >/dev/null 2>/dev/null где: >/dev/null - перенаправление stdin в нуль-устройство 2>/dev/null - перенаправление stderr в нуль-устройство ПримерПростейшее использование команды ping в скрипте: #!/bin/bash
#testping
# $1 - IP or URL address
ping $1 -c 3 >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
echo "Pinging!"
else
echo "Not pinging!"
fi Копия на PasteBinПроверкаsmallwolfie@wolfschanze:~/nettest$ ./testping 8.8.8.8 Pinging! smallwolfie@wolfschanze:~/nettest$ ./testping 666.666.666.666 Not pinging! smallwolfie@wolfschanze:~/nettest$ ./testping 192.168.0.55 Not pinging! smallwolfie@wolfschanze:~/nettest$ ./testping example.org Pinging! Это репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/10/06/linux-kak-proverit-v-skripte-pinguetsya-li-adres/
10/5/22 07:34 am
Цветной текст в консоли Linux #3. Улучшаем совместимость скрипта.
ПреамбулаДрузья ketmar и grusha отправили мне несколько ценных замечаний по поводу покраски консоли из скрипта ( копия). Решил про них здесь отдельно написать, и модифицировать скрипт Замечание #1, попадание ESC-последовательностей в поток, при вызове скрипта в потокеРешил начать с него, оно более важное. Впрочем, отдельно ему посвятил маленькую заметку ( копия), где описал проблему и ее решение, так что осталось только применить, оборачиваю основной код функции echoc() в if , осушествляющий проверку, вызвали ли скрипт в терминале или в потоке: if [ -t 1 ];then
E__="\x1b[${FGROUND[$2]}m"
if [ -n "$3" ];then
E__="$E__\x1b[${BGROUND[$3]}m"
fi
if [ -n "$4" ];then
E__="$E__\x1b[$4""m"
fi
echo -e "$E__$1\x1b[0m"
else
echo "$1"
fi
Если не в терминале, просто выводим обычный текст без ESC-кодов: В функции echocn() поступаем аналогично, просто к вызову echo не забываем добавить пареметр -n : if [ -t 1 ];then
...
echo -e -n "$E__$1\x1b[0m"
else
echo -n "$1"
fi Замечание #2. Совместимость цветов.коды для яркости не входят в общепринятый стандарт VT-100, это расширение, и поддерживается далеко не всеми. один из стандартных способов увеличить яркость — включить полужирный режим: "\e[1;32m". да, это не работает для фона, стандартного метода для фона нет.. Т.е. максимально совместимыми цветами с терминалом являются только первые 7: коды 30..37 для текста, 40..47 для фона, дефолтные коды 39 и 49 для текста и фона соответственно (см. таблицу из предыдущей заметки ( копия)). Коды для яркости текста ( 90..97 ) и фона ( 100..107 ) расширение стандарта и поддерживаются не всеми терминалами. Для текста есть способ увеличить яркость - включить полужирный режим: семь цветов плюс полужирный с расчётом на то, что это давно уже яркость текста. Совместимые цвета и стилиИтого, получаем вот такую таблицу совместимых цветов: # | Название цвета | Код цвета текста | Код цвета фона | 0 | Default (По умолчанию) | 39 | 49 | 1 | Black (Черный) | 30 | 40 | 2 | DarkRed (Темно-красный) | 31 | 41 | 3 | DarkGreen (Зеленый) | 32 | 42 | 4 | DarkYellow (Темно-желтый) | 33 | 43 | 5 | DarkBlue (Синий) | 34 | 44 | 6 | DarkMagenta (Темно-фиолетовый) | 35 | 45 | 7 | DarkCyan (Темный аквамарин) | 36 | 46 | 8 | Gray (Серый) | 37 | 47 | 9 | DarkGray (Темно-серый) | 1;30 | - | 10 | Red (Красный) | 1;31 | - | 11 | Green (Ярко-зеленый) | 1;32 | - | 12 | Yellow (Желтый) | 1;33 | - | 13 | Blue (Голубой) | 1;34 | - | 14 | Magenta (Фиолетовый) | 1;35 | - | 15 | Cyan (Аквамарин) | 1;36 | - | 16 | White (Белый) | 1;37 | - | Код сброса: \x1b[0m - сбрасывает настройки консоли (цвет текста, фона и стиль) к значению по умолчанию. Он работает нормально. Заодно уж выбросил из таблицы стилей "мигающий" и "невидимый", которые объективно не работают: Код стиля | Стиль текста | 0 | Default (По умолчанию) | 1 | Bold (Жирный/яркость текста) | 4 | Understrike (Подчеркнутый) | 7 | Inversing (Инверсия), цвет фона и текста меняются местами | Модифицируем скриптМассивы с кодами цветов теперь выглядят так (массив с именами показан для лучшего понимания): NAMES=(Default Black DarkRed DarkGreen DarkYellow DarkBlue DarkMagenta DarkCyan Gray DarkGray Red Green Yellow Blue Magenta Cyan White) FGROUND=("39" "30" "31" "32" "33" "34" "35" "36" "37" "1;30" "1;31" "1;32" "1;33" "1;34" "1;35" "1;36" "1;37") BGROUND=(49 40 41 42 43 44 45 46 47) И подправляем вывод: echo -e "Foreground color:\tBackground color:"
for N in {0..16}; do
if [ $N -eq 1 ];then #foreground
echocn "$N - ${NAMES[$N]}" $N 4
else
echocn "$N - ${NAMES[$N]}" $N
fi
echo -e -n "\t\t"
if [ $N -le 8 ];then
if [ $N -gt 1 ];then
echoc " ${NAMES[$N]} " 1 $N #background
else
echoc " ${NAMES[$N]} " 0 $N
fi
else
echo
fi
done
echo
echocn "Default" 0 0 0; echo -n " "
echocn "Bold" 0 0 1; echo -n " "
echocn "Understrike" 0 0 4; echo -n " "
echocn "Inversing" 0 0 7; echo -n " "
echo
echo Что получилосьВывод в терминал:  Вывод в файл: ./esccolorscomp >test.txt 
Замечание #3. Об использовании tputЯ задал вопрос, а не проще ли вместо ESC-кодов использовать tput , о чем я уже писал ( копия). Ответ был таким: Он требует установленого ncurses , в общем и целом — никто не гарантирует его наличия. Готовый скриптНа GitHubЭто репост с сайта http://tolik-punkoff.com Оригинал: https://tolik-punkoff.com/2022/10/05/tsvetnoj-tekst-v-konsoli-linux-3-uluchshaem-sovmestimost-skripta/
|