Генерация самоподписанных ключей для Dovecot

Пригодится для локального сервера почты или для тестирования проекта, где нужен свой почтовый сервер. Буду эту тему дальше развивать, следите по тегу postserver.

Алгоритм решения.

1. Создаем приватный ключ для корневого сертификата.
2. Создаем самоподписанный корневой сертификат.
3. Создаем приватный ключ для простого (не корневого) сертификата.
4. Создаем запрос на подпись простого сертификата.
5. Создаем простой сертификат, подписанный с помощью корневого.
6. Копируем приватный ключ для простого сертификата и сам сертификат в /etc/dovecot/private/
7. Устанавливаем файлам права в 400. Т.е. разрешаем чтение только для владельца, остальное запрещаем.
8. Если dovecot будет запускаться под отдельным пользователем, а так и надо, не забываем сменить файлам владельца.

Автоматизация

Поскольку, с первого раза настройка почтового сервера может не получиться [ВОРЧАНИЕ ON] куча инструкций, противоречащих друг другу или неполных, но одной хорошей и конкретной нет [/ВОРЧАНИЕ OFF]

Вот скрипт:

#!/bin/bash

TMPPATH="/tmp/mailkeys"
OUTPATH="/etc/dovecot/private"

echo "Making temp path $TMPPATH..."
mkdir -p "$TMPPATH"
echo "Making output path $OUTPATH..."
mkdir -p "$OUTPATH"

echo "Generate a root private key (rootCA.key)..."
openssl genrsa -out "$TMPPATH/rootCA.key" 2048

echo "Generate a self-signed root sertificate (rootCA.pem):"
openssl req -x509 -new -nodes -key "$TMPPATH/rootCA.key" -days 2048 -out "$TMPPATH/rootCA.pem"

echo "Create private key for the final certificate (dovecot.key)..."
openssl genrsa -out "$TMPPATH/dovecot.key" 2048

echo "Create a certificate sign request (dovecot.csr):"
openssl req -new -key "$TMPPATH/dovecot.key" -out "$TMPPATH/dovecot.csr"

echo "Create final certificate..."
openssl x509 -req -in "$TMPPATH/dovecot.csr" -CA "$TMPPATH/rootCA.pem" -CAkey "$TMPPATH/rootCA.key" -CAcreateserial -out "$TMPPATH/dovecot.crt" -days 2048

echo "Copy key and certificate to $OUTPATH..."
cp "$TMPPATH/dovecot.key" "$OUTPATH/dovecot.key"
cp "$TMPPATH/dovecot.crt" "$OUTPATH/dovecot.crt"

echo "Set permissions..."
chmod 400 "$OUTPATH/dovecot.key"
chmod 400 "$OUTPATH/dovecot.crt"

echo "Complete!"

Скрипт на GitHub

Добавление дополнительных network namespaces к уже настроенным.

Преамбула

Когда-то давно поднимал тему network namespaces (копия), механизма Linux, позволяющего на машине с одним физическим сетевым интерфейсом организовать несколько независимых сетевых стеков, т.е. виртуальных сетевых интерфейсов с разными настройками (IP-адресом, маршрутизацией, правилами IPTABLES и т.д.). Возник вопрос, как к уже настроенным сетевым неймспейсам добавить еще один.

Это не просто, а очень просто.

Итак, имеется система такой вот конфигурации:

А требуется нечто такое:

Добавление дополнительного network namespace’а

1. Создаем новый netspace с именем, например, linkns:

ip netns add linkns

2. Создаем два связанных между собой виртуальных сетевых интерфейса veth2 и veth3:

ip link add veth2 type veth peer name veth3

3. Поднимаем интерфейс veth2, который останется в основном неймспейсе:

ifconfig veth2 0.0.0.0 up

4. Подождали, интерфейс поднялся (для проверки вызываем ifconfig без параметров):

veth2: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 3a:8d:6a:40:b8:38  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

5. Ассоциируем veth3 с новым неймспейсом linkns:

ip link set veth3 netns linkns

6. Добавляем новый интерфейс (veth2) к интерфейсам ранее созданного моста br0

brctl addif <имя_моста> <имя_интерфейса>

brctl addif br0 veth2

Можно проверить список интерфейсов командой:

brctl show br0

Вывод команды:

bridge name     bridge id               STP enabled     interfaces
br0             8000.3a8d6a40b838       no              eth0
                                                        veth0
                                                        veth2

Теперь изначальная схема моста

Превращается в такую:

Включать/отключать физические сетевые интерфейсы или мост не нужно, все было сконфигурированно ранее. Осталось произвести настройки внутри namespace linkns:

1. Поднимаем сетевой интерфейс veth3 внутри неймспейса linkns и присваиваем ему IP.

ip netns exec linkns ifconfig veth3 192.168.0.21 netmask 255.255.255.0

2. Прописываем внутри нетспейса маршрут по умолчанию:

ip netns exec linkns ip route add default via 192.168.0.1 dev veth3 src 192.168.0.21

3. Поднимаем внутри namespace’а loopback-интерфейс:

ip netns exec linkns ifconfig lo 127.0.0.1

4. Если нужно, добавляем файлы конфигурации для namespace’а, например resolv.conf (копия)

5. Проверяем работоспособность неймспейса.

Проверяем сетевые устройства:

