Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


среда, 9 октября 2024 г.

Мнение американцев о Су-35: "Российский истребитель Су-35 - это не шутка"

 Попалась ссылка на интересный материал в буржуйском издании. Почитал. Статья не техническая, а обзорная, но заслуживает перевода.


Оригинал статьи: 20.09.2024

Автор: Энтони Константини (Anthony J. Constantini)

Российский истребитель Су-35 более чем способен потягаться с другими современными самолетами, и так будет и в обозримом будущем.

В России хорошо известна поговорка "Доверяй, но проверяй" (trust, but verify по-английски). И за 30 лет "Сухие" неоднократно подтвердили доверие, оказанное им пилотами, снова и снова. Уникальные признаки нескольких поколений (самолетов) в сочетании с его доказанными боевыми качествами гарантируют, что его не забросят еще очень долго.

Объявленный в начале нулевых, Су-35 позиционировался как самолет поколения 4++ благодаря внедрению новейших стелс-технологий, радаров и двигателей.

Его РЛС впечатляет: она может засечь другой самолет в воздухе за 350км. Если неприятельский F-35 заметит "сушку", то, как сказал отставной офицер НАТО, F-35 предпочтет отступить из-за непревзойденной маневренности "Сухого". Его производитель "Ростех" заявляет, что у "Сухого" нет ограничений по углу атаки. Кроме того, он может выйти на сверхзвук без форсажа. Наверное, именно это обеспечило Су-35 неуязвимость против украинских С-300.

Боекомплект не менее впечатляет: на 12 подвесках он может нести до 12 ракет ближнего радиуса, что вчетверо больше, чем у F-22. Может он нести и 4 ракеты Р37М, оснащенных 60кг боеголовками и достигающими своих целей на скоростях до 6М на расстоянии до 400км. Если же дело доходит до ближнего боя, то в распоряжении пилота 30мм авиапушка Грязева-Шипунова ГШ-301 со 150 выстрелами.

Такая "полезная нагрузка" вкупе со скоростью и суперманевренностью, похоже, и есть причина, по которой украинцы уже просят самолеты более совершенные, чем F-16, которые они начали получать совсем недавно. По словам представителя ВВСУ "устаревшие F-16 не справятся".

И это еще не всё, благодаря чему можно назвать Су-35 совершенным истребителем. Несколько из них были потеряны в ходе СВО. F-22 может "видеть" более мелкие цели, но Су-35 оснащен системой РЭБ "Хибины", которая сильно затрудняет вражеским ракетам наведение. Так что, даже если его засекут издалека, благодаря своим защитным системам, скорости и возможности атаки с любого угла, он сможет сблизиться с атакущим, несмотря на встречный огонь.

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

Когда-нибудь Россия уйдет от Су-35 в пользу более новых самолетов, как это делают все страны мира. Но сейчас им незачем это делать. В середине 2024 Россия заявила о наличии примерно сотни Су-35 и собирается выпустить еще.

Су-35 более чем способен потягаться с другими современными самолетами, и так будет и в обозримом будущем.

(последняя фраза - не случайная копипаста, а именно так повторено в оригинале статьи)

(Перевод: Траблмейкер-ДВ)

пятница, 15 марта 2024 г.

Получить время непрерывной работы жесткого диска из smartctl

 Некоторые утилиты выдают время непрерывной работы диска в годах, днях и часах. Но штатный smartctl - только в часах, к тому же среди остальной информации.

Попробуем сочинить команду для получения подобного результата.

