Толик Панков
hex_laden
............ .................. ................
Page Summary

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

Back Viewing 0 - 20  
Перепрошивка полуокирпиченного 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/

Переключение кодировки вручную в новом 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/

Tags: ,
Китайская кодировка, китайский документ, расшифровка, 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/

Анатомическая модель

По просьбе анонима выкладываю:



Форматы EXE, SWF, архив RAR, скачать с Mega.NZ

Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2023/01/19/anatomicheskaya-model/

Tags: ,
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/

Tags: , ,
Красивые часы на любой дисплей

Припер шеф в офис телевизор, новый здоровый плоский, чтоб клиентам МУЗ-ТВ или какое другое камеди показывать, мол, пусть будет, как в лучших домах города.
Сразу выяснилось, что коаксиал в офисе есть, но это оказалось не кабельное, а какая-то неведомая фигня, которая, в общем, даже неведомое показывать отказалась, хотя по тестам там даже какой-то сигнал есть, но с ним я ночью поэкспериментирую, вдруг какая Бухта Кэндл или Криполе Чудес после полуночи передается.

Оказалось, железячка не венде (какой-то окончательно порезанной и изуродованной 10-ке), так что довольно быстро научил его показывать из расшаренной Самбы видосы, но, поскольку там одни ужастики 80-х ("Извне", "Реаниматор", "Фантомы" и.д.), то для клиентов это не включишь, а за ютупом следить надо, вдруг посреди котиков Невзоров вылезет.

В общем, хуй с ним, сказал начальник, и попросил Большие Красивые Часы на весь экран.

Оказалось, что после небольшого шаманства, железке можно скрамливать неподписанные экзешники, и заливать все что хочешь, на доступный пользователю раздел SSD.

Что-ж, сказал я... И немедленно выпил. А потом сделал часы (ну как сделал, сконвертировал в экзешник(и)).



Clock_1.exe - часы в стандартном окне (с кнопками развернуть, свернуть и закрыть)
Clock_Noborder.exe - часы в стандартном окне без заголовка, закрываются ALT+F4 или по щелчку правой кнопкой мыши, выпадет меню с пунктом Exit
Clock_Fullscreen.exe - часы на полный экран без заголовка, закрываются аналогично предыдущему варианту. Идеальны для стационарного показа на мониторе, телевизоре, старом смартфоне под винду или информационном киоске.
swf\Clock_1.swf - оригинал программы.

Скачать с Mega.NZ

Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2022/12/07/krasivye-chasy-na-lyuboj-displej/

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/

Tags: ,
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/

Tags: ,
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/

Tags: ,
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/

Tags: ,
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/

Tags: ,
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');


Словарь целиком на PasteBin

6. Инициализируем переменные, используемые в цикле:

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);

Функция целиком на PasteBin

12. Код основной программы:
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/

Tags: ,
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/

Tags: ,
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.




Документация
Пример на Киберфоруме

Этот пример на GitHub

UPD: Более лучшая регулярка для поиска кириллицы (и пробела).

[А-Я]|[а-я]|\s

Первая ([а-я]|\s) нормально работает, если формат файла исходника UTF-8, и текст в UTF-8, а вот с консолью в Win7 она работает только на строчных буквах, на заглавных не работает. А консоль требует CP866.

О других косяках кириллицы в консоли - в следующих выпусках нашего журнала.

Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2022/11/25/lazarus-regulyarnye-vyrazheniya/

Tags: ,
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/

Tags: ,
Поигрался с 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.


Пример и каталог с тестовыми файлами на GitHub

UPD: Ссылка на мануал

Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2022/11/24/poigralsya-s-freepascal-lazarus/

Tags: ,
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/

Скрипт для тестирования сетевых соединений. Инструкция.

Преамбула


Друзья из одной небольшой фиромочки попросили написать небольшой скрипт для тестирования соединений, чтобы быстро понять, где отвалилось. Например, упал роутер, не отвечает внутренний сервер, упал провайдер, или сдох 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/

Tags: ,
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/

Tags: ,
Цветной текст в консоли Linux #3. Улучшаем совместимость скрипта.

Преамбула


Друзья [info]ketmar и [info]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) расширение стандарта и поддерживаются не всеми терминалами. Для текста есть способ увеличить яркость - включить полужирный режим: семь цветов плюс полужирный с расчётом на то, что это давно уже яркость текста.

Совместимые цвета и стили


Итого, получаем вот такую таблицу совместимых цветов:

#Название цветаКод цвета текстаКод цвета фона
0Default (По умолчанию)3949
1Black (Черный)3040
2DarkRed (Темно-красный)3141
3DarkGreen (Зеленый)3242
4DarkYellow (Темно-желтый)3343
5DarkBlue (Синий)3444
6DarkMagenta (Темно-фиолетовый)3545
7DarkCyan (Темный аквамарин)3646
8Gray (Серый)3747
9DarkGray (Темно-серый)1;30-
10Red (Красный)1;31-
11Green (Ярко-зеленый)1;32-
12Yellow (Желтый)1;33-
13Blue (Голубой)1;34-
14Magenta (Фиолетовый)1;35-
15Cyan (Аквамарин)1;36-
16White (Белый)1;37-


Код сброса: \x1b[0m - сбрасывает настройки консоли (цвет текста, фона и стиль) к значению по умолчанию. Он работает нормально.

Заодно уж выбросил из таблицы стилей "мигающий" и "невидимый", которые объективно не работают:

Код стиляСтиль текста
0Default (По умолчанию)
1Bold (Жирный/яркость текста)
4Understrike (Подчеркнутый)
7Inversing (Инверсия), цвет фона и текста меняются местами


Модифицируем скрипт


Массивы с кодами цветов теперь выглядят так (массив с именами показан для лучшего понимания):

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/

Back Viewing 0 - 20