ip netns exec linkns ifconfig

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.21  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::8c12:30ff:feda:fe06  prefixlen 64  scopeid 0x20<link>
        ether 8e:12:30:da:fe:06  txqueuelen 1000  (Ethernet)
        RX packets 55  bytes 4391 (4.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17  bytes 1458 (1.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ping:

ip netns exec linkns ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=111 time=13.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=111 time=11.6 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=111 time=12.0 ms
...

и интернет:

ip netns exec linkns lynx google.com

ФАНФАРЫ!

Network namespeces, resolv.conf и прочие файлы конфигурации.

Когда писал заметку о сетевых неймспейсах, т.е. о том, как на одном компьютере с одной физической сетевой картой организовать несколько виртуальных сетевых интерфейсов с разными IP (копия), забыл упомянуть о маленьком, но важном моменте.

Все созданные виртуальные сетевые стеки, а эмулируется не только сетевая карта, но и весь стек вместе с маршрутизацией, правилами IPTABLES и т.д., можно и нужно по разному конфигурировать. И, естественно, есть возможность создать разные файлы конфигурации для разных namespaces.

Файлы конфигурации хранятся в каталоге /etc/netns/<имя_namespace>

Различный resolv.conf для разных namespace’ов.

Например, в основном неймспейсе есть файл /etc/resolv.conf в котором прописаны адреса DNS для основной системы:

nameserver 10.10.0.1
nameserver 10.10.0.200

И пусть в системе существует второй namespace с именем linkns и для него надо прописать DNS от Google (8.8.8.8 и 8.8.4.4):

1. Создаем каталог /etc/netns/linkns.
2. В каталоге создаем (или копируем готовый из /etc) файл resolv.conf.
3. Записываем в файл новые адреса DNS:

nameserver 8.8.8.8
nameserver 8.8.4.4

Аналогично можно поступить и с другими файлами конфигурации, например правилами IPTABLES (если ваша система поддерживает конфигурацию фаервола через конфигурационные файлы).

Сортировка многомерного массива в PHP.

Пояснение к задачке «Список стран».

Преамбула

Итак, имеется довольно простая учебная задача, отобразить на странице список стран с флагами, кодами ISO и наименованиями на английском и русском, необходимо обеспечить сортировку по столбцам базы данных (таблицы). В качестве хранилища данных выбираем текстовый файл формата CSV с разделителями «точка с запятой» (;). Готовый файл можно взятьздесь или здесь. Для отображения флагов, понадобятся соответствующие картинки. Можно взять здесь или здесь

Форма ввода

Для выбора поля, по которому сортировать данные, а также, как их сортировать (по возрастанию или убыванию), необходима форма. Добавляем код, генерирующий форму в функцию print_sortform(), которая будет вызываться после функции print_top(), которая, в свою очередь, печатает заголовок HTML и заголовок таблицы.

Код функции

Ранее в скрипте объявляем две глобальных переменных

$field = "ISOA2"; //поле, по которому будем сортировать
$direction = 0; //направление сортировки: 0 - по возрастанию, 
			//иначе - по убыванию

и два массива в самой функции — $fields и $sortmess, содержащие идентификаторы полей и информацию для отображения их в форме. Далее в цикле foreach формируем набор из переключателей (radiobutton) для выбора нужного поля.

Остальное в функции достаточно тривиально.

Загрузка данных

Данные будем хранить в многомерном массиве вот такой структуры:

Функция загрузки:

Загрузка данных

Заводим глобальную переменную $errmsg для того, чтоб туда писать сообщение об ошибке, и глобальный массив $data для нашей таблицы (БД), да, очевидный минус — я не стал париться с количеством элементов разбитой в массив строки. Но для PHP это не так, чтобы и критично. Если что просто вывалится с ошибкой. Некоторые вообще не заморачиваются обработкой ошибок в PHP, а отдают все на волю интерпретатора.

Далее, читаем построчно, разбиваем строку на составляющие и дописываем в массив ассоциативный массив с указанными полями, соответственно, в каждом элементе массива $data будет ассоциативный массив с данными, по одному на строку. В итоге получится многомерный (вложенный) массив (в терминах PHP, в других языках «многомерный» может означать несколько другое, по мне бы так термин «вложенный» был бы лучше).

Передача параметров для сортировки массива

Передаем их в GET-параметрах. Значения параметров пишем в глобальные переменные.

if (isset($_GET['sort']))
{
	$field=$_GET['sort'];
}
if (isset($_GET['direction']))
{
	$direction=$_GET['direction'];
}

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

Сортировка многомерного массива по указанному полю

В PHP имеется функция сортировки usort(); которая принимает массив данных, в качестве первого параметра, и функцию сортировки в качестве второго. Функцию сортировки описывает пользователь. В нее передается два элемента массива, а пользователь описывает алгоритм сравнения, таким образом, чтобы пользовательская функция выдавала 3 значения: -1: 1-й элемент < 2-го элемента, 0: 1-й элемент == 2-му элементу, 1: 1-й элемент > 2-го элемента. Пишем соответствующую пользовательскую функцию:

function compare ($a, $b)
{	
	global $field;
	global $direction;
	global $errmsg;
	
	if (!array_key_exists($field, $a))
	{
		$errmsg = "Field $field not found";
		return 0;
	}
	
	if ($direction == 0)
	{
		return strnatcmp($a[$field],$b[$field]);
	}
	else
	{
		return (strnatcmp($a[$field],$b[$field])*-1);
	}
}

1. В переменные $a и $b передаются два элемента массива, который надо отсортировать.

2. Далее, подключаемся к ранее заданным глобальным переменным:

$field
— поле таблицы (БД), по которому будем сортировать.
$direction — направление сортировки — 0 по возрастанию, другое значение — по убыванию.

3. Проверяем, есть ли соответствующий ключ в массиве, а это надо проверить, т.к. ключ передается в запросе, а в запросе может придти не то, что ожидает скрипт.

if (!array_key_exists($field, $a))
...

4. Проверяем, как сортировать и сортируем с помощью функции strnatcmp(). От стандартной strcmp() она отличается тем, что если ей попадается набор чисел в виде строк, то она их будет сортировать в формате, обычном для человека:

strnatcmp():

4
8
10
12
16
20
24
28

strcmp():

10
100
104
108
112
116
12
120
124

strnatcpm()strcpm()), как раз возвразащают 0, если аргументы равны, -1 если 1-й > 2-го, и 1, если 2-й > 1-го.

Чтобы поменять порядок сортировки на обратный, достаточно поменять результат работы функции на обратный, что можно сделать, умножив результат функции strnatcmp()/strcmp() на -1:

(strnatcmp($a[$field],$b[$field])*-1)

Результат

Скриншот:

Исходник
Посмотреть, как работает

Известные баги

— Нет флагов некоторых редких стран (может быть потом сам нарисую).
— Почему-то страны на русскую букву Р криво сортируются, если сортировать по русским наименованиям стран.

Источники

usort()

Grep и awk для Windows

Понадобилось тут на винде работать с некоторыми логами. И Линукса под рукой не было, нашел, в общем grep и awk под винды, вроде, из официального SourceForge GNU.

Правда, официальные версии сделаны кривовато, в том смысле, что когда хочешь скачать только бинарники, в архиве оказываются только EXE (плюс куча ненужного мусора), но не оказалось DLL, которые нужны экзешникам. Скачиваешь инсталлер — он ставит и EXE и DLL, но в PATH надо каталог вручную добавлять.

В общем, я все это дело перепаковал, в обычный RAR SFX архив, который распаковывается в %WINDIR% (обычно C:\Windows), никакого инсталлятора/анинсталлера не приделывал, и вообще это для себя и стаи товарищей. Хотите качайте, хотите нет.

Содержимое архива:

awk.exe
egrep.exe
fgrep.exe
gawk-3.1.6.exe
gawk.exe
grep.exe
libiconv2.dll
libintl3.dll
pcre3.dll
pgawk-3.1.6.exe
pgawk.exe
regex2.dll

Работает в Windows 7 x86, Windows 7 x64 и в Windows XP. В десятке, наверное, работает, но я не проверял.

Скачать grep+awk для Windows

GNU grep 2.5.4
GNU Awk 3.1.6

C mega.nz

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

Коды стран (ISO 3166-1), CSV, XLS

Искал готовые справочники в удобоваримых форматах, не нашел. А на сайте самой ISO за скачивание в CSV или XLS надо платить деньги (тут должна быть реплика известного сумасшедшего Вениамина, в стиле, » ну каковы же сволочи») В общем, хочешь сделать хорошо — сделай это сам.

Скачать справочники кодов стран ISO

Состав архива:

iso.csv — только двухбуквенные (Alpha-2) коды и наименования стран на английском, разделитель — точка с запятой (;). Отсортировано по коду.

Пример:

Andorra;AD
United Arab Emirates;AE
Afghanistan;AF
Antigua and Barbuda;AG
Anguilla;AI
Albania;AL

isofull.csv — Код Alpha-2 (двухбуквенный), Alpha-3 (трехбуквенный), числовой, название на английском, название на русском. Отсортировано по коду. Формат — UTF-8, разделитель — точка с запятой.

Пример:

AD;AND;20;Andorra;Андорра
AE;ARE;784;United Arab Emirates;Объединенные Арабские Эмираты
AF;AFG;4;Afghanistan;Афганистан
AG;ATG;28;Antigua and Barbuda;Антигуа и Барбуда
AI;AIA;660;Anguilla;Ангилья

isofull.xls — то же самое, только в формате Microsoft Excel 2003.

Скачать с mega.nz, RAR, 20 Кб

ЗЫ. Отдельный геморрой вышел с русскими названиями стран. На сайте ISO их бесплатно нету, только на французском (тьфу, буэ), ладно, полез в конторе в «Гарант» (это типа юридическая БД, конкурент «Консультанта+»). Оказалось, что у них, сцуко, коды не обновлялись с прошлого века — Югославия есть, а вот всяких Сербий и Черногорий нет. Пришлось сверять два списка по кодам и гуглить недостающие страны, штук семь.

Sony Vegas, два видео в одном кадре, два видео воспроизводящихся одновременно.

Преамбула

На Ютубе куча мануалов разной степени полезности, как можно показывать на одном экране (в одном кадре) в Vegas 3, 10, 100500 видео одновременно, как сделать «видеостену». Но хрен кто нормально объяснил, как можно разделить экран только на две части, и добиться того, чтоб исходные видео не превратились в кашу, не были слишком мелкими и т.д. А оказывается, есть нюансы, которые многими «профессионалами» и «видеоблогерами» по Vegas не замечены.

Чего требуется добиться?

Добиться надо (если абстрагироваться от содержания), показа зрителю двух процессов одновременно. В одной половине кадра происходит один процесс, во второй — параллельно ему следующий. Например, это может быть гость в студии (и видимый одновременно ведущий), прямая трансляция с одновременным комментированием ведущего, или просто запись двух мониторов. Вот пример с ютуб-канала:

Подготовка

1. Подбираем видео примерно одинакового разрешения, нет одинакового, ориентируемся на большее разрешение.
2. ОК, видео есть, в примере будет два с одинаковым разрешением. Смотрим в MediaInfo:

Width                       : 640 pixels
Height                      : 360 pixels
Display aspect ratio        : 16:9
Frame rate                  : 29.970 (30000/1001) FPS

Нас интересует разрешение и частота кадров.

Умножаем значение высоты и ширины на 2, чтоб показать исходные видео в полном размере 640x2=1280 360x2=720, это параметры для будущего проекта Vegas

3. Запускаем Vegas и создаем новый проект, взяв за основу вычисленные ранее параметры. У нас даже готовый пресет нашелся.
4. Обязательно снимаем галочку Настроить источник мультимедиа для лучшего соответствия проекту или настройкам визуализации. Т.к. нам не надо, чтоб Vegas подтягивал наши видео под размер проекта (1280x720), а обрабатывал их в оригинальном разрешении.

5. Создаем в проекте пустую видеодорожку, вставляем туда пустое событие:

6. Растягиваем его, можно побольше, потом подгоним.

7. Настраиваем сетку, для удобства размещения видео. Идем в Настройки —> Параметры, переключаемся на вкладку Видео, устанавливаем количество клеток сетки по вертикали и по горизонтали. У нас 2 видео, потому оставляем 2 ячейки. В переводе, похоже, перепутаны горизонталь и вертикаль.

8. Включаем сетку в разметке. Нажимаем треугольник (меню) рядом с кнопкой , выбираем Сетка:

Сетка появляется:

9. Добавляем еще две видеодорожки и размещаем на них видео. На вопрос, подгонять ли проект к видео, отвечаем Нет!


10. Удаляем аудиодорожки, когда будем совмещать видео, они будут только мешать, т.к. при наложении образуется какофония, так что если нужен звук — отдельно совмещаем его в аудиоредакторе, а потом аудиодорожкой добавляем в проект Vegas.

Далее под катом

Проект котов готов — можно рендерить.

Прямая ссылка: https://youtu.be/WsqU-xaYAu0

Запись с экрана в Slackware Linux

Преамбула

Итак, продолжаем разбираться с записью с экрана в Linux.
Для начала, я почитал обзор Losst на соответствующие программы, и вот, что имею сказать:

RecordMyDesktop — кривой и глючный, пропускает кадры, пишет только в формате OGV, который ни одна собака не поддерживает.

Vokoscreen — не собрался, не смог найти файл своего же исходника, хотя и файл был и права на месте.

ScreenStudio — для потокового видео, мне лично не подходит.

Kazam ScreenCaster — нет возможности записи конкретного окна или произвольной области экрана.

Byzanz-record — только командная строка (да, хочу программу с графическим интерфейсом для работы с видео).

VLC Media Player — записывает, но опять же, весь рабочий стол

OBS — вообще не про «запись с экрана», а про стриминг, так что если там запись с экрана и есть, то в качестве приятного бонуса, для простой записи с экрана, это из пушки по воробьям.

Так что остановился на Simple Screen Recoder.

Установка Simple Screen Recoder

В Slackware он штатно устанавливается через sbopkg, вводим в поиске ssr и ставим, из зависимостей нужен ffmpeg.

Работа с программой

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

На первом шаге выбираем, что будем записывать — весь десктоп, произвольную область экрана или конкретное окно, или записывать, следуя за курсором. Можно записывать и OpenGL’ные игры. Также можно включить запись звука и записывать или убрать из записи курсор.

На втором шаге выбираем кодек и формат файла, основные форматы следующие:

MKV (Кодеки H.264, VP8, Theora)
MP4 (H.264)
WebM (VP8)
OGG/OGV (Theora)

Также выбираем файл, в который будем писать, и отрубаем пропуск кадров.
Писать лучше в MP4, т.к. его любой видеоредактор поддерживает.

Можно в списке кодеков и форматов выбрать Other… и будет доступна тонкая настройка контейнера (формата файла) и кодека.

На третьем шаге включаем запись и сворачиваем программу (она спрячется в трей).

Ошибка Codec H.264 (not installed)

Причины ошибки:

1. Кодек не установлен, заходим в sbopkg и устанавливаем пакеты:

aom (выбираем multimedia/aom в меню sbopkg)
libass
libwebp
x264 (выбираем multimedia/x264 в меню sbopkg)
x265
ffmpeg4

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

В общем, поступаем как в заметке Перекодировка OGV в MP4 и решение ошибки Unknown encoder ‘libx264’ в Slackware Linux (копия)

Все работает:

ФАНФАРЫ!

Ссылка на обзор Losst’а

Лучшие программы для записи видео с экрана Linux

Распаковка инсталлятора (на примере инсталлятора Foxit PDF Reader)

Преамбула

В заметке про пропавший из Foxit PDF Reader PDF-принтер (копия) я упомянул, что хотел расковырять старый инсталлятор, чтоб принтер оттуда вытащить (если это возможно).

Пользователь спросил, а как, собственно, распаковать инсталлятор, что ж, постараюсь кратко пояснить.

Примечание: это не инструкция «как распаковать совсем вообще любой инсталлятор», ибо типов инсталляторов довольно много и появляются новые, а бывают вообще самописные со свистелками и вувузелами, так что покажу общий подход и совсем простой пример, на том же инсталляторе Foxit PDF Reader’а

Ссылки на все инструменты в конце заметки.

Определение типа инсталлятора

Как я сказал, типов инсталляторов очень много: Nullsoft Installer, WISE, Inno Setup, Microsoft Installer (MSI), InstallShield, и это те, которые я вспомнил просто так, не посещая гугль.

Соответственно, надо определить, с чем мы имеем дело. Как говорится, знай своего врага в лицо. И это не только первый принцип разведчика, но и первый принцип реверсера, т.е. того, кто занимается обратным инженерингом, или, говоря вульгарно, взломом, крякингом программ. За «крякиннг», котики, от настоящего реверсера можно получить кружкой пива по голове. Крякают утки, а мы будем исследовать. Но что-то я запизделся.

С виду тип инсталлятора определить довольно непросто (хотя гуру могут), так что воспользуемся специальной программой DiE (Detect it easy) 2.05, которая пришла на смену PEiD. Что это такое? Это специальная утилита, способная определять что за экзешник перед нами: тип инсталлятора (если это инсталлятор), тип компилятора, которым экзешник скомпилирован, EXE-упаковщик или т.н. «навесную защиту», если экзешник упакован или защищен от взлома специальной программой. Делает это он также, как антивирус определяет наличие вируса, по сигнатурам, т.е. определенным последовательностям байт, характерных для того или иного компилятора, упаковщика, инсталлятора и т.д.

Итак, запускаем DiE и скармливаем ей наш инсталлятор:

Как видим, инсталлятор создан в Inno Setup, осталось найти распаковщик, и в данном случае это просто (потому и взял, как простой пример). Распаковщик есть. Кладем инсталлятор в отдельную папку, копируем распаковщик в нее же, или же в папку, которая есть в переменной PATH и выполняем:

innounp -x FoxitReader806.909_prom_L10N_Setup.exe

Идет распаковка:

В результате образовалась структура каталогов, характерных для этого инсталлятора, где каталог {app}, то, что будет распаковано в каталог программы (например C:\Program Files\Foxit Reader), каталог {sd}ProgramData, а каталог {tmp}, то, что будет распаковано во временный каталог системы. К тому же есть и install_script.iss — скрипт установщика (в его формате, и оттуда можно почерпнуть информацию, как и что делает установщик, если знаете формат скрипта).

А еще его можно интегрировать в Far-manager, см. Readme.

Выводы

Ну вот, это был маленький урок реверсинга для комментатора, определили установщик и его распаковали.
Заодно, если вы хотите заняться реверсингом, рекомендую посетить сайт https://exelab.ru/

Скачать

DiE (Detect it easy):
На Exelab
C Mega.nz

innounp:
Официальный сайт
Мой пакет (innounp распаковывается в C:\Windows)

Перекодировка OGV в MP4 и решение ошибки Unknown encoder ‘libx264’ в Slackware Linux.

Преамбула

Пришлось некоторое время решать проблемы с записью видео в Linux. Изначально задача была в записи видео с экрана, но в процессе решения добавились и web/ip-камеры (заодно уж), и общие проблемы с перекодировкой видео из одного формата в другой. Начнем как раз с конца, т.е. с перекодировки.

Леша уже плюнул на попытки заставить непокорную софтину записывать для начала экран в удобоваримом формате MP4, и прислал мне ролик в формате OGG (ну не OGG, OGV), чтоб я разобрался с его перекодированием во что-то более удобоваримое, т.к. не один из наших видеоредакторов формат OGV (кстати, открытый) «из коробки» не поддерживал.

В качестве видеокодека в формате OGV используется кодек Theora, а в MP4 AVC/H.264

OGG в OGV

OGG — изначально, открытый звуковой формат, разработанный как альтернатива закрытым (WMA, MP3). Через некоторое время, данный формат был расширен с добавлением поддержки видео. Но некоторые (несознательные) линуксовые программы пишут видео, а файлы создают с расширением .ogg. Линуксовому софту, типа плееров, вообще на это плевать, но линуксовому софту всегда было плевать на расширения имени файлов, а вот винде нет. Потому, если вам прислали видео в файле с расширением .ogg, то попробуйте поменять расширение на .ogv, скорее всего файл нормально откроется. В K-Lite Mega Codec Pack и в VLC для Windows поддержка, что OGG, что OGV есть точно.

Но все-таки вернемся в Slackware и к преобразованию форматов.

Дополнительные программы, кодеки, библиотеки

В связи с диким онанизмом на «авторские» «права» и зоопарком форматов видео/аудио в Линуксе преобразование одного формата в другой превращается в наркоманский квест. У нас было десять мегабайт библиотек, две сотни кодеков, пакет с разными пакетами, 200 грамм укуреных лицензий… Тьфу, к делу.

Для установки некоторых необходимых пакетов можно воспользоваться sbopkg.

Вообще, для работы с видео и аудио используется программа ffmpeg (v3), но не спешите ставить ее из «официального» репозитория Slackware, как оказалось, чтоб все заработало, пришлось переустанавливать из альтернативного.

Пока вводим в поиске и ставим:

aom (выбираем multimedia/aom в меню sbopkg)
libass
libwebp
x264 (выбираем multimedia/x264 в меню sbopkg)
x265
ffmpeg4

ffmpeg (v3) у меня уже был установлен ранее, так же из официального репозитория Slackware. А вот и зря.

Команда для перобразования

ffmpeg -i input.ogv \
       -c:v libx264 -preset veryslow -crf 22 \
       -c:a libmp3lame -qscale:a 2 -ac 2 -ar 44100 \
       output.mp4

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

Ошибка Unknown encoder ‘libx264’

Как я сказал ранее, ffmpeg из репозитория sbopkg у меня уже стоял. Сначала я подумал, что поможет его полная переустановка с пересборкой пакета (мало ли, свежеустановленные кодеки не видятся). Не помогло.

Решение нашлось здесь

В общем да, из-за голливудских уродов патентных ограничений и прочей юридической хуйни, официальный пакет ffmpeg в Slackware не включает поддержку H.264. Но, слава Великим Древним, проблему решили без нас, и даже в опциях компиляции ковыряться не нужно:

Just to clarify, you’d want the «restricted» ffmpeg that Alien Bob offers, as that includes support for various things that have patent restrictions (like x264 encoding).

Есть готовый альтернативный пакет:

Скачать
Копия на Mega.NZ (+ копия остальных пакетов)

Конверсия (пережатие) DVD в MKV без потери качества

Преамбула

Понадобилось вот в процессе восстановления древнего DVD (это отдельная история) перегнать формат DVD во что-то более удобоваримое, перелопатил кучу конвертеров, то кривые, то косые, то платные, то с невменяемыми пресетами и настройками — например оригинальное DVD-разрешение 720x576, а у конвертера или 1920x1080 или, блин, 320x240. Были еще уродливо пережимающие звук или невменяемо долго работающие.

Наконец, нашел.

MakeMKV

Все опции формата программа берет из самого DVD:

Видео:

Данные оригинального DVD:

Format                : MPEG Video
Format version        : Version 2
Width                 : 720 pixels
Height                : 576 pixels
Display aspect ratio  : 4:3
Frame rate            : 25.000 FPS

Аудио:

Данные оригинального DVD:

Format            : AC-3
Format/Info       : Audio Coding 3
Commercial name   : Dolby Digital
Bit rate          : 256 kb/s
Channel(s)        : 2 channels
Channel layout    : L R
Sampling rate     : 48.0 kHz

Программа маленькая (13 Мб) и абсолютно бесплатная. Работает, начиная с Windows XP (и выше), под x86 и x64 архитектуры

Скачать

Официальный сайт: https://www.makemkv.com/
Копия

Linux. Вывод одновременно на консоль и в файл. Команда tee.

Преамбула

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

В Linux нашлось готовое решение: команда tee

Синтаксис и краткое описание

Команда tee делает следующее — берет переданный ей от другой команды или потока команд (pipe) вывод, пишет его в файл и одновременно выводит на stdout. Вывод на stdout можно переопределить дальше, например, устроить вывод на отдельный терминал, но об этом далее.

Общий синтаксис таков:

<команда>|tee [параметры] файл1 [файл2 файл3 ...]

где:

<команда> — любая команда оболочки Linux
| — обозначение перенаправления, вывод команды <команда> передается tee
файл1 [файл2 файл3 ...] — файлы, в которые необходимо вести запись.

Простой пример

ls | tee log.txt

Выведет список файлов текущего каталога на консоль и одновременно сохранит вывод в файл log.txt

Если добавить к команде tee параметр -a, то информация будет дозаписываться в указанные файлы. Без этого параметра файлы будут перезаписаны.

Демонстрация

Чтобы не использовать какие-то команды, создадим тестовый скрипт tscript, десять раз выводящий на консоль случайное число:

#!/bin/bash

SEC=1
CTR=10

echo "Test script, write to STDOUT random number after $SEC sec."

while [ "$CTR" -ne 0 ];do
    let "CTR=CTR-1"
    printf '%x Number: %x\n' $CTR $RANDOM
    sleep $SEC
done

echo "Complete!"

Теперь в каталоге со скриптом выполним:

./tscript | tee log.txt

На экран будут выведены случайные числа, они же будут в файле log.txt

./tscript | tee -a log.txt

Аналогично, только log-файл будет дополнен новыми случайными числами.

После команды tee, вывод можно перенаправить и дальше, например, можно совместить этот пример с выводом на другой терминал (копия):

./tscript | tee ./test.log >/dev/tty4

Можно пойти дальше и скрипт сделать автономным, «демонизировать» его, тогда можем, запустив следующую команду, или использовав ее в скрипте, освободить и/или текущую консоль или запускающий скрипт для дальнейших действий:

./tscript | tee ./test.log >/dev/tty4 &

Вывод на консоль четвертого терминала (tty4):

Вывод в test.log:

Test script, write to STDOUT random number after 1 sec.

9 Number: 2378
8 Number: 2cf9
7 Number: 132c
6 Number: 4a3c
5 Number: 6367
4 Number: 3384
3 Number: 5660
2 Number: 6655
1 Number: 6141
0 Number: 1870
Complete!

Тестовый пример на GitHub

Дополнительно

Кстати, обязательно загляните, там есть дополнительные примеры использования:

1. Команда Tee в Linux: Примеры Использования (копия).

Linux, узнать текущий терминал, узнать свой терминал, узнать текущий tty.

Команда, вы будете смеяться, очень простая:

tty

Результат работы на локальном терминале (с консоли, «с клавиатуры») и «без иксов»:

/dev/tty1

Эмуляторам терминала (из иксов или PuTTY), естественно, выделяется виртуальный терминал:

Иксы:

PuTTY:

В некоторых встраиваемых системах команда tty может не работать.

Сохранить текущий tty в переменную скрипта

В переменную скрипта можно сохранить результат выполнения команды:

#!/bin/bash

CUR_TTY=`tty`
echo $CUR_TTY

Вывод (для первого случая):

/dev/tty1

Обновление своего плагина для Firefox

Преамбула

В прошлом году писал заметку Делаем свое расширение для Firefox (копия), теперь краткая инструкция, как его обновить, если внесены изменения.

Загрузка обновления на сайт дополнений

1. Правим код, не забываем изменить номер версии в manifest.json, добавляем нужные файлы, упаковываем в ZIP-архив, переименовываем файл в *.xpi

2. Идем на https://addons.mozilla.org/ru/developers, жмем большую кнопку Отправить или управлять расширениями, логинимся.

3. Жмем в верхнем меню Мои дополнения, проваливаемся сюда:

.

Жмем Новая версия.

4. Загружаем файл дополнения кнопкой Выбрать файл…

У меня проверка прошла с первого раза.

5. Далее попадаем сюда:

Нас спрашивают, не использовали ли мы обфускаторы кода. Мы не использовали, если была использована библиотека jquery-?.?.?.min.js, чей код ужат, чтоб занимал меньше места — ничего страшного, Мозилла автоматом определяет, что используется известная версия библиотеки. Жмем Продолжить, попадаем на страничку, где можно ввести описание изменений (видно всем пользователям) и комментарий для проверяющих.

Одобрение, видимо из-за небольших изменений в дополнении, пришло практически моментально, похоже, в автоматическом режиме.

Обновление дополнения External IP Geo IP для Firefox.

В прошлом году сделал вот такое вот дополнение для Firefox (копия) и обнаружился в нем досадный баг.

Если IP не был известен сайту https://api.myip.com/, то он, в качестве кода страны, возвращал XX, а для этого кода в плагине не было иконки, соответственно, на панели браузера кнопка оставалась без иконки, и в панели самого плагина иконка не отображалась.

Исправил.

Отключить «Недавние документы» («Последние файлы», «Recent Docs») в Windows 7

1. Жмем по пустому месту в панели задач, идем в Свойства

2. Переключаемся на вкладку Меню «Пуск» и снимаем галочку Хранить и отображать список недавно открывшихся элементов в меню «Пуск» и на панели задач

3. Можно также добавить в Реестр следующий параметр (сохранить следующий код в файл с расширением .reg и запустить):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoRecentDocsMenu"=dword:00000001

NoRecentDocs.reg на GitHub

Это отключит меню «Последние файлы» и заблокирует вышеупомянутую галочку

4. Можно еще сходить в C:\Users\<имя пользователя>\Recent\ и подчистить там лишние ярлыки.

Как сделать favicon для сайта.

Преамбула

Favicon (от FAVorite ICON) называют иконку, отображающуюся на вкладке (или в окне, зависит от браузера) с открытым сайтом.

Вот на моем пока стандартная иконка WordPress:

Делаем свою.

Форматы файлов для favicon

Изначально для favicon был предусмотрен только один формат ICO, однако, современные браузеры поддерживают и другие форматы.

PNG: десктопные браузеры (Chrome, Safari, Firefox, Opera, Internet Explorer 11 и некоторые другие), а также браузеры для Android.

GIF: Chrome, Safari, Firefox, Opera

Анимированный GIF: Firefox, Opera. Однако, использовать анимированный GIF не рекомендуется — будет мельтешить и надоедать, да и это не самый легкий формат для картинок.

SVG (векторные изображения): Safari

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

Рекомендуемые разрешения для favicon

Если сравнивать с иконками для своего приложения под Windows (копия) у favicon рекомендуемых расширений целый зоопарк, хотя изначально предусматривалось только разрешение 16x16.

Десктопные браузеры:

16x16
32x32
48x48

Устройства на Android (в зависимости от разрешения экрана и количества точек на дюйм):

36x36
48x48
72x72
96x96
144x144
192x192

Устройства Apple:

— от 57x57 до 76x76

Устройства Apple с дисплеем Retina:

— от 114x114 до 180x180

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

Wordpress запрашивает у пользователя PNG с расширением 512x512, сохраняет его и дополнительно генерирует картинки со следующими разрешениями: 32x32, 150x150, 180x180, 192x192, 270x270, 300x300. Причем, в коде страницы прописываются сначала файлы с разрешением 32x32 и 192x192 (для десктопных и андроидных браузеров соответственно), потом 180x180 как иконка для девайсов от Apple и иконка 270x270 для использования в качестве закрепленной иконки в плиточном интерфейсе Windows 8.1

Как сделать favicon

Для начала понадобится какое-нибудь изображение, лучше всего квадратное, в смысле в квадрат вписывающееся. Я не долго думая, просто взял любимый векторный редактор и нарисовал простенький логотип для иконки, пока размером 512×512. Впрочем, пока готовишь изображение, размер не особо важен, наоборот, чем больше, тем лучше, особенно, если работаешь в растре. Векторному редактору-то фиолетово, он выходное изображение может в любом разрешении без проблем создать.

Установка favicon в WordPress

Для современных версий движка WordPress на моменте создания изображения все сложности практически и заканчиваются:
Favicon в WordPress
К сожалению, WordPress не умеет генерировать иконку в формате ICO, но это легко исправить. Таковую иконку легко собрать вручную, или же сгенерировать с помощью генератора favicon’ов (онлайн).

Генерация favicon онлайн

Есть, например, такой вот генератор favicon: https://realfavicongenerator.net/. Он генерирует иконки сразу на все случаи жизни: для десктопных браузеров и поисковиков, для кнопки сайта в iOS, иконку сайта для Android Chrome, иконку для плиточного интерфейса Windows 8.1 и 10, и даже векторную иконку для Safari (MacOS). В процессе генерации можно покрутить разные параметры для каждого случая в отдельности (размер, цвет фона и т.д.)

В конце вы получаете архив с иконками, вебманифест сайта для Android-устройств, browserconfig.xml для IE11 (Win 8.1) и Edge (Win 10), а такжe HTML-код, который необходимо вставить в секцию <head></head> на страницы сайта:

<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#000000">
<meta name="theme-color" content="#ffffff">

Создание favicon вручную

Постараюсь описать «на все случаи жизни». Пусть изображения (кроме ICO) будут находиться в /img/icons (измените путь на ваш).

Современные десктопные браузеры (с поддержкой PNG):

1. Экспортируем исходное изображение как PNG с разрешениями 16x16, 32x32, 48x48 и именами, пусть fi-16x16.png, fi-32x32.png, fi-48x48.png
2. В секции <head></head> прописываем теги:
<link rel="icon" type="image/png" sizes="48x48" href="/img/icons/fi-48x48.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/icons/fi-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/icons/fi-16x16.png">

3. Заливаем файлы на сайт. Далее не буду упоминать, что все теги прописываются в <head></head>, а файлы надо не забыть залить на сайт 🙂

Интересно, что автоматический генератор favicon и движок WordPress игнорируют разрешение 48x48. Почему так я не совсем понял, если у кого-то есть соображения на сей счет, высказывайтесь в комментариях.

Классический favicon.ico для поддержки устаревших браузеров и для поисковиков:

По идее, современные браузеры тоже должны поддерживать формат ICO, так что можно пропустить предыдущий пункт, хотя я перестраховался и оставил его.
1. Экспортируем исходное изображение как PNG с разрешениями 16x16, 32x32, 48x48
2. Далее потребуется инструмент для сборки иконки icon sushi Копия
3. Открываем все нужные изображения (File —> Open…)
4. Выделяем их в окне программы.
5. Сохраняем иконку (File —> Save as Multiple Icon) под именем favicon.ico
6. Заливаем ее в корень сайта.
7. Добавляем теги:
<link rel=”shortcut icon” href=”/favicon.ico” type=”image/x-icon”>
<link rel=”icon” href=”/favicon.ico” type=”image/x-icon”>

Для WordPress добавляем в раздел между тегами <head></head> файла header.php текущей темы (Внешний вид —> Редактор тем, в Редакторе ищем файл header.php) следующий код:

<link rel=”shortcut icon” href=”<?php echo get_site_url(); ?>/favicon.ico” />
<link rel=”icon” href=”<?php echo get_site_url(); ?>/favicon.ico” />

Остальные устройства

Источники

1. Манифест? А? Что? Зачем?
2. Пишем правильный манифест для сайта
3. get_site_url()
4. Favicon сегодня: форматы, поддержка, автоматизация (копия)
5. Как сделать фавикон для сайта

Пропал PDF-принтер и Foxit PDF Creator от Foxit

Но мы запасливые.

Преамбула

Сегодня переустанавливал клиентам винды, ставил бесплатный Foxit PDF Reader, и с удивлением обнаружил, что в новых версиях из комплекта софтины пропала возможность создавать PDF плагинами для Word и Excel, также пропал и PDF-принтер.

Видимо их профессиональная программа Phantom хреново продавалась. И Foxit на этой почве скурвился.

Со злости я даже хотел расковырять инсталлятор и выдернуть оттуда принтер. Но решил лицензионное соглашение не поломать, а перепрыгнуть.

Лицензионное соглашение не мешает распространять старые версии, с принтером, креатором и прочими свистелками. Тем более, что программа работает на XP, и, скорее всего, я выпущу небольшой ролик для развития темы (PDF, DJVU и FB в Windows XP).

А пока нате вам.

Скачать

Foxit Reader v. 8.3.2.25013

Проверка на битые сектора (bad-блоки) диска в Linux.

Преамбула

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

Проверка и получение списка bad-блоков

Естественно, все команды выполняются от root или через sudo.

badblocks -v /dev/sdc2 >/tmp/badsect.txt

где:
-v — подробный вывод информации о процессе. Правда слово «подробный» здесь некоторое преувеличение. В процессе вывод будет такой:

Checking blocks 0 to 1805311
Checking for bad blocks (read-only test):

Но, без ключа -v программа будет молчать, как партизан на допросе.

/dev/sdc2 — раздел, который необходимо проверить.
/tmp/badsect.txt — куда выводить список bad-секторов.

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

Служебные сообщения она выводит на stderr, так что «наблюдать» за процессом перенаправление вывода в файл не помешает

Если после окончания работы утилиты вывод такой, то все OK, битых секторов нет:

Checking blocks 0 to 1805311
Checking for bad blocks (read-only test): done
Pass completed, 0 bad blocks found. (0/0/0 errors)

Примечание: Если у вас только консоль, посмотреть список разделов можно командой

ls /dev/sd*

Вывод:
/dev/sda /dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdc /dev/sdc1 /dev/sdc2

Или через fdisk:
fdisk -l

Пометка найденных сбойные секторов

Чтобы ОС не могла записать данные в битый сектор.
Примечание: способ работает только на ext файловых системах (ext2, ext3, ext4)

e2fsck -l /tmp/badsect.txt /dev/sdc2

где:

-l взять список bad-блоков из файла и пометить их.
/tmp/badsect.txt — файл со списком bad-секторов
/dev/sdc2 — раздел, с которым надо работать.

Плюсы:
+ способ работает почти во всех линуксах
Минусы:
— работает только на линуксовых файловых системах (fsck не понимает ключ -l)
— если битых секторов слишком много, проще выкинуть винчестер e2fsck начинает писать, что сектор находится «вне диапазона» и не метит его.

Грязный хак, способный на некоторое время продлить жизнь жесткого диска

Внимание! Никогда, слышите, никогда так не делайте! Начав сыпаться, жесткий диск может крякнуть в любой момент, проще (и дешевле, если у вас на харде что-то кроме котофото из интернетов) купить новый хард. Меня заставили под пытками. Мне пришлось, т.к. HDD был от древнего квадраттера, работающего на линухе, и HDD требовался IDE-шный, который сейчас хрен найдешь (да, для работы я не делюсь своими IDE HDD, я жадный).

Так вот, если битые сектора кучкуются в начале или в конце жесткого диска, то возможно, глюк оттуда не расползется, так что часть с битыми секторами можно просто отрезать и пометить в gparted как unformatted

Но никогда так не делайте. Я предупреждал.