sudo smartctl --all /dev/sdX|grep -A10 "ID#"|grep "^ \{0,2\}9"|awk '{print $10}'

  1. smartctl выдает длинную портянку атрибутов и прочих полезностей. Нам нужен атрибут №9: "power on hours" или "power on time" или как-то еще. Название не стандартизировано, а вот номер всегда одинаков.
  2. для этого мы находим заголовок таблицы атрибутов и берем первые 10 строк этой таблицы. 10 - чтобы с запасом. А таблицу ищем, чтобы не взять в работу что-то не то, которое будет выглядеть похоже на искомое.
  3. в этих 10 строках ищем ту, которая начинается с девятки, перед которой могут быть, а могут и не быть несколько пробелов.
  4. awk понимает, что если между осмысленными данными несколько разделителей-пробелов подряд, то их надо считать одним разделителем. В десятом поле строки, полученной в п.п. 1-3 содержится количество отработанных диском часов.

Например:

$ sudo smartctl --all /dev/sdb|grep -A10 "ID#"|grep "^ \{0,2\}9"|awk '{print $10}'

25457

Без awk строка выглядит так:

  9 Power_On_Hours          0x0032   071   071   000    Old_age   Always       -       25457

То есть, диск отпахал уже более 25 тысяч часов. Дальше можно поизвращаться с дополнительными конвейерами, дабы получить более удобное представление, но я этим заниматься не хочу, а вместо этого займусь целочисленной арифметикой. Для этого присвою вывод предыдущей команды переменной workedHours и поработаю с ней.

$ echo $(( workedHours * 100 / 24 / 36525 )) $(( (workedHours * 100 / 24 % 36525 ) /100 ))

Если взять workedHours=25457, то на выходе получим

2 328

то есть, диск отработал 2 года и 328 дней.

Для чего лишние умножения и деления на 100? Bash умеет только целочисленную арифметику, а реальная продолжительность года 365.25 суток, как я помню. Именно из-за этой четвертушки каждый четвертый год - високосный, с одним добавочным днем. И чтобы имитировать такую арифметику, мы умножаем делимое и один из делителей на 100. Количество часов в сутках суть константа, ее умножать не надо.

Поскольку во втором выражении проделано то же самое, то чтобы остаток от деления на длину года был похож на правду, его надо разделить на 100.

Собственно, всё. Наслаждайтесь.

пятница, 27 октября 2023 г.

Монтирование флешек и вообще внешних накопителей из командной строки без sudo или прав root--a

Не всегда есть возможность использовать sudo, когда надо смонтировать флешку. Особенно это заметно, когда работаешь из командной строки и нет графического "монтажника". Но файловые менеджеры, работающие от имени текущего пользователя, как-то же умудряются подключать/отключать накопители и тома, не требуя привилегий.

В решении проблемы поможет демон udisks2. Подробнее здесь.

1. Проверяем, работает ли демон как чёрт?

sudo systemctl status udisks2


2. Находим (если еще не) нужный диск или раздел:

lsblk


Обычно есть смысл ориентироваться на самую бОльшую букву, назначенную ему ядром - вряд ли свежевставленная флешка будет называться /dev/sda. Ну и на размер файловой системы. Допустим, мы увидели, что устройство называется /dev/sdk, и нужный нам раздел - /dev/sdk1

3. Монтируем найденное:

udisksctl mount -b /dev/sdk1
Точка монтирования будет создана в /media/имя_пользователя/название_накопителя, если только обратное не указано в /etc/fstab. Если накопитель прописан в fstab, то он будет подключен, как указано там.

4. Попользовались, теперь демонтируем.

udisksctl unmount -b /dev/sda1


Из реальной жизни. Есть у меня внутренний диск, который по умолчанию не подключен. Это диск с 1 разделом, сегодня он /dev/sdh (уже довольно долго буквы дисков могут меняться от загрузки к загрузке, поэтому в fstab он прописан то ли по метке тома, то ли по UUID, точно не помню, и должен монтироваться на постоянную точку монтирования) 

$ udisksctl mount -b /dev/sdh1
Mounted /dev/sdh1 at /media/500blue.

А вот вставил в ридер microSD карточку, которая села на /dev/sdg

$ udisksctl mount -b /dev/sdg1
Mounted /dev/sdg1 at /media/sergei/72AD-2013

В fstab ее нет, и метки у этого раздела тоже нет, поэтому он прицепился к моему подкаталогу в /media

Не проверял, правда, как оно будет вести себя если пользователь не в sudoers, но меня устраивает то, что есть сейчас.

LibreOffice не показывает изображения в документах Word

Столкнулся со странностью. Перебирал архивы документов и был сильно удивлен, что вот это чудо 

вдруг перестало показывать внедренные картинки. Например: 


Лечится, оказывается, просто: в меню вид включаем пункт "Изображения и диаграммы". Почему он по дефолту выключен - непонятно


И всё, собственно:



вторник, 4 октября 2022 г.

Рисование текстовых рамок в bash, часть 2

 В августе 2021 я уже писал на эту тему. Но потом мне захотелось прекрасного и недавно я доработал алгоритм, сведя его в отдельную процедуру и дополнив некоторыми возможностями.

Красиво оформлено через pastebin


Вот как выглядит результат работы этого скрипта

Функция border() принимает 2 аргумента. Первый, обязательный, текст для вывода внутри рамки. Второй, не обязательный, выбор типа рамки. Сейчас воспринимаются только два модификатора: g - graphical, и d - double, соответственно обычная и двойная псевдографические рамки.

По сути, модификатор просто определяет набор знаков, используемых для рисования. Всего имеется 8 компонентов рамки: 4 угла и 4 "стенки" - 2 вертикальных (левая/правая) и 2 горизонтальных (верхняя/нижняя). Меняя символы в этих наборах, можно без проблем рисовать рамки из любых символов.

Забавно, что символ "одиночная псевдографическая горизонталь" (переменные BTM и BBM в наборе "g", \Ux2500, если не ошибаюсь) я никак не мог ввести в консоли. Не помогала даже вставка из "таблицы символов". 


Под катом - не раскрашенный текст скрипта на случай, если pastebin перестанет работать.

dmesg и sudo в новых Ubuntu

Был неприятно удивлен, когда в 22.04 обнаружил, что dmesg вдруг стало требовать повышенных привилегий. Учитывая, что эта команда просто показывает содержимое "кольцевого буфера ядра", то мне совершенно непонятны причины такой "секретности".

Начинает раздражать, что некогда простая и ясная система всё больше напоминает Windows по своей запертости, когда "под капотом" прячется всё и вся без возможности увидеть то, что решил не показывать разработчик GUI.

Вот и теперь решение есть и очень простое. Но, скажите мне, как про него догадаться? Я не понимаю.

sudo sysctl -w kernel.dmesg_restrict=0

понедельник, 14 февраля 2022 г.

Как отключить анимацию курсора и перерисовки в Office 2016/2013

Многие туповатые советчики предлагают для этого отключить (для win8 и win10) анимацию в самой винде. Но если я хочу отключить анимацию только в офисном продукте, потому как меня дико бесит этот плавный курсор и красивенькие (но совершенно бесполезные) анимации при пересчете таблиц и т.п.

Идея найдена здесь:
https://zooks.ru/disable-office-2013-typing-animation/
(в статье речь про офис-2013, но у меня сработало и для 2016)

Если коротко, создаем раздел
Компьютер\HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Common\Graphics
(по умолчанию его нет)

В нём создаем dword-32 параметр с именем DisableAnimations
Параметру присваиваем значение "1".
Закрываем все офисные продукты и открываем их заново.
PROFIT!!!

(перегружать комп, как предлагают в статье, не обязательно)

Для включения анимации обратно, меняем единицу на ноль или просто удаляем параметр.

среда, 20 октября 2021 г.

Справочная информация: Подключение к Диску Яндекс через webdav в Thunar

Завелся у меня "мегадиск" от мегафона. Ну, как завелся, еще почти год назад. Сегодня пришла смс, что из 100 полученных тогда гигов 75 были заманушными и всё такое. Решил хоть попробовать, что это. Заодно попробовать зайти туда через тунар.
Не сразу сообразил, как правильно подключать webdav, и нашел подсказку здесь.
У меня прекрасно сработало по первому же способу

Справочная информация: Подключение к Диску Яндекс через webdav в Thunar: При работе в Linux Mint xfce возникла необходимость подключаться к Диску Яндекс прямо из файлового менеджера Thunar. Было найдено 2 спосо...

понедельник, 23 августа 2021 г.

Bash: рисование рамок или повтор символа нужное количество раз

 Понадобилось мне рисовать рамочку вокруг выводимого из скрипта сообщения.

Нарисовать ее вокруг заготовленного текста не проблема. Но как быть, если текст меняется и его длина заранее неизвестна, то есть, нельзя заранее нарисовать рамочку нужной длины. Рисовать с запасом - не вариант, душа просит красоты.

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

Элегантное решение нашлось в комментариях здесь:

head -c 80 < /dev/zero | tr '\0' '.'

То есть, загружаем нужное количество символов с кодом 0x00 из псевдоустройства /dev/zero, а потом в полученном "тексте" меняем каждый такой символ на нужный нам.

Там же предложено и несколько других вариантов, но на мой взгляд этот лучший. По крайней мере, для моих целей. В скрипте обрабатывается переадресация почты и если переадресация для выбранного пользователя уже настроена, то надо предупредить об этом. Настроенный адрес пересылки находится в переменной SENDING_TO

ALRDY='| !!! УЖЕ ПЕРЕСЫЛАЕТ ПОЧТУ НА '$SENDING_TO' |'
ALRDY_LINE='+'`head -c $(( ${#ALRDY}-2 )) </dev/zero|tr '\0' '-'`'+'
echo $ALRDY_LINE
echo $ALRDY
echo $ALRDY_LINE

В переменную ALRDY помещаем шаблонную строку - фиксированный текст и место для вставки переменной. По краям стоят символы "вертикальная черта", они образуют боковые стороны рамки. А в переменную ALRDY_LINE поместим нужное количество дефисов, размещенных между двумя плюсиками - "углами" рамки. Т.к. верхняя и нижняя стороны рамки одинаковы, то используем только одну переменную, но ничто не мешает использовать их две или больше, в зависимости от.

Веселье начинаем в следующей строке. В начале и в конце добавляем знак "+" к ALRDY_LINE, а между ними результат слегка переработанной команды из примера в начале поста.

${#ALRDY} возвращает длину переменной в СИМВОЛАХ (не в байтах! поэтому юникод работает нормально)

$(( ... )) - это арифметика, из полученной длины переменной ALRDY вычитаем 2, то есть, не принимаем в расчет начальную и конечную вертикальные черточки, поскольку над ними будут не дефисы, а два добавленных вручную плюса.

Результат этого выражения используем как параметр для ключа -c команды head, и вся комбинация обозначает "получить из /dev/zero символы в количестве "длина переменной ALRDY минус два" и заменить каждый из них на дефис". Так как к ALRDY_LINE пририсовываем еще два плюсика, то длины ALRDY и ALRDY_LINE становятся равными.

И вот примерно что получается:

+-----------------------------------------------------+
| !!! УЖЕ ПЕРЕСЫЛАЕТ ПОЧТУ НА bobylova_mv@jcx.srkz.ru |
+-----------------------------------------------------+

+---------------------------------------------+
| !!! УЖЕ ПЕРЕСЫЛАЕТ ПОЧТУ НА kmv@khv.cpsu.su |
+---------------------------------------------+

Просто и очень текстово :-)

В принципе, эту идею можно использовать и для генерации таблиц, а не только рамочек, но у меня в этом необходимости нет.


среда, 4 августа 2021 г.

WMIC и серийный номер APC ИБП

 Обект WMI Win32_Battery имеет много интересных свойств, одно из них - deviceId. Но ИБП от APC пихают в это поле всё подряд - от серийного номера до версий firmware.

Возникла задача: выделить только серийный номер, при этом остальные свойства, которые wmic возвращает в виде непрерывной строки, поля в которой разделяются вертикальной чертой (|) остались на месте.

В конце концов родилось вот такое:

wmicc.sh ИМЯ_КОМПА|tail -n +3 |sed -r "s/([0-9][A-Z][0-9]{4}[A-Z][0-9]{5})[^|]*/\1/g" |datamash transpose -t \| |column -t -s \|

wmicc.sh - это скрипт-обертка, передающий wmic-у вспомогательные параметры - авторизацию и т.п., а так же параметры отбора.

tail обрезает первые 2 строки, в которых содержится ненужный мне мусор.

datamash transpose преобразует последовательные строки в столбцы

column придает этим столбцам красивую ширину

А самое интересное делает sed. В поле deviceId текст выглядит примерно так:

1A2152Z12345  American Power ConversionBack-UPS XS 650CI FW:892.R2.I USB FW:R2

Первое алфавитно-цифровое сочетание и есть серийный номер ИБП, причем 2 цифры сразу после первой буквы (A21) - это год выпуска (пример серийника выше - условный, так что год в нём 2021). Но вот всё остальное до конца строки мне ни к чему.

Поля, как уже сказано, отделяются друг от друга вертикальной чертой, поэтому задача была оставить только серийник, убрав всё остальное до границы поля. Поэтому регэксп читается примерно так:

  1. найти сочетание вида ЦБЦЦЦЦБЦЦЦЦЦ (Ц - цифра, Б - буква), обозначить его как "группа 1"
  2. в той же строке сразу после этой группы искать любое количество любых символов кроме вертикальной черты
  3. заменить найденное в п.п.1 и 2 на то, что находится в "группа 1"
  4. Профит!
$ echo "1A2152Z12345  American Power ConversionBack-UPS XS 650CI FW:892.R2.I USB FW:R2|" |sed -r "s/([0-9][A-Z][0-9]{4}[A-Z][0-9]{5})[^|]*/\1/g"

1A2152Z12345|

Хитрость была в том, что я далеко не сразу понял, как именно указать, что нужно искать всё до ближайшего разделителя полей. Для выполнения таких подстановок ключ -r обязателен, иначе sed ругается.

понедельник, 2 августа 2021 г.

Windows 10 определяет HDD как SSD

Подготовил образ для переустановки системы. Готовил его на компе с SSD.

Заливаю его на комп с HDD и обнаруживаю, что дефрагментация диска невозможна: он, несмотря на правильное определение всех его свойств, рассматривается как SSD, дефрагментация которого не имеет смысла и оптимизатор пишет, что она невозможна.

Решение здесь:(ответ от DavidELindsay()

1. Открываем командную строку от имени администратора (*)

2. Выполняем winsat formal.

3. PROFIT!

(*) поскольку винда после 98-ой пигшется индусскими наркоманами, то даже winsat /? невозможно выполнить из обычной командной строки, даже если войти в систему с администраторской учеткой.

понедельник, 28 июня 2021 г.

Zimbra: квоты и размер почтового ящика

 Понадобилось изменить и проверить размеры места, выделяемого пользователям. Общий для всех класс обслуживания разрешает до 450М. Но некоторым этого не хватает, а значит приходится отдельным личностям переопределять квоты.

В GUI пункт с размерами п/я зарыт слишком глубоко, поэтому решил найти способ получить эти сведения в CLI для возможной автоматической обработки.

Были использованы материалы:

  1. https://nwildner.com/posts/2019-09-27-zimbra-cli-tips/
  2. https://webhostinggeeks.com/howto/how-to-show-mailbox-size-on-zimbra-via-command-line/
  3. мануал по awk (оказалось, я забыл бейсик, пришлось лезть в шпаргальник)
  4. собственный пост по близкой тематике

Где хранится индивидуальная переопределенная квота, я не проверял.

Итак: zmprov gqu (в первой ссылке, кстати, эта команда написана неправильно - qgu вместо gqu, get quota usage) выводит списком почтовые ящики на сервере в формате "адрес квота занято", например "gates_wh@contoso.ru 471859200 1546199" - "пользователю В.Г. Гейтс выделено 450М, из которых занято полтора".

То есть, размеры выводятся в байтах, а дальше потребитель информации решает, в каких единицах ее использовать.

Для более-менее удобного анализа родил такую хитровыделанную команду:

zmprov gqu localhost|sort -nr -k2,3|awk {'printf "%.2fK:%.2fK=%2.2f%% %s\n", $3/1024, $2/1024, $3/$2*100, $1'}

  1. берем данные с этого же сервера
  2. сортируем по убыванию сначала квоты, потом - использованного места (2-е и 3-е поля в выводе gqu)
  3. выводим в виде "x.xxK:z.zzK=y.yy% адрес", увеличивая порядок единиц для удобочитаемости - килобайты вместо байтов, например "1509.96K:460800.00K=0.33% gates_wh@contoso.ru", то есть, у тов. Гейтса занято 0.33% от выделенной ему квоты

На этом пока всё

P.S.

Усовершенствованная версия команды для отправки отчетов и т.п.

zmprov gqu localhost|sort -nr -k2|awk {'printf "%.2fK:%.2fK=%2.2f%% %s\n", $3/1024, $2/1024, $3/$2*100, $1'} |grep -v "=-nan%"|sort -rn -t \=  -k2 |head -n 10

отличия: убираем недопустимые значения, например, деление на ноль, потом сортируем по процентажу и выводим только топ-10

сдуру решил, что "-d" у sort задает разделитель полей, и долго не мог понять, на что сортировка ругается... Оказалось, надо -t. И, да, -k позволяет задать только одно поле для сортировки, поэтому в исходной команде результаты сортировки могут быть странные

среда, 18 ноября 2020 г.

MySQL: group_concat - ограничение и как его преодолеть

 В небезызвестной OCS-NG Inventory, по крайней мере до версии 2.1.2 включительно, есть таблица AccountInfo, в которой хранятся различные дополнительные параметры оборудования, которые можно менять в разделе Administrative Data

Но есть у нее недостаток: MySQL не поддерживает косвенную адресацию (обратиться в полю по имени, которое находится в переменной или является результатом выражения), а поля в этой таблице имеют вид FIELDS_NNN, где NNN - номер поля, поэтому для обращения, скажем, к полю "Владелец компа" надо делать лишний селект, чтобы узнать, в каком из FIELDS-ов этот владелец хранится. И не просто селект, а еще и при каждом обращении к этому полю, чтобы при изменении его номера не пришлось перелопачивать весь скрипт.

среда, 29 апреля 2020 г.

Word и перенос заголовка таблицы

Есть у меня хитрый документ .docx с длинной таблицей. Для первой строки задано "показывать как заголовок на каждой странице".
Открываю документ в OOo/LOo - всё нормально. Открываю в MSO 2016 - на первой странице заголовок есть, на остальных - нету. Флажок "повторять" на месте, но не повторяется.
В общем, надо снять галку "обтекание таблицы". Почему этого не требуется в свободных офисах - без понятия.

https://forum.dwg.ru/showthread.php?t=127389

понедельник, 16 марта 2020 г.

Bash: разница в днях между двумя датами

В баше есть встроенная арифметика, которая во многих случаях может заменить простой целочисленный калькулятор. Понадобилось высчитать разницу между двумя датами, решается вот так (хотя способ не единственный):

echo $(( ( $(date +%s -d 4/13/2020 ) - $(date +%s -d 3/23/2020 ) )/86400 ))

Функция вычислений $(( выражение ))
Вывод команды $( команда )
Арифметическое операторы и скобки (-/)
Перевести дату, заданную параметром -d в формат UNIX-date (число секунд с начала эры) +%s
Начальная дата в формате mm/dd/yyyy 4/13/2020
Конечная дата в формате mm/dd/yyyy 3/23/2020
Разницу между датами делим на число секунд в сутках 86400

Есть и другие способы такой арифметики, но именно этот первым пришел в голову. Данная команда выдает результат "21", то есть, между 13 апреля 2020 года и 23 марта 2020 года 21 день

По арифметике с временами у меня есть более ранний пост.

пятница, 14 февраля 2020 г.

Этикетки в OpenOffice - без слияния

Или: учимся работать с косвенной адресацией ячеек в электронных таблицах. Основная цель этого поста - показать возможности функции indirect(), ну а выбранный пример - это последний, где я ее применил

В большинстве офисных пакетов предусмотрена такая штука как "рассылка писем", "стандартные письма", "печать слиянием" и т.п. Имеется в виду, что существует некий табличный список, например:

SysName IT# AssetTag Ordinal
cnt300901 18006 JR0046780 1
cnt300911 18007 JR0046781 2
cnt300921 18008 JR0046782 3
cnt300931 18009 JR0046783 4
cnt300941 18010 JR0046784 5
cnt300951 18011 JR0046785 6
cnt300961 18012 JR0046786 7
cnt300971 18013 JR0046787 8
cnt300981 18014 JR0046788 9
cnt300991 18015 JR0046789 10

Где SysName - сетевое имя компа, IT# - внутренний номер для службы ИТ, AssetTag - инвентарный номер, Ordinal - порядковый номер.
(последнее поле по логике должно быть крайним слева, но я в реальном документе добавил его в последний момент, и чтобы не сломать форматирование, добавил справа. впрочем, на теоретические основы этого поста сей факт не влияет)

вторник, 24 декабря 2019 г.

bash: сравнение двоичных файлов с комфортом

Выкачал я с корпоративного FTP установочный образ винды. Не, всё легально - свежая официальная версия для установки внутри конторы. Копирую его на верный Zalman VE-300, гружусь с него на целевом компе и начинаю установку. Получаю славную ошибку 80070570 - "файл поврежден" или как-то так.
Не вдаваясь в лишние подробности, скажу, что образ действительно получился битый и md5 на ftp и у меня не совпали. Сегодня ночью с того же ftp скачался тот же (или перезалитый, чтобы скрыть повреждения?) образ, md5 совпали и я нормально установился с него.
Однако, всё это некрасивая лирика, а мне захотелось прекрасного. Например, как было в далёком DOS-овском детстве, можно было с помощью PCTools или Norton Utilities побайтно сравнивать файлы с большим комфортом, чем позволял штатный fc или cmp. Штатной приблуды в стандартной поставке "искаропки" нет, но свет не без добрых людей... Аж в 2010 году кто-то заинтересовался вопросом и получил на него интересные и полезные ответы.

--
diff  + xxd
Try diff in the following combination of zsh/bash process substitution:
diff -y <(xxd foo1.bin) <(xxd foo2.bin)
Where:
  • -y shows you differences side-by-side (optional).
  • xxd is CLI tool to create a hexdump output of the binary file.
  • Add -W200 to diff for wider output (of 200 characters per line).
  • For colors, use colordiff as shown below.

colordiff + xxd

If you've colordiff, it can colorize diff output, e.g.:
colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)
Otherwise install via: sudo apt-get install colordiff.
binary file output in terminal - diff -y <(xxd foo1.bin) <(xxd foo2.bin) | colordiff
--
There's a tool called DHEX which may do the job, and there's another tool called VBinDiff.
For a strictly command-line approach, try jojodiff.
--